欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

多态的欺骗

程序员文章站 2022-07-10 21:26:30
多态的难点参考至链接: https://blog.csdn.net/qq_21808961/article/details/78309180.多态存在的三个必要条件:要有继承、要有重写、父类变量引用子类对象。如果父类的引用p指向了子类的实例,则通过这个引用p访问同名方法时,调用的是子类重写的方法。父类引用p可以指向不同的子类,调用不同子类重写的不同的同名方法,进而达到类间多态的效果。但是,父类的引用只能访问子类重写的方法,父类中没有的方法,父类的引用不能访问。也就是说,通过父类的引用来调用子类的方...

多态的难点

参考至链接: https://blog.csdn.net/qq_21808961/article/details/78309180.

多态存在的三个必要条件:要有继承、要有重写、父类变量引用子类对象。
如果父类的引用p指向了子类的实例,则通过这个引用p访问同名方法时,调用的是子类重写的方法。
父类引用p可以指向不同的子类,调用不同子类重写的不同的同名方法,进而达到类间多态的效果。
但是,父类的引用只能访问子类重写的方法,父类中没有的方法,父类的引用不能访问。也就是说,通过父类的引用来调用子类的方法时,不能访问到子类后来自己定义的方法。

看看下面的代码,不是说父类引用可以调用子类同名的方法吗?咋们试试

public class Parent {
	// 成员变量
	public String publicString = "父类 public修饰的成员变量";
	// 成员变量
	private String privateString = "父类 private修饰的成员变量";
	// 静态变量
	public static String staticString = "父类public static修饰的静态变量";

	// 成员方法
	public void method1() {
		System.out.println("父类public修饰的成员方法");
	}

	// 静态方法
	public static void method2() {
		System.out.println("父类public static修饰的成员方法");
	}

}
public class Child extends Parent {
	// 成员变量
	public String publicString = "子类public修饰的成员变量";
	// 成员变量
	public String childString = "子类public修饰的成员变量";

	//子类重写父类的方法
	@Override
	public void method1() {
		System.out.println("子类public修饰的成员方法");
	}
	// 与父类重名的静态方法
	public static void method2() {
		System.out.println("子类public static修饰的成员方法");
	}

}

public class Test {

	public static void main(String[] args) {
		Parent p=new Child();
		//父类 public修饰的成员变量
	    System.out.println(p.publicString);
	    //父类public static修饰的静态变量
	    System.out.println(p.staticString);//该写法不提倡

	    //error code 父类无childString变量
	    //System.out.println(p.childString);
	    //error code 父类的privateString是私有的
	    //System.out.println(p.privateString); 
	    
	    //子类public修饰的成员方法
	    p.method1();
	    //父类public static修饰的成员方法
	    p.method2();//该写法不提倡
	
	}
}
子类public修饰的成员方法
父类public static修饰的成员方法

为什么会出现这种情况呢?
首先我们看看第一个输出--------子类public修饰的成员方法
因为儿子重写了父亲的方法,加强了父亲方法的功能给自己使用,作为父亲(老子),是可以有资格调用儿子的重写的增强版方法的。

第二个输出又是怎么回事呢?
因为方法是 static 修饰,是属于类本身的,而不属于类的实例,p 声明为父亲的引用,调用的 p 的 static 方法自然也就调用父亲的 static 方法

嗯嗯~~~~~暂时就到这里吧

本文地址:https://blog.csdn.net/qq_42224683/article/details/107348518