多态的欺骗
程序员文章站
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
推荐阅读
-
creo4.0同一曲面怎么添加两种不同的颜色?
-
快播还能继续使用吗?快播点播技术关闭后的解决办法
-
AE怎么排列图层? ae由上往下排列的教程
-
暴风影音盒子打不开的解决方法
-
重庆分数线最低的本科大学名单汇总(2021年参考)
-
使用Spring Security控制会话的方法
-
Spring Boot报错:No session repository could be auto-configured, check your configuration的解决方法
-
2021年陕西450分理科能上什么大学?陕西450分的二本学校名单
-
2021年河北450分理科能上什么大学?附河北450分的公办二本名单
-
爱思助手工具箱连接不上的原因及解决方法