当前位置: 移动技术网 > IT编程>开发语言>.net > 多态的欺骗

多态的欺骗

2020年07月17日  | 移动技术网IT编程  | 我要评论
多态的难点参考至链接: 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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网