单根继承
Java的类是单根继承
这是啥意思呢,看一个例子:
public class handsome {
String name;
public void sayMyName() {
System.out.println("我叫" + name + "我很帅");
}
}
我们声明一个handsome类,其实上面的写法和这个是一样的
public class handsome extends Object {
String name;
public void sayMyName() {
System.out.println("我叫" + name + "我很帅");
}
}
当你再Java中声明一个类是时候,哪怕你什么都不写它也隐式的继承了Object并且它一次只能继承一个类,如果它继承了
public class handsome extends Chinese, Australian{
String name;
public void sayMyName() {
System.out.println("我叫" + name + "我很帅");
}
}
比如这样又继承Chinese又继承Australian的handsome类在Java世界是不能创建的
多重继承可以用默认接口来实现,我现在也不知道这是啥,后面再看吧.
类的结构与初始化顺序
假设Chinese这个类有name属性,但是没有sayMyName这个方法,
用上面那个例子,我们来合并一下代码:
public class handsome extends Chinese{
public handsome(){
super(name)
}
public void sayMyName() {
System.out.println("我叫" + name + "我很帅");
}
}
我们在handsome的构造器中调用了super,super会帮我们调用父类的构造器
那么当我们实例化一个继承了父类的子类时初始化的顺序是什么样的呢?
初始化顺序自顶向下(老祖宗会最先被创建):
- 初始化数据
- 执行父类初始化块
- 执行父类的constructor
- 然后再执行子类的初始化
方法覆盖(Override)
这次我们假设Chinese这个类有sayMyName这个方法,现在我们要覆盖父类的这个方法应该怎么办呢?
public class handsome extends Chinese{
public handsome(){
super(name)
}
@Override
public void sayMyName() {
System.out.println("我叫" + name + "我很帅");
}
}
我们可以这样重写这个方法
向上/向下转型
一个子类的类型的对象一定是一个父类类型的对象
(特例:null不是任何类型的对象)
当需要一个父类类型的值时,总是传一个子类类型
所有的子类都是父类的实例
必须进行转型的情况:
子类转父类是安全的
父类转子类是不安全的要进行强制类型转换