对未来真正的慷慨,是把一切献给现在
—— 24.4.22
super和this
学习目标:
01.继承中构造方法的特点
02.super和this的具体使用
03.继承的特点
04.练习:为父类中private属性赋值
一、继承中构造方法的特点
1.注意:
在new子类对象时,会先初始化父类(先走父类的无参构造方法)
2.原因:
每个构造方法(有参/无参)的第一行,默认都会有一个super(),不写jvm会自动提供一个
super()代表的是调用父类的无参/有参构造,如果手写则必须写在第一行
子类:
public class Son extends Fu{ public Son(){ super(); System.out.println("我是子类中的无参构造"); } public Son(int i){ super(); System.out.println("我是子类中的有参构造"); } }
父类:
public class Fu { public Fu(){ System.out.println("我是父类中的无参构造"); } }
测试类:
public class Demo110Test { public static void main(String[] args) { Son son = new Son();// 我是父类中的无参构造 // 我是子类中的无参构造 System.out.println("————————————————"); //先有父类对象 再有子类对象 Son son1 = new Son(21); } }
二、super和this的具体使用
1.super的具体使用
①概述
代表的是父类引用
②作用
可以调用父类中的成员->在子类的构造中写super()/super(实参)
③使用
a、调用父类构造方法
super() -> 调用父类无参构造
super(实参) -> 调用父类有参构造
b、调用父类成员变量
super.成员变量名
c、调用父类成员方法
super.成员方法名(实参)
父类
public class Fu { int num = 10; public Fu(){ System.out.println("我是父类中的无参构造"); } public Fu(int data){ System.out.println("我是父类中的有参构造"); } public void method(){ System.out.println("我是父类之中的method方法"); } }
子类
public class Son extends Fu{ int num = 100; public Son(){ super();// 调用父类中的无参构造 System.out.println("我是子类中的无参构造"); } public Son(int data){ super(18);// 调用父类的有参构造 System.out.println("我是子类中的有参构造"); } public void method(){ super.method();// 调用父类的method方法 System.out.println("我是子类之中的method方法"); System.out.println(num);// 子类自己的 System.out.println(super.num);// 调用父类的 } }
测试类
public class Demo111Test { public static void main(String[] args) { Son son = new Son(); System.out.println("——————————————————————"); Son son1 = new Son(18); System.out.println("——————————————————————"); Son son2 = new Son(); son2.method(); } }
2.this的具体使用
①this概述
代表的是当前对象(哪个对象调用的this所在的方法,this就代表哪个对象)
②作用
a、区分重名的成员变量和局部变量
b、调用当前对象中的成员
③使用
a、调用当前对象的构造:在构造中写
this():调用当前对象的无参构造
this(实参):调用当前对象的无参构造
b、调用当前对象的成员变量
this.成员变量名
c、调用当前对象的成员方法:
this.成员方法名(实参)
④注意:
不管是super还是this,只要在构造中使用,都必须在第一行,所以二者不能同时手写出来
构造方法
public class Person { int num = 10; // 无参构造 public Person(){ // this(10); System.out.println("我是Person中的无参构造"); } //有参构造 public Person(int data){ this(); System.out.println("我是Person中的有参构造"); } public void method(){ // 重名的局部变量 int num = 20; System.out.println(num);// 20 System.out.println(this.num);// 10 this.method01(); System.out.println("获取Person类中的method方法"); } public void method01(){ System.out.println("我是Person类中的method01方法"); } }
测试类
public class Demo112Test { public static void main(String[] args) { // person的无参构造 Person person = new Person(); System.out.println("————————————————————"); Person person1 = new Person(15); System.out.println("————————————————————"); Person person2 = new Person(); person2.method(); } }
运行结果
三、继承的特点
1.继承只支持单继承,不支持多继承
一个后代只能有一个先祖
public classA extends B,C{} -> 错误
2.继承支持多层继承
不能多继承,但是可以多层基础,就是A继承B,B继承C,A中也可以继承到C
C类就是A类的爷爷类,A类也可以使用C类中的非私有成员
public class A extends B{}
public class B extends C{}
3.一个父类可以有多个子类
一个先祖可以有多个后代
public class A extends C{}
public class B extends C{}
4.各方法能否被继承/重写
构造方法不能继承,也不能重写
私有方法可以继承,但是不能被重写
静态方法可以继承,但是不能被重写
5.演示
父类:
public class Fu { public void method01(){ System.out.println("method01方法"); } private void method02(){ System.out.println("method0方法"); } public static void method03(){ System.out.println("method03方法"); } }
子类:
// 各方法能否被继承/重写演示 public class Son extends Fu{ @Override public void method01(){ System.out.println("子类重写的method01方法"); } // 但是静态方法可以继承 // 私有方法和静态方法都不可以被重写 // @Override // private void method02(){ // System.out.println("method0方法"); // } // // @Override // public static void method03(){ // System.out.println("method03方法"); // } }
测试类:
public class Demo113Test { public static void main(String[] args) { Son son = new Son(); son.method03(); } }
四、练习:为父类中private属性赋值
1.利用set方法赋值
父类:
public class Employee { private String name; private int age; public Employee(String name, int age) { this.name = name; this.age = age; } public Employee() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void work(){ System.out.println("工作"); } }
子类:
public class Teacher extends Employee{ // 继承可以继承私有/非私有,但是只能使用非私有的 public static void main(String[] args) { Teacher teacher = new Teacher(); teacher.setName("小明"); teacher.setAge(21); System.out.println(teacher.getName()+" "+teacher.getAge()); } }
测试类:
public class Demo114Test { public static void main(String[] args) { Teacher teacher = new Teacher(); teacher.setName("小明"); teacher.setAge(23); System.out.println(teacher.getName()+" "+teacher.getAge()); } }
利用get/set非私有方法,使用了父类中的私有属性进行赋值
2.利用构造方法赋值
父类:
public class Employee { private String name; private int age; public Employee(String name, int age) { this.name = name; this.age = age; } public Employee() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void work(){ System.out.println("工作"); } }
子类:
// 各方法能否被继承/重写演示 public class Son extends Fu{ @Override public void method01(){ System.out.println("子类重写的method01方法"); } // 但是静态方法可以继承 // 私有方法和静态方法都不可以被重写 // @Override // private void method02(){ // System.out.println("method0方法"); // } // // @Override // public static void method03(){ // System.out.println("method03方法"); // } }
teacher类:
public class Teacher extends Employee{ // 继承可以继承私有/非私有,但是只能使用非私有的 public static void main(String[] args) { Teacher teacher = new Teacher(); teacher.setName("小明"); teacher.setAge(21); System.out.println(teacher.getName()+" "+teacher.getAge()); } }
测试类:
public class Demo114Test { public static void main(String[] args) { Teacher teacher = new Teacher(); teacher.setName("小明"); teacher.setAge(23); System.out.println(teacher.getName()+" "+teacher.getAge()); System.out.println("——————————————————————"); Manager manager = new Manager("小红",22); System.out.println(manager.getName()+" "+manager.getAge()); } }
利用子类的有参构造,层层调用,中间用super衔接,调用父类中的有参构造,为父类赋值