this和super以及final
super 和 this 之间的区别:
- this 指代当前创建的对象
- 调用本类其他构造器: 构造器的首行 this(参数列表)
- 区分同名变量问题(局部和成员) this.
- super 指代父类对象
- 调用父类构造器
- 默认调用父类的空构造
- 调用父类的其他构造器需要显示使用 super(参数列表)
- 要使用在构造器的首行
- this和super不同时存在调用构造器使用
- 区分同名变量问题(子类和父类)
- 如果出现,局部,子类成员,父类成员同名问题,调用时候
- 调用局部,直接写
- 调用子类成员,使用this.
- 调用父类成员,使用super.
- 如果不存在同名问题,相当于省略了this.或者super.
- 创建子类对象之前,要先创建父类对象 -->先父类后子类(父类对象在子类对象内存空间中的,外部无法直接操作,只能在子类中通过super使用这个内部的父类对象)
- 初始顺序: 先静态后成员
- final 最终的
- 1.被final修饰的变量为常量
- 变量的数据类型如果是基本数据类型: 存储的数据值不能改变
- 变量的数据类型如果是引用数据类型: 存储对象的地址不能改变,但是对象内存中的属性值可以改变
- 2.被final修饰的方法不能被重写
- 3.被final修饰的类不能被继承(太监类)
- 问: 属性私有了,–>提供getter,setter能够使用么???能不能通过设置器和访问器操作父类中的私有属性
面向对象的三大特性
面向对象的三大特性:
- 封装: 隐藏内部的实现细节,对外提供公共的访问方式
- 继承: 子类一旦继承父类,就有权使用父类中的内容
- 多态: 一种事物的多种形态|多种表现形式
- 多态的前提: 类的继承|接口的实现
- 多态的最终体现:父类的引用指向子类的对象
- 如果子父类中有重写方法,多态调用的是子类中重写的方法
- 注意: 父类引用对子类的新增内容不可见
- 使用多态调用成员:
- 1)成员变量
- 编译运行看父类|看左边|看类型
- 2)成员方法
- 编译看父类,运行看子类
- 编译看左边,运行看右边
- 编译看类型,运行找对象
多态:子类继承父类,重写父类的方法,父类引用指向子类对象
equals方法比较俩个字符串,Object是所有子类的父类,用来代替可能
传入的子类,代表传入的一个引用类型,好处是可以不用写对应的多个
子类的方法,提高代码的复用性.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
重写和重载
- 重写 与 重载 之间的区别: 都是方法的重写和重载
- 重载:
- 同一个类中
- 多个方法,方法名相同
- 参数列表不同|方法签名不同
- 重写:
- 1.不同的类
- 2.继承|实现
- 3.方法签名相同
- 为什么要使用重写:
- 需求: 子类存在从父类中继承的功能,但是子类对功能的实现,与父类不一样,可以对这个功能进行方法的重写
- 如何使用重写方法:
- 子类对象在调用这个功能的使用,如果有重写方法,就调用重写方法,如果重写,就会调用从父类中继承的功能
- 检查是否为重写方法:
- 1)重写方法的左侧存在向上的三角形
- 2)@Override 在方法上添加注解,强制检查,如果不是重写方法就报错
- 注意:
- 私有的内容不能被继承,重写
- 被final修饰的方法不能被重写
- static的内容不能被重写
-
如果子父类中存在方法签名相同的方法,父类中这个方法为static修饰的,子类中的同名方法必须也要被static修饰
tostring和equals方法
1.toString() 把对象的内容以字符串的形式展现
- 源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
- 在打印一个对象的引用的时候,打印对象的地址,默认打印的是这个对象调用了toString 方法的返回值
- 需求: 想要在打印一个自定义的引用数据类型的对象引用时,打印这个对象所有成员属性的值,而非地址
2.equals 方法
- 源码:*
public boolean equals(Object obj) { //Object obj=new Person();
return (this == obj);
}
equals 和 == 之间的区别:
- == 比较引用数据类型的地址值
- equals() 如果使用的Object类中的equals()方法比较的还是对象的地址
- 如果有对equals()方法进行重写,可以实现比较对象的内容
instanceof
转型:
强类型的语言
数据类型转型
java.lang.ClassCastException 类型转换异常
- 为了避免类型转换异常的出现,介绍一个运算符 instanceof
- 引用 instanceof 类型
- 判断前面的引用是否是后面类型的一个对象|他子类对象,如果是返回true,不是返回false
抽象方法抽象类
抽象类: 被abstract修饰的类
- 抽象方法: 被abstract修饰的方法
- 可以没有方法体
- 必须在抽象类中
- 注意:
- 1.抽象类不能被实例化|不能创建对象
- 2.抽象方法要存在与抽象类中,抽象方法必须被重写
- 3.抽象类的使用:
-
具体子类: 重写所有的抽象方法+ 按需新增
-
抽象子类: 按需重写抽象方法 + 按需新增
- 4.一个抽象方法一旦被重写过,就不需要再次被重写啦
- 5.抽象类中可以存在普通方法,可以存在抽象方法
- 6.abstract 不能和private,final,static,native一起使用
- 父类:
- 具体的父类:可以创建父类对象,父类中的内容如何定义
- 抽象的父类:
- 不想要能够直接创建父类对象
- 父类中的方法体不知道如何实现