方法的重写和多态
1.为什么需要重写呢 有时父类的工作子类不一定需要 或者没有完全满足子类需求
2.方法重写需要有继承关系 重写时子类的方法和父类相同 但方法体不同
public class A extends B{
@Override
public void test() {
System.out.println("A--test");
}
}
public class B {
public void test(){
System.out.println("B-->test");
}
}
public class Test {
public static void main(String[] args) {
//静态方法的调用只和左边的类型有关
A a = new A();
a.test();
//父类的引用指向了子类
B b = new A();//子类重写了父类的方法 方法重写不使用static修饰方法 静态方法只能被继承不能被重写
b.test();
}
}
/*
为什么需要重写:
1.父类的功能 子类不一定需要 或者不满足子类需求
AlT+Insert: override; 重写快捷键
*/
3.当AB类的方法使用static关键字修饰时:
输出结果为:
B–>test
A–>test
当AB类的方法不使用static关键字修饰时:
输出结果为:
A–test
A–test
即b是A new出来的对象,因此调用了A的方法
因为静态方法是类的方法 而非静态方法是对象的方法
有static时,b调用了B类的方法,因为b是用B类定义的
没有static时,b调用的是对象的方法,而b是用A类new的
4.AlT+Insert: override; 重写快捷键
多态:即同一方法可以根据根据发送对象不同而采取不同的行为方式。
一个对象的实例类型是确定的,但可以指向对象的引用类型很多。
1.多态是方法的多态,属性没有多态。
2.父类和子类直接要有联系 否则会抛出类型转换异常 ClassCastException。
3.存在条件:要有继承关系,方法需要重写,父类引用指向子类对象。 Father f1 = new Son();
当方法被一下修饰符 修饰时无法重写:
1.static 方法,属于类,被修饰的方法就不属于实例了。
2.final 常量。
3.private 方法,私有了不能重写。
public class Person {
public void say(){
System.out.println("Person say");
}
}
/*
多态:即同一方法可以根据根据发送对象不同而采取不同的行为方式。
一个对象的实例类型是确定的,但可以指向对象的引用类型很多。
1.多态是方法的多态,属性没有多态。
2.父类和子类直接要有联系 否则会抛出类型转换异常 ClassCastException。
3.存在条件:要有继承关系,方法需要重写,父类引用指向子类对象。 Father f1 = new Son();
当方法被一下修饰符 修饰时无法重写:
1.static 方法,属于类,被修饰的方法就不属于实例了。
2.final 常量。
3.private 方法,私有了不能重写。
*/
public class Student extends Person{
public void say(){
System.out.println("Student say");
}
public void eat(){
System.out.println("Student eat");
}
}
public class Test01 {
public static void main(String[] args) {
//Student 能调用自身的方法和父类中的方法
Student s1 = new Student();
Person s2 = new Student();
//对象能执行哪些方法主要和左边的类型有关 父类不能调用子类中的独有方法
s1.say();
s2.say();
s1.eat();
((Student) s2).eat();//使用强制类型转换就可以调用
//s2.eat(); 父类型调用子类型中的独有方法时 报错
}
}