JAVA继承
1.子类所有构造器,会隐式调用父类的无参构造器
原理:
子类所有构造器,都会在第一行隐式调用super()。
问题:
如果父类没有无参构造器,编译报错。
解决:
- 在子类的构造器方法中的第一行指定一个父类带参构造器。
注意:要在第一行调用带参构造器,否则又会自动隐式调用super(), - 或者给父类补上一个无参构造器。
2.final
- 修饰类
被修饰的类无法被继承,而且所有的方法都是final的,注意:域不是final
public final class FatherClass {
}
public class SonClass extends FatherClass{
}
报错:Cannot inherit from final 'com.chen.sss.demo.extendsDemo.FatherClass'
翻译:无法继承一个声明为final的类
- 修饰方法
被修饰的方法无法被重写
//父类方法
public final String getName (){
return name;
}
//子类方法
public String getName(){
}
报错:'getName()' cannot override 'getName()' in 'com.chen.sss.demo.extendsDemo.FatherClass'; overridden method is final
- String举例子
例如String,如果有一个String的引用,它引用的一定是一个String对象。因为String对象声明为final,没有子类。
从而无法实现父类引用指向子类对象,引用只能指向本身的对象。
3.强制类型转换
将一个子类的引用赋值给一个超类变量是允许的。
但将一个超类的引用赋值给一个子类变量,是不允许的。
//允许
FatherClass father = new SonClass();
//不允许
SonClass sonClass = new FatherClass();
转换+检查:
if(father instanceof SonClass){//检查类型
SonClass son = (SonClass) father;//转换
}