1.封装性
增强安全性和简化编程,使用者不必了解具体的实现细节。
隐藏对象的属性和实现细节,仅对外公开接口来对程序中属性的读和修改。
封装的基本做法: 把所有的属性私有化,对每个属性提供getter和setter方法,在开发的时候经常要对已经编写的类进行测试,所以有的时候还需重写toString方法。
2.继承性
用extends关键字实现继承,主要利于代码的复用。
继承而得到的类称为子类,被继承的类称为父类。子类是父类的扩展,获得父类的全部属性和方法,除了父类中构造方法和private的成员变量和方法。一个类若无指定父类则默认继承于Object。
父类普通方法:使用override重写,若是抽象方法,子类必须全部实现他们,否则就得声明自己为抽象类。
父类构造方法:这个是不能继承的,其实它是被子类构造方法隐士调用的。生成子类对象时,会默认先调用父类不带参数的构造方法生成父类对象(若无就在子类构造方法中用super显示调用有参构造方法),再调用子类构造方法才生成子类对象。
只能单继承,因为如果继承了A和B,若他们有同名的方法你就不知道要调用哪一个了,但我们可以使用接口实现多重继承,因为接口里面的方法都是抽象的,没有实现,所以随便调哪个都无所谓了。
interface A{}
interface B{}
interface C extends A,B{}
class C1 implements C{}
3.多态性
在程序中定义的某个引用变量具体所指向的类型和调用的方法在编码时并不能确定,而只有在运行的时候才能确定。这样能屏蔽不同子类对象之间的差异,写出通用的代码以适应需求的不断变化。
- 编译时多态:重载
- 运行时多态:继承 重写
简单说多态就是单继承多实现,使用父类引用指向子类对象,再调用某一父类中的方法时,不同子类会表现出不同结果,保证了扩展性。他还具有可替代性,简化性。
这里需要注意的是,假设Apple为Fruit子类,Fruit f=new Apple();
父类引用子类对象时调用谁的成员方法由被引用对象的类型(Apple)决定,而不是引用变量的类型(Fruit)决定,但是这个方法必须是父类中定义过的,这样才会调用子类中的方法,若不是重写的方法,就会向上找,优先级如下:(重点)
this.X(obj)—>super.X(obj)—>this.X(super(obj))—>super.X(super(obj))
想必大家对此还比较模糊吧,说个例子就行了。
class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{}
class D extends B{}
题目
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(b.show(b)); ⑦
System.out.println(b.show(c)); ⑧
System.out.println(b.show(d)); ⑨
答案
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D
我就出了了几个绕一点的,a2.show(b),因为a2是父类引用指向子类的,按刚才说的优先级来解释,这里this代表A,先this.show(B)没有这个方法,则super.show(B),A没有父类,则this.show(super(B)),有了,于是输出A and A,一看不对,其实是这样的,我前面加粗了一句话,再仔细品味下吧,这里父类有的方法子类重写了,所以我得调用B的show(A),输出B and A