继承后:成员变量、成员方法的访问特点

在子类方法中访问成员(成员变量、成员方法)满足:就近原则

就近原则:子类(局部)没有找子类(成员),子类(成员)没有找父类,父类没有就报

错。如果子父类中出现了重名的成员,此时如果一定要在子类中使用父类怎么办? 格式:super.父类成员变量/父类成员方法

public class Test {

public static void main(String[] args) {

//目标:理解继承后成员的访问特点:就近原则。

Dog d = new Dog();

d.run();//狗跑的贼快---。子类的

d.lookDoor();//狗可以看门---。子类的

d.showName();

}

}

class Animal{

public String name = "动物名";

public void run(){

System.out.println("动物可以跑---");

}

}

class Dog extends Animal{

public String name = "狗名";

public void lookDoor(){

System.out.println("狗可以看门---");

}

public void showName(){

String name = "局部名";

System.out.println(name);//局部名

System.out.println(this.name);//当前子类对象的name(狗名)

System.out.println(super.name);//找父类的name(动物名)

super.run();//找父类方法(动物可以跑---)

run();//子类的run(狗跑的贼快---)

}

public void run(){

System.out.println("狗跑的贼快---");

}

}

继承后:方法重写

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的

方法。

什么情况下需要进行方法的重写?

当子类的实现方式跟父类的实现方式不一样的时候,就需要对父类的方法进行重写( 覆盖).

当子类重写了父类的方法后,则会覆盖父类原来方法的实现。

方法重写应用场景:

当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。;子类可以重写父类中

的方法。

@Override重写注解

1、重写校验注解,加上这个,这个方法必须是正确重写的,这样更安全。

2、提高程序的可读性,代码优雅!

加上该注解后如果重写错误,编译阶段会出现错误提示。

方法重写注意事项和要求:

1、重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。

2、私有方法不能被重写。 3、子类重写父类方法时,访问权限必须大于或者等于父类(暂时了解:缺省

重写和重载的区别

重载: 方法必须在一个类中,方法名相同, 但是参数列表不相同.

重写: 两个类,并且两个类之间必须有继承或者实现关系. 方法的访问修饰符必须不小于父类的反问修饰符。

方法的返回类型(必须要小于或等于父类的返回类型。前提是引用数据类型) 方法的名字要一样,甚至,方法的参数列表必须要一样。

案例:

旧手机的功能只能是基本的打电话,发信息

新手机的功能:基本的打电话下支持视频通话。基本的发信息下支持发送语音和图片。

public class Test {

public static void main(String[] args) {

//目标:认识方法重写。:在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

//方法重写应用场景:当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。;子类可以重写父类中的方法。

NewPhone hw = new NewPhone();

hw.call();

hw.sendMsg();

}

}

/**

新手机:子类

*/

class NewPhone extends Phone{

//重写的方法

@Override //1、重写校验注解,加上这个,这个方法必须是正确重写的,这样更安全。2、提高程序的可读性,代码优雅!

//加上该注解后如果重写错误,编译阶段会出现错误提示

//方法重写注意事项和要求:1、重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。2、私有方法不能被重写。

//3、子类重写父类方法时,访问权限必须大于或者等于父类(暂时了解:缺省

//4、子类不能重写父类的静态方法,如果重写会报错的。

public void call(){

super.call(); //先用它爸爸的基本功能

System.out.println("开始视频通话--");

}

//重写的方法

@Override

public void sendMsg(){

super.sendMsg();//先用它爸爸的基本功能

System.out.println("发送有趣的图片--");

}

//注意:静态方法不能被重写。

// @Override

// public static void test(){

// }

}

/**

旧手机:父类的

*/

class Phone{

public void call(){

System.out.println("打电话-");

}

public void sendMsg(){

System.out.println("发短信-");

}

public static void test(){

}

}

继承后:子类构造器的特点

子类的全部构造器默认会先访问父类的无参数构造器,再执行自己。

父类:

public class Animal {

public Animal(){

System.out.println("父类Animal无参数构造器被执行-");

}

}

子类:

public class Dog extends Animal{

public Dog(){

super();//写不写都有,默认找父类的无参数构造器执行。

System.out.println("子类Dog无参数构造器被执行-");

}

public Dog(String name){

super();//写不写都有,默认找父类的无参数构造器执行。

System.out.println("子类Dog有参数构造器被执行-");

}

}

测试类:

public class Test {

public static void main(String[] args) {

//目标:认识继承后子类构造器的特点

//特点:子类的全部构造器默认会先访问父类的无参数构造器,再执行自己

//原因:1、子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。

//2、子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。

//怎么调用父类构造器的?子类构造器的第一行语句默认都是:super(),不写也存在。

Dog d1 = new Dog();

System.out.println(d1);

System.out.println("------------------");

Dog d2 = new Dog("金毛");

System.out.println(d2);

/*

父类Animal无参数构造器被执行-

子类Dog无参数构造器被执行-

com.itheima.d10_extends_constructor.Dog@1b6d3586

-----------------

父类Animal无参数构造器被执行-

子类Dog有参数构造器被执行-

com.itheima.d10_extends_constructor.Dog@4554617c

*/

}

}

继承后:子类构造器访问父类有参构造器

super调用父类有参数构造器的作用:

初始化继承自父类的数据。

作用:通过调用父类有参数构造器来初始化继承自父类的数据。

父类:

public class People {

private String name;

private int age;

public People() {

}

public People(String name, int age) {

this.name = name;

this.age = age;

}

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 class Teacher extends People{

public Teacher(String name , int age){

//调用父类的有参数构造器,初始化继承自父类的数据

super(name,age);

}

}

测试类:

public class Test {

public static void main(String[] args) {

//目标:学习子类构造器如何去访问父类有参数构造器,还要清楚其作用。

//super调用父类构造器

//作用:通过调用父类有参数构造器来初始化继承自父类的数据。

Teacher t = new Teacher("张三",18);

System.out.println(t.getName());

System.out.println(t.getAge());

}

}