继承是类与类之间的关系,子类继承父类(除构造方法外)的所有内容
目录
继承属性
属性名不同
属性名相同
继承方法
方法名不同
方法名相同
什么是重写
子父类方法名相同时的调用
构造方法
完成子父类成员变量初始化
标准继承写法
继承属性
属性名不同
当父类和子类的成员变量名不同时,子类所继承父类成员变量,相当于复制一份在自己的类里
内存结构 : 创建子类对象并调用子类构造方法的同时 , 会调用父类的构造方法 , 在子类对象中开辟一块super的空间,用于存储父类的成员变量.
public class Fu{
int a;
}
class Zi extends{
//子类继承父类,相当于将父类属性赋值到子类中
int b;
public void show(){
//2.类中调用直接使用
System.out.println(a);
System.out.println(b);
}
}
class Test{
public static void main(String[] args){
Zi zi = new Zi();
//1.父类和子类成员变量名不同 使用引用去调用
System.out.println(zi.a);
System.out.println(zi.b);
//2.通过类中方法调用成员变量
zi.show()
}
}
属性名相同
当父类成员变量, 子类成员变量, 局部变量 名字相同时,使用this和super关键字区分
1. java的就近原则,直接写a 指的是局部变量
2. this表示调用者,调用这个方法的是Zi对象,因此this.a是子类的成员变量
这里注意!!! 当子类成员变量没有a的情况下 this.a会去父类找
3. super是Zi对象在堆内存创建的空间,存放父类的成员变量内容
public class Fu{
int a = 100;
}
class Zi extends Fu{
int a = 200;
public void show(){
int a = 300;
//java的就近原则,直接写a 指的是局部变量
System.out.println("局部变量 a:"+a);
//this表示调用者,调用这个方法的是Zi对象,因此this.a是子类的成员变量
//这里注意!!! 当子类成员变量没有a的情况下 this.a会去父类找
System.out.println("子类成员变量 a:"+this.a);
//super是Zi对象在堆内存创建的空间,存放父类的成员变量内容
System.out.println("父类成员变量 a:"+super.a);
}
}
class Test{
public static void main(String[] args){
Zi zi = new Zi();
//1.类外访问无法访问到 子类继承下来的number(父类的number)
System.out,println(zi.a);
//2.通过类中方法调用
zi.show();
}
}
继承方法
方法名不同
问题 : 属性是在对象中开辟super空间 , 那么子类是怎么获取到父类成员方法的
类中访问的三种形式:
1). 直接写方法名,默认是加this的,现在子类找,子类没有找父类method1();
2). 现在子类找,子类没有找父类this.method1();
3). 直接找父类super.method1();
public class Fu{
public void method1(){
System.out.println("这是父类的method1方法");
}
}
class Zi extends Fu{
public void method2(){
System.out.println("这是子类的method2方法");
}
//2.通过类中方法 调用父类方法
public void show(){
//类中访问的三种形式:
//1).直接写方法名,默认是加this的,现在子类找,子类没有找父类
method1();
//2).现在子类找,子类没有找父类
this.method1();
//3).直接找父类
super.method1();
}
}
class Test{
public static void main(String[] args){
//1.创建Zi对象引用, 使用引用直接调用父类和子类的方法
Zi zi = new Zi();
zi.method1();
zi.method2();
//2.通过类中方法调用父类方法
zi.show();
}
}
方法名相同
继承方法时方法名相同的三种情况:
1. 子类想要和父类一模一样的方法, 直接继承, 不用编写额外代码
2. 子类想在父类原有方法的基础上, 在添加额外的逻辑, 使用super拿到方法, 并加强逻辑
3. 子类有完全不同的逻辑, 完全重写
什么是重写
继承方法时方法名相同的三种情况:
1. 子类想要和父类一模一样的方法, 直接继承, 不用编写额外代码
2. 子类想在父类原有方法的基础上, 在添加额外的逻辑, 使用super拿到方法, 并加强逻辑
3. 子类有完全不同的逻辑, 完全重写
方法重写在子父类中, 出现了方法名相同, 返回值相同(满足某种情况可以不同),参数列表相同的方法. 当父类的逻辑并不能满足子类需求时, 子类可以选择重写或加强父类方法的逻辑.
子父类方法名相同时的调用
public class Fu{
public void show(){
System.out.println("这是父类的show方法!");
}
}
class Zi extends Fu{
public void show(){
//super.show(); //这句是继承父类show的内容
System.out.println("这是子类的show方法!");
}
}
class Test{
public static void main(String[] args){
Zi zi = new Zi();
//通过创建对象 使用引用调用的子类重写后的方法
zi.show();
}
}
构造方法
这里注意, 构造方法是不能被继承的, 类的构造方法是和类名相同, 因此不同的类是不同的构造方法.
构造方法是用来初始化成员属性的, 当编译器发现子类是继承父类的, 会在子类的所有构造方法中的第一行加上super(); 先初始化父类的构造方法, 我们也可以按照逻辑自己编写有参的super 初始化父类的构造方法.
完成子父类成员变量初始化
public class Fu{
int a;
//1.在父类中创建有参构造和无参构造
public Fu(){
}
public Fu(int a){
this.a = a;
}
}
//2.子类继承父类
class Zi extends Fu{
int b;
//3.创建子类的有参构造,并将数据a通过super传给父类的构造方法,从而赋值
public Zi(int a, int b){
super(a);
this.b = b;
}
public Zi(){
}
}
class Test{
public static void main(String[] args){
//4. 创建Zi对象,通过构造方法初始属性值
Zi zi = new Zi(10, 20);
}
}
标准继承写法
1. 创建父类, 私有化属性, 创建属性的get/set方法, 创建构造方法(有参+无参)
2. 创建子类, 继承父类, 编写实体类的构造方法(包括super();)
3. 创建测试类, 创建子类对象, 使用构造方法初始值, 但由于父类属性是私有的, 子类继承后也是私有的,只能通过get/set 方法取值或者设置属性值
1. 创建父类, 私有化属性, 创建属性的get/set方法, 创建构造方法(有参+无参)
2. 创建子类, 继承父类, 编写实体类的构造方法(包括super();)
3. 创建测试类, 创建子类对象, 使用构造方法初始值, 但由于父类属性是私有的, 子类继承后也是私有的,只能通过get/set 方法取值或者设置属性值


![[Java进阶] 普通类之间继承(调用 , 重写 , this关键字 , super关键字) [Java进阶] 普通类之间继承(调用 , 重写 , this关键字 , super关键字)](http://www.mshxw.com/aiimages/31/880725.png)
