Java中的方法在继承中的表现

一、对于普通的类(非最终类,抽象类)

可见的属性和方法都能够被继承,我们这里主要讨论方法。

那么什么是可见的方法?

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中,接口中增加了静态方法和默认实现方法,这两中方法可以有方法体。

静态方法在继承(实现)中的表现:

是否可以被继承?  否

为了找这个问题的答案费了很大力气,因为本人的英语也是有点菜,而且关于这个特点的介绍只有短短几个单词!!!

在百十行英文中找这么几个单词也是很难受。。。

链接:

Overriding and Hiding Methods

普通方法(抽象)在继承中的表现:

是否可以被继承? 是    子类必须实现所有的抽象方法,不然该子类就是抽象类

默认实现方法在继承中的表现:

是否可以被继承?   是

但是这里也存在着一个问题:我们都知道接口是可以多实现的,那么如果子类实现的两个接口中,有方法签名相同的默认实现方法,那么继承的是哪一个呢?

首先这种情况会产生编译错误。这时候我们就必须重写同签名方法中的一个,表示使用哪个接口中的方法:

接口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.方法名();表示继承了指定父接口的指定方法。

猜你喜欢

转载自blog.csdn.net/qq_40650532/article/details/85088284