[Java]子类不继承父类私有方法

版权声明:本文为博主原创文章,转载请申明出处,感谢。 https://blog.csdn.net/shichimiyasatone/article/details/85268390

子类不继承父类私有的方法, 更无法重写父类私有的方法。

关于子类是否继承父类私有的方法和属性这个问题,有看到回答继承的,也有看到回答不继承的。一直找不到一个合适的方法测试,所以只能是相信书上说的“获得基类中所有的域和方法”,甚至一度认为子类会继承父类的构造方法。

组合的语法比较平实,但是继承使用的是一种特殊的语法。在继承过程中,需要先声明“新类与旧类相似”。这种声明是通过在类主体的左边花括号之前,书写后面紧随基类名称的关键字extends而实现的。当这么做时,会自动得到基类中所有的域和方法

                                                                                                                                                         ——《Java编程思想》P127

今天在看静态绑定和动态绑定时,发现private修饰的方法是静态绑定的,在类被加载时就已经确定了方法所指向的代码块。如果子类能继承父类私有的方法,那么应该也能重写父类的方法。再使用多态,实例化子类对象赋值给父类类型变量,通过父类类型变量调用父类私有方法,执行的会是子类重写完的方法吗?如果执行的是重写后的方法,这不就变成动态绑定了吗?

尝试还原上面出现矛盾的情况:

  • 父类A需要有一个私有的方法aa(),在main函数中能调用到,所以main函数在父类中;
  • 子类B继承父类A,因为aa()是A私有的,为保证B有权限访问aa()方法,B必须在A类中定义,B为A的内部类;
  • 子类B重写父类aa()方法,在main中使用多态尝试以父类类型变量a调用重写完的方法。

测试代码:

public class A {
	class B extends A{
		private void aa() {
			System.out.println("bb");
		}
	}
	private void aa() {
		System.out.println("aa");
	}
	public static void main(String[] args) {
		A a = new A();
		a.aa();
		A.B b = a.new B();
		b.aa();
		A aa = a.new B();
		aa.aa();
	}
}

输出:

代码编译成功,结果看上去既有方法重写(第二个输出“bb”),又有静态绑定(第三个输出“aa”)。实际上呢?给B中看似是在重写的方法上加个@Override注释,发现IDE报错“The method aa() of type A.B must override or implement a supertype method”

原因很简单,类B压根没有在重写父类的方法,而是自己定义了个名叫aa的方法。那看似动态绑定的输出其实就是B类对象b执行了一个自己定义的aa()方法而已,与父类没有关系。

目前尚未找到验证子类不继承父类私有属性的代码,也尚未找到验证子类继承父类私有方法的代码。

猜你喜欢

转载自blog.csdn.net/shichimiyasatone/article/details/85268390