面向对象、多态
一、Object
是java中所有类的父类
在java中的所有类都会直接或者间接的继承自Object类
1、toString
把对象数据以字符串的形式表示
直接打印一个对象的引用的时候,默认打印的是调用toString()方法的返回值
需求: 在打印一个javabean类型对象的引用的时候,其实是想要了解这个对象的基本信息->成员变量的值
解决: 在子类中重写toString方法,因为打印对象引用时候默认会调用toString(),toString功能需要,实现不满意,就重写
class User{
String name;
String password;
@Override
public String toString() {
return "User{" + "name='" + name + '\'' + ", password='" + password + '\'' + '}';
}
}
2、equals
== 可以比较所有数据类型的数据,基本数据类型->数据值 引用数据类型->比较对象地址
equals 只能比较引用数据类型的数据
比较两个数据是否相等 对象1.equals(对象2)
Object类中equals方法的实现-->默认比较对象的地址,可以通过重写equals方法实现比较对象的内容
需求: 比较两个引用数据类型对象的时候,想要比较两个对象的所有成员变量的值是否都相等,而非比较对象地址
解决: 子类中重写equals方法,实现比较对象内容非地址
class User{
String name;
String password;
@Override
public boolean equals(Object u){
if(this==u) return true;
if(u instanceof User)
return this.name.equals(((User)u).name)&&this.password.equals(((User)u).password);
return false;
}
}
二、多态
多态的最终体现:父类引用指向子类对象
1、多态介绍
前提:
继承关系
实现关系
调用多态方法时,会使用子类的重写方法
(多态与重写一起使用,没有重写多态就没有意义)
多态方法的不同说法:
编译看父类,运行找子类
编译看左边,运行找右边
编译看类型,运行找对象
多态引用对·子类新增内容不可见
多态的好处:
解耦 灵活性
便于后期维护
2、转型
基本数据类型 :
自动类型提升 : 小-->大
int i = 'a';
强制类型转换 : 大-->小
byte b = (byte)i;
转型:
引用数据类型:
父类->大
子类->小
向上转型: 小->大
Person p = new Student();
向下转型: 大->小
Student s = (Student)p;
通过多态的引用调用子类中新增内容的时候,需要向下转型
三、abstract
被abstract修饰的类为抽象类,不可实例化
被abstract修饰的方法为抽象方法,不重写无法使用
1.抽象类中可以存在具体方法,可以存在抽象方法
可以存在成员变量.构造器
2.抽象类不能实例化,(不能创建对象)
3.一个抽象方法必须被重写,重写可以为抽象方法定义方法体
4.抽象类的使用:通过具体子类的对象使用
具体的子类:重写了父类的抽象方法
抽象的子类:没有重写父类的抽象方法
5.一个抽象方法一旦被重写,后续是否需要重写根据需求而定.