接口与继承
子类与父类
- 如果一个类的声明中没有使用extends关键字,这个类被系统默认为是Object的子类。Object是java.lang包中的类。
Super关键字
-
子类不继承父类的构造方法
-
如果在子类的构造方法中,没有明显地写出super关键字来调用父类的某个构造方法,那么默认地有super()语句,即调用父类的不带参数的构造方法。
注意:当我们在父类中定义多个构造方法时.应当包括一个不带参数的构造方法,以防子类省略super时出现错误
- 子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super
final关键字
- final 类不能被继承,即不能有子类。(final 类)
- 不允许子类重写父类的final方法。(final 方法)
- 成员变量或局部变量被修饰为final的,就是常量。常量在声明时没有默认值,所以在声明常量时必须指定该常量的值,而且不能再发生变化(常量)
对象的上转型对象
A类是B类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,对象a是对象b的上转型对象
- 上转型对象不能操作子类新增的成员变量(失掉了这部分属性)
- 不能调用子类新增的方法(失掉了一些功能)
- 上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类的重写方法
- 上转型对象操作子类继承的方法或子类重写的方法,其作用等价于子类对象去调用这些方法。
A a;
a = new B();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIG9isoV-1588341903535)(https://i.loli.net/2020/05/01/6HQasGFZzTqwn1E.png)]
- 不要将父类创建的对象和子类对象的上转型对象混淆。
- 可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。
- 不可以将父类创建的对象的引用赋值给子类声明的对象
abstract类和abstract方法
-
abstract类中可以有abstract方法
-
如果一个非abstract类是abstract类的子类,它必须重写父类的abstract方法
-
如果一个abstract类是abstract类的子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法
-
abstract类不能用new运算创建对象
-
abstract类的对象作上转型对象
abstract class GirlFriend { //抽象类,封装了两个行为标准 abstract void speak(); abstract void cooking(); } class ChinaGirlFriend extends GirlFriend { void speak(){ System.out.println("你好"); } void cooking(){ System.out.println("水煮鱼"); } } ChinaGirlFriend girl =new ChinaGirlFriend(); GirlFriend girl = new ChinaGirlFriend();//上转型对象
接口
- 接口体中包含static常量和方法定义两部分
interface Printable {
public static final int MAX=100; //等价写法:int MAX=100;
public abstract void add(); //等价写法:void add();
public abstract float sum(float x ,float y); //等价写法:float sum(float x ,float y);
}
- 接口体中的default实例方法
- default的实例方法和通常的普通的方法比就是用关键字default修饰的带方法体的实例方法
interface Printable {
public final int MAX = 100; //等价写法:int MAX=100;
public abstract void add(); //等价写法:void add();
public abstract float sum(float x ,float y);
public default int max(int a,int b) { //default方法
return a>b?a:b;
}
public static void f () {
System.out.println("注意是从Java SE 8开始的");
}
}
接口的实现
- 一个类通过使用关键字 implements 声明自己实现一个或多个接口
- 类实现某接口,但类不拥有接口的static方法。
- Default方法是指,在接口内部包含了一些默认的方法实现
abstract类与接口的比较
- abstract类和接口都可以有abstract方法。
- 接口中只可以有常量,不能有变量;而abstract类中即可以有常量也可以有变量。
- abstract类中也可以非abstract方法,但不可以有default实例方法。接口不可以有非abstract的方法(不是default方法,还带有方法体的方法),但可以有default实例方法。
- 在设计程序时应当根据具体的分析来确定是使用抽象类还是接口。abstract类除了提供重要的需要子类去实现的abstract方法外,也提供了子类可以继承的变量和非abstract方法。如果某个问题需要使用继承才能更好的解决,比如,子类除了需要实现父类的abstract方法,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑用abstract类。如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。