区分子类方法中重名的三种变量
局部变量: 直接写成员变量名
本类的成员变量: this.成员变量名
父类的成员变量: super.成员变量名
public class Fu {
int num = 10;
}
public class Zi extends Fu{
int num = 20;
public void method(){
int num = 30;
System.out.println(num);//30 局部变量
System.out.println(this.num);//20 本类的成员变量
System.out.println(super.num);//10 父类的成员变量
}
}
public class Demo01ExtendsField {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method();
}
}
在父子类的继承关系中,创建子类对象,访问成员方法的规则:
创建的对象是谁,就优先用谁,如果没有则向上找
注意事项:
无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类的
重写(Override)
概念:在继承关系中,方法的名称一样,参数列表也一样
重写(Override):方法的名称一样,参数列表也一样。覆盖、覆写
重载(Overload):方法的名称一样,参数列表不一样
方法的覆盖重写特点:创建的是子类对象,则优先用子类方法
方法覆盖重写的注意事项:
- 必须保证父子类之间方法的名称相同,参数列表也相同
- @Override:写在方法前面,用来检测是不是有效的正确覆盖重写
这个注解就算不写,只要满足需求,也是正确的方法覆盖重写
- 子类方法的返回值必须小于等于父类方法的返回值范围
前提:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是Object的子类
- 子类方法的权限必须大于等于父类方法的权限修饰符
public > (default) > private
备注: (default)不是关键字default,而是什么都不写,留空
//本来的老款手机
public class Phone {
public void call(){
System.out.println("打电话");
}
public void send(){
System.out.println("发短信");
}
public void show(){
System.out.println("显示号码");
}
}
//定义一个新手机,使用老手机的父类
public class NewPhone extends Phone{
@Override
public void show(){
super.show();//把父类的show方法拿过来重复利用
//自己子类再来添加更多内容
System.out.println("显示姓名");
System.out.println("显示头像");
}
}
public class Demo03Phone {
public static void main(String[] args) {
Phone phone = new Phone();
phone.call();//打电话
phone.send();//发短信
phone.show();//显示号码
System.out.println("==============");
NewPhone newPhone = new NewPhone();
newPhone.call();//打电话
newPhone.send();//发短信
newPhone.show();//显示号码 显示姓名 显示头像
}
}