1.java中支持单继承,不支持多继承,由于可能A同时继承与B,C时,B,C中都有一个同样的方法名,造成A调用这个方法时能明确调用的是B中的还是C中的,但是java支持多实现(接口),改良了这一个小小的缺点
2.this和super区别
this代表的是一个本类对象的引用
super代表一个父类的空间(在用super时根本就没出现过父类对象)
3.覆盖
当子类中的成员函数与父类中的成员函数一模一样(函数名,参数,返回值)会运行子类的函数,称为覆盖操作
覆盖:子类中的成员函数声明与父类一模一样
重载:在同一个类中,函数名相同,参数列表不同(包括顺序不同,但是不要求返回值)
注意事项:
(1)子类方法覆盖父类方法时,子类权限必须大于等于父类的权限,如果父类的方法私有了,子类都继承不来,所以如果子类此时有一个一模一样的,就不叫覆盖
(2)如果这个函数在父类中被静态修饰,只能用静态覆盖静态的方法(如果父类不是)
4.子类实例化过程
(1)子类中所有的构造器都会默认访问父类中的空参数构造函数,就是说子类的构造函数会在第一行隐藏了一行代码super();(目的相当于看看父类都初始化啥了,别父类都初始化了我在初始化发生冲突)
如
class Zi extends Fu{
//super() 自动写上去的这行
coding......
}
(2)如果父类的构造函数没有空参构造函数,此时子类需要顶一个父类构造函数(带参数的那个父类构造函数)
如:
class Zi extends Fu{
super(5);//加入父类的带参构造函数为Fu(int i){}
coding .......
}
注:构造函数没有继承过来,而是通过子类构造函数访问的
(3)子类构造函数中如果使用了this()调用了本类的构造函数时,那么super()在这个构造函数中就没有了,这是因为this和super都要在构造函数的第一行,所以只能有一个,但是在调用this()时,无参的构造函数就会自动调用父类构造函数super()(自动写上去的那个),所以无需在有super()。因此肯定会在子类的构造函数中调用了父类的super()。
(4)具体例子
class Fu{
Fu(){ show();}
public void show(){ syso ("Fu show")}
}
class Zi extends Fu{
private int num = 2;
Zi(){
//super(); 自动写上去的
syso (“ zi cons....... ” + num);
}
public void show(){ syso("zi show ......" + num)}
}
class Test{
public static void main(String[] args){
Zi zi = new Zi();
zi.show();
}
}
输出:
zi show ....... 0
zi cons ....... 2
zi show ....... 2
解释:
JVM首先会先读取指定路径下的zi.class,并加载到内存,如果有父类,先加载Fu.class
在对中开辟空间,分配内存地址
在对象空间中,对对象属性进行默认初始化(Zi 中 num = 0)
调用子类的构造函数进行和初始化,在构造函数中,第一行会先调用父类的构造函数(super()),初始化父类
而super()中调用了show()方法,可是发现子类中也有show方法,也就调用了子类的show方法,而此时num=0,未进行显示初始化呢,所以输出zi show ....... 0
父类初始化完毕后,再对子类的属性进行显示初始化(num = 2),在进行子类构造函数里代码所有指定的初始化,发现里面有一个syso(“zi cons..." + num),所以显示zi cons ..... 2
,初始化完毕后,将地址赋给引用的变量Zi zi,zi在调用show方法,显示 zi show ...... 2
5. 一个project里可以有多个main方法,除了你想要的那个main,其他的main方法可以用作测试,不去掉也无所谓,因为运行时指定运行的是哪个main方法就行,运行一个main方法就启动了一个jvm
6. 组合 和 继承
组合:在一个类中创建另一个类的对象即可
二者区别:
(1).继承是 is - a 关系
组合是 has - a 关系
(2).组合和继承都允许在新的类中放置子对象,组合是显示地这样做,而继承是隐式的地做
(3).组合技术通常用于想在新类中使用现有类的功能而非向外提供它的接口
继承是想使用它现有的接口,比如进行覆盖等操作
7.组合 、 继承 的选择
现在常见的方法都被包装成了类,因此常用组合技术使用现有类开发新的类,而继承已被包装好的类可能性小
但是如何判断使用组合还是继承呢?
问问自己是否需要从新类向基类进行向上转型,如果必须向上转型,继承是必要的,如果不需要,则考虑一下是否需要继承
8.什么时候用覆盖
当一个类进行扩展为子类时,子类需要保留父类方法的声明,但是直接用父类的方法嫌功能太少,座椅还用这个功能的名,但里面内容进行添加子类特有的内容,就可以用覆盖完成。