JAVA程序设计——类、对象、方法、构造方法
以后每周六晚更新一周java学习内容及重点:
目录
类与对象
嗯..这个东西确实有点难懂,如果缺乏C++的经验,这东西可能会绕晕。
不过,功夫是不会负有心人的.
一、概念性问题(以下不是定义,个人理解)
1.对象:具体事物
2.类:具有某种共同特征的事物的集合
举个栗子:
把猫抽象成一个类:
在这一类中:找到共同特征——猫的种类?猫的颜色?猫的名字?
之后,一旦后三者确定一个对象就产生了——狸猫(种类)白色(颜色)名字(CoolGuang)
所以可见两者的关系——对象是类的具体体现。
3.方法:指的是在类*有的一些行为
比如在猫类中,猫可以睡觉可以吃饭可以打麻将。
在类中定义一个方法(类比C中的函数),使用这个方法就可以让猫去做一些特定的事情。
4.属性:类比C中的变量——拥有的特征
二、类的定义
1.类的定义分为两部分:类方法与类声明
[public|private|protected|abstract|final] + class + 类名 构成一个类的表头
前面[]内的内容为class的修饰符 ——根据英文名称可以推出 共有 私有 受保护的 抽象的 和 终定义 的概念
前面修饰符的一些表述:
2.类修饰符的权限说明
(1)privte:私有。只有在类的主体中才可访问。该关键字只能修饰属性和方法,不能修饰类。
(2)protected:受保护。该类及其子类的成员均可以访问,同一个包中的类也可以访问。该关键字只能修饰修饰属性和方法,不能修饰类。
(3)public:公共。该类或非该类均可访问。
(4)默认:不使用修饰符。只有相同包中的类可以访问。
1.private:
首先注意只能修饰属性和方法
否则会提示上述错误,即类只能由public , abstract , final 去修饰
只有在类的主体中才能访问:
首先在同一个包内,定义一个Dog类:
下面在同一个包内,构造一个对象去访问这个类:
此时的输出结果:
CoolGuang:I am eating!
但是如果将其中一个public变量的权限改为pricate,运行结果:
显而易见:同一包内的访问被private限制了——同一包内不同类不能访问
与此,测一下不同类中是否可以相互访问:
同样的,报错显示了:
之后把private改为public之后,访问成功并输出结果。
所以private测试完毕:
1.同一包下,不同类不可访问
2.互不相同的子类中,也无法互相访问。
2.public
这一类权限不用多解释,有点最高权限的意思,所有均可访问。
3.protected
首先,与private一样只能修饰属性与方法。
其次看一下权限问题:
首先将上述private的测试拿来,将private改为protected之后,可以发现没有编译报错,说明可以访问——可以访问被同类中的其他子类访问 。
之后继续测一下,同一包下的访问,测试说明,同一包下的访问也是可以的。
什么时候不可以访问呢——在不同包下的其他类中不可访问
3.类的方法定义
一般来说可以通过类比C中的函数。
1.简要说明
方法类比C中的函数,但定义有所不同。
除了返回类型+函数名外,加了权限的设置——以上描述的权限设置,如果在返回类型之前加入权限,那么这个函数的访问权限(或者这个方法的使用权限)就会发生改变。
2.例子
例如:(一个计算器的类):
上述运行结果即为5。
可见上述定义Getsum这个方法时,没有加任何修饰符——默认权限,默认权限是friendly的权限,这类权限在同一包下是可以相互访问,所以没有编译报错。
下面将Getsum方法之前,增加private修饰符:
此时,在主类中调用Getsum这个方法时会发现,提示错误的意思是 方法在本类中不可见——验证了private的权限。
3.方法对于函数成员的使用
测试一下一些关于变量的问题:
首先将上述定义与使用换一下顺序,发现并没有报错,并且可以运行成功——顺序不影响方法调用本类中的变量
运行上述程序,发现代码不是的结果不是z=3,而是z=6,说明本类调用中采取就近原则调用。
将int z = 6这行代码去掉之后,发现程序结果输出为z=3:
之后在考虑一个问题,顺序影不影响方法调用内部变量?
运行该程序,发现结果为z=3,那么说明 方法内部调用与定义是分先后顺序的 。
4.类的重载与类的构造方法
1.类的重载
类的重载是什么意思呢?简单理解一下就是一个方法可以因为某一个变量不同而改变。
看一下例子:
可以看到,定义了两个Getarea函数,在C++中这样定义是不允许的,为什么在Java中可行呢?发现两个函数的参数个数不同,一个为一个另一个为两个。
运行结果为:
很明显:系统对这两个方法调用的时候进行了明确的区分——也就是说过程中发生了重载。
为什么会发生重载?因为参数个数不同使得系统知道该调用哪个Getarea形式的函数。
系统如何知道?因为两个函数的参数有明确的不同——一个参数和两个参数,所以系统会根据你传参的个数分别去调用一些函数。
那么什么情况会发生重载?
就是这种当函数区分度足够的时候,系统就会自动发生重载。
比如:参数个数不同,参数类型不同,返回值不同
Note:参数类型不同的时候,int与long long这种是无法发生重载的(区分度不够)
2. 类的构造方法
什么是构造方法?意思即为当你创建这个类的对象时,对象内的初始化操作。
构造方法与方法在形式上是一样的,不过构造方法是没有返回值的。
之前的操作,都是对类中的成员变量首先赋值,当没有赋值而是根据你意愿来时,这时候就需要构造方法:
可以看到此时,Cat类中的name与activity都没有事先声明变量的值是多少, 但是输出结果却为:
这就说明name与activitiy被赋值了,通过什么赋值的呢,就是构造方法赋值。
同样的,构造方法也支持重载:
以上的输出的结果即为:
可以看到构造方法被重载了——有助于对象的实例化