JavaSE学习【Day 12】
今天主要学习了面向对象的多态,大家观看后有什么疑问或好的建议可以评论区留言,谢谢!
面向对象
Object类
又称老祖宗类,是java中的所有类的父类
在Java中的所有类都会直接或间接的继承自Object类
toString()
把对象数据以字符串的形式表示
直接打印一个对象的引用的时候,默认打印的是调用toString()方法的返回值
需求:
在打印一个javabean类型对象的引用的时候,其实是想要了解这个对象的基本信息->成员变量的值
解决:
在子类中重写toString方法,因为打印对象引用时候默认会调用toString(),toString功能需要,实现不满意,就重写
子父类继承关系下,toString方法的重写:
class Animal{
private String type;
private String name;
//重写toString()
@Override
public String toString() {
return "Animal{" +
"type='" + type + '\'' +
", name='" + name + '\'' +
'}';
}
}
class Cat extends Animal{
}
equals()
比较引用数据类型的数据
== 与 equals:
==:可以比较所有数据类型的数据,基本数据类型比较数据值,引用数据类型比较对象的地址
equals:只能比较引用数据类型的数据
比较两个数据是否相等:
对象1.equals.(对象2);
Object类中equals方法的实现:
默认比较对象的地址,可以通过重写equals方法实现比较对象的内容
需求:
比较两个引用数据类型对象的时候,想要比较两个对象的所有成员变量的值是否都相等,而非比较对象地址
解决:
子类中重写equals方法,实现比较对象内容非地址
equals方法的重写:
class Animal{
}
class Cat extends Animal{
private String type;
private String name;
//重写equals()
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Cat cat = (Cat) o;
return Objects.equals(type, cat.type) &&
Objects.equals(name, cat.name);
}
}
多态
面向对象的三大特性之一
多态:多种形态->多种表现形式
多态的最终体现:
父类的引用指向子类的对象
前提:
继承关系
实现关系
使用:
当多态调用的时候,会调用子类中的重写方法
多态调用成员的特征:
成员变量:编译运行看父类
成员方法:编译看父类,运行看子类
多态又叫行为的多态,行为的不同实现方式
多态要配合方法的重写才有意义
多态引用对子类内容不可见
多态的好处:
解耦
灵活性高
便于后期维护
例:
public class Class01_Test {
public static void main(String[] args) {
//多态:父类引用指向子类对象
Animal animal = new Cat();
animal.shout();
}
}
class Animal{
public void shout(){
System.out.println("我会叫!!!");
}
}
class Cat extends Animal{
public void shout(){
System.out.println("喵喵叫!!!");
}
}
转型
引用变量只能调用它编译类型的方法,不能调用它运行类型的方法。
向上转型:
子类的对象可以当作父类的对象来使用
向下转型:
父类的对象可以当作子类的对象来使用
通过多态的引用调用子类中新增内容的时候,需要向下转型
注意:
向下转型时候,如果类型不注意,就有可能出现ClassCastException类型转换异常
instaceof 运算符
引用 instaceof 类型
判断前面的引用是否是指向后面类型的对象|子类对象->是true|否false
抽象类(abstract)
抽象类与抽象方法:
抽象方法:被abstract修饰的方法
没有方法体
要求定义在抽象类中
抽象类:被abstract修饰的类
抽象类的特点
1、抽象类可以存在具体方法,可以存在抽象方法,可以存在成员变量、构造器
2、抽象类不能实例化(不能创建对象)
3、一个抽象方法必须被重写,重写可以为抽方法定义方法体
4、抽象类的使用:通过具体子类的对象使用
具体的子类:抽象了所有抽象方法+按需新增
抽象的子类:按需重写抽象方法+按需新增5、一个抽象方法一旦被重写,后续是否需要重写根据实现
6、abstract关键字不能跟private,final,static,native一起使用
例:
abstract class Animal{
abstract void shout();
}
class Cat extends Animal{
@Override
public void shout(){
System.out.println("喵喵叫!!!");
}
}
//或
abstract class Animal{
abstract void shout();
}
abstract class Cat extends Animal{
@Override
public void shout(){
System.out.println("喵喵叫!!!");
}
}
class Dog extends Animal{
@Override
public void shout(){
System.out.println("汪汪叫!!!");
}
}