day11


1. 继承(extends)

  • 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只需要继承那个类即可.
  • 此处的多个类称为子类(派生类),单独的这个类称为父类(超类,基类)
  • 类继承语法

class Subclass extends SuperClass{}

  • 继承的作用
  1. 继承的出现减少了代码冗余,提高了代码的复用性
  2. 继承的出现,更有利于功能的扩展.
  3. 继承的出现让类与类之间产生了关系,提供了多态的前提.
  • 子类继承了父类,就继承了父类的方法和属性
  • 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法
  • 在Java中,继承的关键字用的是extends,即子类不是父类的子集,而是对父类的扩展

继承的规则:

  1. 子类不能直接访问父类中的私有变量和方法private
  2. Java只支持单继承和多层继承,不允许多重继承

2. 方法的重写(override/overwrite)

public class Person {
    String name;
    int age;

    public Person(int age) {
        System.out.println(age);
        System.out.println("Person类的有参构造被调用");
    }

    void test() {
        System.out.println("Hello World");
    }

}

class Student extends Person {
    public Student() {
        super(2);
    }
    //子类Student对父类Person的test方法重写
@Override/
    void test() {

        System.out.println("Hello Java");
    }
}

定义:在子类中可以根据需要从父类中继承来的方法进行改造,也称为方法的重置,覆盖.在执行程序时,子类的方法将覆盖父类的方法.

要求:

  1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称,参数列表
  2. 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
  3. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
  4. 子类不能重写父类中声明为private权限的方法
  5. 子类方法抛出的异常不能大于父类被重写方法的异常

注意:

子类与父类中同名同参数的方法必须同时声明为非static的,或者同时声明为static,因为static方法是属于类的,子类无法覆盖父类的方法

3. 访问权限修饰符

public > protected>无修饰符>private

4. super关键字

package supertest;

public class SuperTest {
    String name = "Zhao";
    int age = 20;

    public String getInfo() {
        return name + " " + age;
    }
}

class Student extends SuperTest {
    String name = "Qian";
    String school = "BD";

    public String getSchool() {
        return school;
    }

    public String getInfo() {
        return super.getInfo() + school;
    }

}

class Test {
    public static void main(String[] args) {
        Student stu1 = new Student();
        System.out.println(stu1.getInfo());
    }
}

在Java类中使用super来调用父类中的指定操作

  1. super可用于访问父类中定义的属性
  2. super可用于调用父类中定义的成员方法
  3. super可用于在子类构造器中调用父类的构造器
package supertest2;

import java.util.Date;

public class Person {
    private String name;
    private int age;
    private Date birthday;

    public static void main(String[] args) {
        Student stu1 = new Student("Tom");
        stu1.show();

    }

    void show() {
        System.out.println(name + age + birthday);
        System.out.println();
    }

    public Person(String name, int age, Date d) {
        this.name = name;
        this.age = age;
        this.birthday = d;
    }

    public Person(String name, int age) {
        this(name, age, null);
    }

    public Person(String name, Date d) {
        this(name, 30, d);
    }

    public Person(String name) {
        this(name, 2020);
    }

}

class Student extends Person {

    public Student(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

}

注意:

  1. 尤其当字父类出现同名成员时,可以用super表明调用的是父类中的成员

  2. super的追溯不仅限于直接父类

  3. super和this的用法很像,this代表本类对象的引用,super代表父类的内存空间和标识

调用父类构造器:

  1. 子类中所有的构造器默认会访问父类中的空参数构造器
  2. 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,只能二选一,且必须放在构造器首行
    1. 如果子类构造器中既未显示调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错

this和super的区别:

image-20201019222807780


文章作者:
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 !
 上一篇
day12 day12
面向对象多态1.接口接口是多个抽象方法的集合.仅仅定义功能,本身不实现功能.实现功能的过程交给类完成 接口中的方法是抽象方法,并不能实现功能.体现了规范和实现分离的思想. public interface 接口名{ 抽象方法();
2020-10-25
下一篇 
day10 day10
1. 封装(Encapsulation)1.1 封装在面向对象程序设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装,隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问. 要访问该类的代码
2020-10-25
  目录