方法覆盖(重写)
/**
*
* 方法覆盖(重写) override: 可以在子类中定义和父类一模一样的方法
*
* 方法覆盖:使用场景,修改父类方法的方法实现
*
* 1. 在子类中能否定义和父类一模一样的方法呢? 可以 -> 实现了方法覆盖
* 2. 在父类类体和子类类体中,访问到的都是子类中重写的方法
* 3. 可不可以子类对象中访问到父类中定义的一模一样的方法呢?
*
* 对于方法覆盖而言,发生的条件,必须是子类和父类中方法的定义一模一样吗?
* 方法法覆盖发生的条件:
* 1. 方法名和参数列表必须相同
* 2. 返回值 并不要求一模一样 返回值类型兼容即可
* 什么情况下类型兼容: 子类类型可以被看做是父类类型
*
* 3. 方法的访问权限: 子类的方法的访问权限 >= 父类方法的访问权限
*
* @Overdie: 当在子类中的某方法定义之前加上这个注解,它的含义是告诉编译器,
* 子类中的该方法要覆盖父类中的方法,编译器会自动帮你检查下覆盖是否成功
*
*
* 方法覆盖的注意事项:
* 1. 父类中私有方法不能被重写
2. 子类重写父类方法时,访问权限不能更低
3. 静态方法不能被重写!!
*
*
*/
public class MethodOverride {
public static void main(String[] args) {
MethodOverrideFather methodOverrideFather = new MethodOverrideFather();
//methodOverrideFather.method();
MethodOverrideSon methodOverrideSon = new MethodOverrideSon();
//methodOverrideFather.method();
//测试在父类对象中调用的究竟是父类中定义的同名方法还是子类中定义的同名方法
methodOverrideSon.testFatherMethodOverride();
methodOverrideSon.testSonMethodOverride();
//说明一下所谓的类型兼容: 子类类型可以被看做父类类型
MethodOverrideFather result = methodOverrideFather.method();
}
}
class MethodOverrideFather {
int i;
MethodOverrideFather method() {
System.out.println("fahter method");
MethodOverrideFather methodOverrideFather = new MethodOverrideFather();
return methodOverrideFather;
}
public void testFatherMethodOverride() {
method();
}
//测试父类中的私有方法能不能被覆盖
private void testPrivateOverride() {
}
//测试静态方法不能被覆盖
public static void testStaticOverride() {
}
}
class MethodOverrideSon extends MethodOverrideFather {
int j = 0;
@Override
MethodOverrideSon method() {
System.out.println("son method");
MethodOverrideSon methodOverrideSon = new MethodOverrideSon();
return methodOverrideSon;
}
//@Override
public void testSonMethodOverride() {
method();
super.method();
}
//测试在子类中尝试覆盖父类的私有成员方法 -> 确实覆盖不了
//@Override
public void testPrivateOverride() {
}
//测试静态方法不能被覆盖
//@Override
public static void testStaticOverride() {
}
}
final关键字
final关键字:
final是最终的意思,可以修饰类,变量,成员方法。
1.修饰类,类不能被继承
2.修饰变量,变量就变成了常量,
只能被赋值一次
3.修饰方法,方法不能被重写
(override)
final修饰变量时分为2种情况:
1.修饰成员变量:必须在定义时初始化
2.修饰局部变量:可以在定义时初始化,也可以选择在构造方法中进行初始化