方法的重写+多态
super注意点:
1. super调用父类的构造方法,必须在构造方法的第一个
2. super必须只能出现在子类的方法或者构造方法中!
3. super和 this不能同时调用构造方法!
Vs this:
代表的对象不同:
this: 本身调用者这个对象
super: 代表父类对象的应用
前提
this:没有继承也可以使用
super:只能在继承条件下参能使用
构造方法不同
this():调用的本类的构造方法
super():调用的父类的构造
重写:需要有继承关系,子类重写父类的方法!
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以扩大,不能缩小 : public>Protected>Default>private
4.抛出的异常:范围,可以被缩小,但不能扩大; ClassNotFoundException --> Exception(大)
重写,子类的方法和父类必要一致;方法体不同!
为什么需要重写:
1.父类的功能,子类不一定需要,或者不一定满足!
Alt +Insert ; override;
package com.oop;
import com.oop.demo05.A;
import com.oop.demo05.B;
//一个项目应该只存在一个main方法
public class Application {
//静态方法和非静态的方法区别很大
//静态的方法: //方法的调用之和左边,定义的数据类型有关
//非静态: 重写
//重写的关键词是public 子类重写之后的权限不小于父类就好
public static void main(String[] args){
A a = new A();
a.test();//A
//父类的引用指向了子类
B b = new A();//子类重写了父类的方法
b.test();//B //A
}
}
package com.oop.demo05;
//重写都是方法的重写,和属性无关
public class B {
public void test(){
System.out.println("B=>test()");
}
}
package com.oop.demo05;
//继承关系
public class A extends B {
//Override 重写
*多态
动态编译: 类型:可扩展
即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
多态存在的条件
有继承关系 子类重写父类方法
父类引用指向子类对象
注意:
多态是方法的多态,属性没有多态性。
instanceof ( 类型转换)~ 引用类型
package com.oop;
import com.oop.demo06.Person;
import com.oop.demo06.Student;
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args){
//一个对象的实际类型是确定的
//new Person();
//new Student();
//可以指向的引用类型就不确定了:父类的引用指向子类
//Student能调用的方法都是自己的或者继承父类的!
Student s1 = new Student();
//Person是父类型,可以指向子类,但是不能调用子类独有的方法
Person s2 = new Student();
Object s3 = new Student();
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
s2.run();//子类重写了父类的方法,执行子类的方法
s1.run();
//s2.eat();//报错
s1.eat();
}
}
/*
多态注意事项:
1.多态是方法的多态,属性没有多态
2.父类和子类,有联系类型转换异常! ClasscastException !
3.存在条件:继承关系,方法需要重写,父类引用指向子类对象!Father f1 = new Son() ; I
不能重写:
1. static方法,属于类,它不属于实例
2. final常量;
3. private方法;
*/
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
package com.oop.demo06;
public class Student extends Person {