一、对于普通的类(非最终类,抽象类)
可见的属性和方法都能够被继承,我们这里主要讨论方法。
那么什么是可见的方法?
1.private修饰的方法肯定是不可见的,私有方法只能在本类中进行访问。
2.无修饰符(默认权限),本包的类可以访问,包外的类不可访问。就是说一个类继承了包外的一个类,那么对于父类的默认权限的方法,它是继承不到的。
3.protected修饰的方法,本包下的类可以访问,包外的子类也能访问。
4.public修饰的方法,所有类可以访问。
普通成员方法在继承中的表现:
1.是否可以被继承? 是
2.重写的结果? 覆盖
父类:
public class Father {
// doSomething
public void doSomething() {
System.out.println("fathers do something.");
}
}
子类:
public class Son extends Father {
@Override
public void doSomething() {
System.out.println("sons do something.");
}
}
测试类:
public class TestMethodIninheritance {
public static void main(String[] args) {
Father f = new Son();
f.doSomething();
}
}
结果是:
被调用的被重写实例方法的版本是子类中的版本。
静态成员方法在继承中的表现:
1.是否可以被继承? 是
2.重写的结果? 隐藏 好像不能叫重写,因为加了Override注解就报错。不过这里父类的方法确实不是覆盖掉了
父类:
public class Father {
// doSomething
public static void doSomething() {
System.out.println("fathers do something.");
}
}
子类:
public class Son extends Father {
public static void doSomething() {
System.out.println("sons do something.");
}
}
测试类:
public class TestMethodIninheritance {
public static void main(String[] args) {
Father f = new Son();
f.doSomething(); // 不建议这样调用静态方法
}
}
结果是:
被调用的隐藏静态方法的版本取决于它是从超类还是子类调用的。
静态方法是和它的类相关联的方法,而不是与任何对象相关联的方法。
二、对于接口
接口中的变量都是常量,接口中的方法都是抽象方法。
在java8中,接口中增加了静态方法和默认实现方法,这两中方法可以有方法体。
静态方法在继承(实现)中的表现:
是否可以被继承? 否
为了找这个问题的答案费了很大力气,因为本人的英语也是有点菜,而且关于这个特点的介绍只有短短几个单词!!!
在百十行英文中找这么几个单词也是很难受。。。
链接:
普通方法(抽象)在继承中的表现:
是否可以被继承? 是 子类必须实现所有的抽象方法,不然该子类就是抽象类
默认实现方法在继承中的表现:
是否可以被继承? 是
但是这里也存在着一个问题:我们都知道接口是可以多实现的,那么如果子类实现的两个接口中,有方法签名相同的默认实现方法,那么继承的是哪一个呢?
首先这种情况会产生编译错误。这时候我们就必须重写同签名方法中的一个,表示使用哪个接口中的方法:
接口1:Animal
public interface Animal {
// 默认实现喝水方法
default void drink() {
System.out.println("drink water.");
}
}
接口2:Human
public interface Human {
default void drink() {
System.out.println("drink boiled water.");
}
}
实现类:Man
public class Man implements Animal, Human {
@Override
public void drink() {
Animal.super.drink();
}
}
我们可以通过这种方式:类名.super.方法名();表示继承了指定父接口的指定方法。