转型:
- 孔子装爹
- 孔子{name=孔子;age=18; void teach(){讲论语…} void play(){打王者}}
- 孔子{name=孔子爹;age=30; void teach(){做生意…}}
- 有一个人来找孔子爹讲做生意上课,但是孔子爹去旅行
- 办法: 孔子化妆装成他爹的样子去上课 --向上转型
-
KongZiDie k=new KongZi();
-
因为真实去的是孔子,所以teach讲课讲的内容是论语
- 因为孔子和同学们关系很好,索引相约一起打王者
- 卸妆–>变成孔子的样子,因为孔子会打王者
-
大范围类型 :父类 小范围类型: 子类
-
KongZi z=(KongZi)k; --向下转型
-
z.play();
- 如果先要调用子类中新增的方法,需要向下转型
- ClassCastException 类型转换异常
- instanceof 运算符
-
A引用 instanceof B
-
判断A的引用是否为B类类型的对象,或者B类子类的对象,如果是返回true,否则返回false
- 面向对象:
-
思想
-
封装:对外隐藏内部的实现细节,提供公共的访问方式
-
继承:子类继承父类,就可以拥有父类中的成员
-
多态:在继承的前提下和方法重写的前提下,可以提高代码的服用型和扩展性
Object 所有类的父类(老祖宗类)
-
在java中的所有类都会直接或者间接的继承自Object
-
toString: 打印一个对象的引用,默认调用这个对象的toString()方法
-
目的: 打印对象的信息的字符串表示形式
-
类中重写toString方法,自定义方法体的实现
-
==比较地址
-
equals : 可以比较对象的内容是否相同
-
public boolean equals(Object obj) { return (this == obj); }
equals在Object中默认比较的还是对象的地址
练习:重写equals,比较两个User用户的姓名和年龄,如果两个用户的姓名和年两全部相同才是真的相同
思路:1.自定义User类,重写toString equals()–>比较的是姓名和年龄
多态使用成员 -
成员变量:
-
编译运行找父类
-
编译运行看左边
-
成员方法:
-
编译看父类,运行看子类
-
编译看左边,运行找右边
-
编译看类型,运行找对象
多态 面向对象三大特性之一
- 一种事物多种形态|多种表现形式
- 多态的前提:
- 类的继承 | 接口的实现
- 多态的最终体现:
- 父类的引用指向子类的对象
- 多态的目的:
- 父类的引用在调用子父类中同名方法的时候,会调用子类中重写的方法
- 注意:子类中新增的方法对父类不可见
重写equals,比较两个User用户的姓名和年龄,如果两个用户的姓名和年两全部相同才是真的相同
思路:1.自定义User类,重写toString equals()–>比较的是姓名和年龄
super:指代父类对象 - this: 指代当前创建对象
-
- 用在构造器的首行可以掉用父类中的构造器
-
super(参数)-->匹配父类中构造器的参数
-
如果没有显示定义,默认在子类构造器的首行存在super(),默认调用父类的空构造
-
- 区分子父类同名问题
-
如果存在同名问题,默认隐藏this,默认就近原则找当前子类中的,如果想要指定父类中,要使用super调用
- 注意:
-
先父类后子类
-
不能显示同时定义this()和super(),因为都要存在于构造器的首行,但是可以隐式同时使用,默认调用父类空构造,显示调用子类其他构造器
-
就近找局部,然后如果同时存在局部,子类成员,父类成员同名问题,默认找局部,子类成员this,父类成员super
- final 最终的
- 被final修饰的变量为常量,不能改变
- 被final修饰的方法,不能被重写
- 被final修饰的类不能被继承(太监类)