继承中成员变量的访问特点:
在父子两个产生了继承关系之后,那么如果使用其中成员变量有怎样规则: 有两种方式
1,直接 通过子类对象访问成员变量:(也就是说new上一个子点它 ,就是直接点)
等号左边是谁就优先有谁,没有则向上找
2,简接 通过成员方法访问成员变量:
该方法属于谁,就优先用谁,没有则向上找。
父类 当中 能定义成员变量,也能定义成员方法
在这里插入代码片public class Fu {
int numFu = 10;
int num = 100;
public void methodFu(){
//使用的是本类当中的num,不会向下找子类的
System.out.println(num);
}
}
/子类当中 能定义成员变量,也能定义成员方法
public class Zi extends Fu{
int numZi = 20;
int num = 200;
public void methodZi(){
//因为本类当中有num,所以这里用的是本类num ,如果没有才往上找
System.out.println(num);
}
}
public class Demo01ExtendsField {
public static void main(String[] args){
Fu fu = new Fu();//创建一个父类对象
System.out.println(fu.numFu);//只能使用父类的东西,没有任何
//子类的内容,就是父亲不知道儿子,但是儿子知道父亲
System.out.println("===========");
Zi zi = new Zi();//创建一个子类对象
System.out.println(zi.numFu);//10
System.out.println(zi.numZi);//20
System.out.println("===========");
//等号左边是谁就优先有谁
System.out.println(zi.num);//优先子类:200
// System.out.println(zi.abc);//子类和父类都没有,编译报错
System.out.println("===========");
//调用方法
//这个方法是子类的,那么就优先使用子类的,没有才向上找
zi.methodZi();//200
//这个方法是谁的?这个方法是在父类定义的,(属于父类)
zi.methodFu();//100
}
}
如何区分三种变量重名的问题:
局部变量: 直接写成员变量名
本类的成员变量: 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 本类的成员变量
//super:超级的意思
System.out.println(super.num);//10 父类的成员变量
}
在调用
public class Demo01ExtendsField {
public static void main(String[] args){
Zi zi = new Zi();
zi.method();
}
}
继承中成员方法的访问特点:
在父子类的继承关系当中,创建子类对象,访问成员方法的规则:
创建的对象是谁,就优先用谁,如果没有则向上找。
注意事项:
无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类的,
先创建父类
public class Fu {
public void methodFu(){
System.out.println(“父类方法执行!”);
}
public void method() {
System.out.println("父类重名方法执行!");
}
}
在创建子类
ublic class Zi extends Fu {
public void methodZi(){
System.out.println("子类方法执行");
}
public void method() {
System.out.println("子类重名方法执行!");
}
}
在调用
public class Demo01ExtendsMethod {
public static void main(String[] args){
Zi zi = new Zi();//1,new 代表创建把,
//调用的时候可以发现有父也有子,因为继承了
zi.methodFu();
zi.methodZi();
//创建的是new了子类对象,所以优先用子类方法
zi.method();//2,那么这里优先使用子
}
}
方法的重写:
概念和特点
重写(Override)
概念:在继承关系当中,方法的名称一样,参数列表一样。
重写(Override):方法的名称一样,参数列表【也一样】。覆盖,覆写。
重载(Oveeload):方法的名称一样,参数列表【不一样】。
方法的覆盖重写的特点:创建的是子类对象,则优先用子类方法。(new的是谁就是谁)
方法覆盖重写的注意事项:
1, 必须保证父子类之间方法的名称相同,参数列表也相同。(否则你没有办法覆盖重写)
@Override:写在方法前面,用来检测是不是有效的正确覆盖重写。
这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。
2,子类方法的返回值【小于等于】父类方法的返回值范围。
小扩展提示:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是Object的子类。
3,子类方法的权限必须【大于等于】父类方法的权限修饰符,【要么一样,要么子类比父类大】
小扩展提示:public > protected > (default) > private
备注:(default)不是关键字default而是什么都不写,留空的都是default权限。
就是 :父类是public 权限那么子类也是public 权限是可以的。但是
如果:父类是public 权限那么子类是 protected 权限以及以下的群贤是都不可以的。
public class Demo01Override {
}
创建一个父类
public class Fu {
// public void method(){
// }
public Object method (){//1,返回一个
//2,如果这里写String
//3,如果这里写String
return null;//所有的应用类型都可以让null 代表
}
}
创建一个子类“
public class Zi extends Fu {
@Override//安全检测的作用,如果报错就不是覆盖重写。也可以不写,但是推荐写上
// public void method(){
// }
public Object method(){//1,写一个一样的Object是正确的
//2,这里写一个String也是正确的
//3,这里写Object是不对的
return null;
}
}