Day17-Java
面向对象
方法重写
-
需要有继承关系,子类重写父类的方法
- 方法名必须相同
- 参数列表列表必须相同
- 修饰符:范围可以扩大 public>protected>default>private
- 抛出的异常:范围可以被缩小,但不能扩大
-
重写,子类和父类的方法名必须一致,方法体不同!
-
为什么要重写:父类的功能,子类不一定需要,或者不一定满足
-
Alt+insert:override
package com.Kong.Oop.demo04;
public class A extends B {
@Override//注解:有功能的注释
public (static) void test() {
System.out.println("A test");
}
}
package com.Kong.Oop.demo04;
public class B {
public (static) void test() {
System.out.println("B test");
}
}
package com.Kong.Oop;
import com.Kong.Oop.demo04.A;
import com.Kong.Oop.demo04.B;
public class Application {
//静态方法和非静态方法区别很大
//静态方法 方法的调用只和左边定义的数据类型有关
public static void main(String[] args) {
//方法的调用只和左边,定义的数据类型有关
A a = new A();
a.test();//A test
//父类的引用指向了子类
B b = new A();//子类重写了父类的方法
b.test();//A test (B test)
}
}
多态
- 动态编译:类型,可拓展性
- 即同一方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
- 多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
- 注意:
- 多态是方法的多态,属性没有多态性
- 类型转换异常,ClassCastException!
- 无法重写的:
- static 方法,属于类,不属于实例
- final 常量
- private方法
package com.Kong.Oop.demo05;
public class Student extends Person {
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
package com.Kong.Oop.demo05;
public class Person {
public void run(){
System.out.println("run");
}
}
package com.Kong.Oop;
import com.Kong.Oop.demo05.Person;
import com.Kong.Oop.demo05.Student;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Student();
//new Person();
//可以指向的引用类型就不确定了:父类的引用指向子类
//子类能调用的方法都是自己的或者继承父类的
Student s = new Student();
//父类可以指向子类,但是不能调用子类独有的方法
Person p = new Student();
Object o = new Student();
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大
s.run();
p.run();//子类重写了父类的方法,执行了子类的方法
s.eat();
((Student) p).eat();//强制转换,高转低
}
}
浙公网安备 33010602011771号