第四天
1:方法的重写:overriding
使用:当父类中的方法不能满足子类的需要。
方法的重写又称方法的覆盖,一般用于子类根据需要可以对父类中的方法进行重新编写
重写的前提是:必须在继承体系下,也就是必须存在继承关系
重载的前提是:同一个类中
1:方法重写的原则
1、方法名必须相同
2、参数列表必须相同
3、返回值类型相同或者是其子类
4、访问权限相同或不能严于父类
注意:
- 一般不会去改变返回值和访问权限
- 父类的私有方法不能被重写,重写的是可以被继承的方法
- 一般情况下,重写都是会存在一模一样的方法仅仅是方法体不一样。
- 只能重写继承来的方法
2:方法重写和重载的区别
重载:同类同名不同参,与其他无关(同一个类中,方法名,参数列表不同--个数不同,类型不同,顺序不同)
重写:在子类和父类中存在,同名同参同返回值同访问修饰符的方法(返回值可以是其子类,访问修饰符不能比父类更严格)
简单来说就是一模一样。
2:object介绍
Object类是所有类的父类;
Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
Object中常用方法介绍:
类的内容:一般的实体类中都必须包含以下内容:有参构造,无参构造,getset方法,toString() ;
1:toString
toString()方法,它用于返回标识对象值的字符串。该方法在打印对象时被调用,将对象信息变为字符串返回,默认输出对象地址。
随处可见toString()的主要原因是:只要对象与一个字符串通过操作符“+”连接起来,java编译器就会自动地调用toString方法,以便获得这个对象的字符串描述。
一个字符串和另外一种类型连接的时候,另外一种类型会自动转换成String类型,然后再和字符串连接。基础的数据类型int,float,double转换成字符串比较简单,按照它们的数字转换过来就成了,可是引用类型呢?Person p = new Person();一个字符串加上这个p,你就不知道要怎么把这个p转换成字符串了,因为这个p是一个引用类型。
如果没有重写toString方法,那么输出来的默认的字符串内容是“类名+@+哈希编码”
任何一个类都是从Object类继承下来的,因此在任何一个类里面都可以重写这个toString()方法。toString()方法的作用是当一个引用对象和字符串作连接的时候,或者是直接打印这个引用对象的时侯,这个引用对象都会自动调用toString()方法,通过这个方法返回一个表示引用对象自己正常信息的字符串,而这个字符串的内容由我们自己去定义,默认的字符串内容是“类名+哈希编码”。因此我们可以通过在类里面重写toString()方法,把默认的字符串内容改成我们自己想要表达的正常信息的字符串内容。
重写toString方法
2:equals
Objec的equals方法 定义为:x.equals(y),当x和y是同一个对象时返回true,否则返回false.
==比较的是简单数据类型,直接比较值。如1==2
如果使用Object中的equals方法,底层其实仍然在使用==比较,比较对象的时候,其实比较的是两个对象的内存的地址
3:多态
1:什么是多态
Pet p = new Dog(); // p 就是引用变量
在java中多态的体现? --- 》 所谓多态,就是指一个引用变量在不同的情况下的多种表现状态。也可以理解为,多态是指通过指向父类的引用变量,来调用在不同子类中实现的方法。
注意:方法重写是实现多态的基础
2:多态的运用
一般用于继承体系下,子类重写父类的某个方法,调用时根据具体的子类实现去调用子类的方法
3:抽象方法介绍
如果父类中有一个方法,每一个子类都有不同的实现,此时可以将这个方法声明为抽象方法,抽象方法是没有方法体的,只是一种规范。
Pet类中的toHospital() 方法不需要具体的实现,而且实现后没有任何意义,此时可以将Pet类中的toHospital()声明为抽象方法;
什么是抽象方法:被abstract修饰的方法,就是抽象方法。
- 抽象类为什么不能实例化
- 抽象类中是否可以存在构造方法?
- 抽象类和抽象方法的关系?
- 抽象类能不能继承普通类?
- 普通类能不能继承抽象类
- 抽象方法和普通方法的的区别!
语法:方法体,调用
特征:
1:抽象方法没有方法体,只有方法的声明;
2:如果一个类中存在抽象方法,那么这个类必须声明为抽象类;abstact修饰的类,抽象类不能创建对象
3:抽象类不能被实例化;
4:抽象方法必须在子类中被重写,除非子类也是抽象类;
如:
// 抽象类
public abstract class Pet{
//抽象方法
public abstract void toHospital();
}
4:向上转型
把子类对象直接赋给父类引用叫向上转型,向上转型不用强制转换。
<父类型> <引用变量名> = new <子类型>();
如:
Pet p = new Dog();
注意:
- 此时通过父类引用变量调用的方法是子类重写或继承父类的方法
- 此时通过父类引用变量无法调用子类特有的方法
5:向下转型 - 强制类型转换
向上转型只能使用子类重写的一些方法,和从父类中继承的一些方法,如何使用自己独有的一些方法呢?可以使用向下转型。
向下转型需要使用强制类型转换,调用子类特有的方法;
语法:
<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;
如:
Dog dog=(Dog)pet;//将pet 转换为Dog类型
dog.method();//执行Dog特有的方法
在进行向下转型的时候,非常容易发生类型转换异常,
ClassCastException --- 类型转换异常
instanceof用于判断一个引用类型所引用的对象是否是一个类的实例
2: 在子类中添加特有的方法,通过多态的方式创建对象,来调用子类的特有方法,Pet p = new Dog();
小狗 - 游泳
小猫 - 抓老鼠
3: 抽象类中一定会有抽象方法嘛 ?通过代码校验
预习:类型转换,抽象(方法,类)