Java多态的本质
2024-10-07 19:20:42
今天复习了java多态,感觉收获颇多。多态的实现方式有两种,继承父类和实现接口。本质体现在重写上,不同的类重写时体现出不同的特征。编译时和运行时的不同上。编译时只能调用父类的方法,如果调用了子类独有的方法,如果是在notepad++上不会报错,但是javac时会编译错误。运行时可以调用父类的方法,如果子类中有和父类方法重名的方法,优先执行子类重写的方法除非调用super,只要编译时为父类了,就不能访问子类独有的方法。如果要访问子类独有的方法,要进行向下转型。
向下转型只能强制转换,子类引用变量指向父类实例,如果父类实例不是同一个子类向上转型得到的,在编译时不会报错,但在运行时会报java.lang.ClassCastException。所以向下转型只有在向上转型后才能用。
向上转型时,父类引用变量指向子类实例,这时可以调用子类中重写父类的方法,但不能调用子类独有的方法,否则在编译时就会报错。
方法中的成员变量不具备多态性,因为变量不会被重写,在编译时有两块存储堆内存,并取决于编译时所声明变量类型。和运行时对象的变量不是一块内存区域。简洁得来说,不能重写就没法表现出多态。
下面两道小练习
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println("(1)" + a1.show(b));
System.out.println("(2)" + a2.show(d));
System.out.println("(3)" + b.show(c));
System.out.println("(4)" + b.show(d));
}
class A{
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return "A and A";
}
}
class B extends A{
public String show(B obj){
return "B and B";
}
public String show(A obj){
return "B and A";
}
}
class C extends B{ }
class D extends B{ }
结果如下:
(1)A and A
(2)A and D
(3)B and B
(4)A and D
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println("(1)" + a1.show(b));
System.out.println("(2)" + a2.show(d));
System.out.println("(3)" + b.show(c));
System.out.println("(4)" + b.show(d));
}
} class A {
public String show(C obj) {
return ("A and C");
} public String show(A obj) {
return "A and A";
}
} class B extends A {
public String show(B obj) {
return "B and B";
} public String show(A obj) {
return "B and A";
}
} class C extends B { } class D extends B { }
结果如下:
(1)A and A
(2)B and A
(3)A and C
(4)B and B
还有一点,属性是没有多态性的,因为属性不会被重写
public class Test03 {
public static void main(String[] args) {
Base b1 = new Base();
Base b2 = new Sub();
}
} class Base {
Base() {
method(100);
} public void method(int i) {
System.out.println("base : " + i);
}
} class Sub extends Base {
Sub() {
super.method(70);
} public void method(int j) {
System.out.println("sub : " + j);
}
}
运行结果:
base : 100
sub : 100
base : 70
最新文章
- Python Socket 编程——聊天室示例程序
- JS对象复制
- Session失效之 IE iframe cookie问题(p3p)
- nodejs安装及环境配置(windows系统)
- 解决windows 10关机自动重启的问题
- iOS viewDidAppear 和 viewWillAppear
- 用python3统计代码行数
- MySQL数据库web维护客户端管理工具
- 2015 多校联赛 ——HDU5319(模拟)
- js动态加载js css文件,可以配置文件后辍,防止浏览器缓存
- 查询拼接SQL语句,多条件模糊查询
- Django Windows环境下部署
- 转载:UML学习(二)-----类图(silent)
- linux 3.10 tcp的accept测试
- Spring下面的classpath 和 classpath* 区别的简单讲解
- dapper支持操作函数和事物
- 关于layer.photos即照片显示的问题。
- php中正则表达式的语法规则
- Mac和 iOS 下的对称和非对称加密算法的使用
- 思维导图_Python_内置函数
热门文章
- RFC6241 NETCONF
- Java核心基础知识(一):概念、语法、使用、源码
- 力扣算法——141LinkedListCycel【E】
- leetcode python丑数
- datepicker时间选择弹窗
- (1.3)学习笔记之mysql体系结构(C/S整体架构、内存结构、物理存储结构、逻辑结构)
- Emacs 25.1 error solved: url-http-create-request: Multibyte text in HTTP request
- 如何安装python运行环境Anaconda
- 树莓派4B更换国内源
- js中三元运算符的两种情况