Day8

静态成员、方法访问:

  1. 类的全限定类名.成员名/方法名
  2. import static 类的全限定类名.成员(但是不能直接导入类)

继承(extends)

语法

  • public class 类名 extends 被继承的类名 {}

protected

  • 同包下或者同类下可以访问
  • 不同包的子类中,创建子类对象,只有用该子类对象可以访问
  • 不同包非子类不能访问
  • 不同包的子类中,创建父类对象,用父类对象无法访问。
  • 不同包的子类中,创建其他子类对象,这个其他子类对象无法访问。

总结:记住能够访问的例子就行。

子类继承父类,可以使用除private修饰外的变量和方法。不能说没有继承,只是没有访问权限。

public protected 默认 private
同一类中
同一包其他类
不同包子类
不同包其他类

隐式的子类对象初始化

construct (){

//JVM帮我们做,相当于执行了
    super();
//所以隐式初始化默认调用父类的无参构造,所以最好提供无参构造方法
}

显式的子类初始化(explicit)

在子类的构造方法的第一句中,使用super关键词调用父类的有参构造。

构造方法中,this和super调用构造方法只能用一个。

this不受访问权限控制,super受访问权限控制。(废话)

子类的属性隐藏

子类中存在与父类中的同名变量,由于某种机制,父类中的变量就被隐藏了。编译器的检查机制。对象名.属性

子类中存在与父类中相同的方法,父类中的方法就被覆盖了,只能调到子类中的方法。

要使用父类中被覆盖或隐藏的东西,使用super。

@Override,放在子类中被重写的方法上,静态方法不能被重写。

a. 声明一个Person类,里面定义了三个属性,name、gender、age(姓名、性别、年龄)
通过构造方法进行赋值。有一个display方法,可以展示对应的姓名性别年龄信息

b. 声明一个Student类,继承自Person类,增加一个独特的属性id(学号)
通过构造方法进行赋值,同时有一个方法可以展示姓名性别年龄学号信息

c. 声明一个Teacher类,继承自Person类,增加course属性(教学课程)
通过构造方法进行赋值,有一个方法,可以显示姓名性别年龄教学课程信息

d.编写一个测试类,验证你的代码.(分别创建Student对象,和Teacher对象,
要求利用子类对象的显示初始化,即在子类构造方法中,调用父类构造方法的方式
来初始化子类对象。)

package com.jiang.work.Day8.workone;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 测试类
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/8 19:18
 */
public class WorkOneTest {
    public static void main(String[] args) {
        Student student = new Student("张三", "男", 18, 2006);
        Teacher teacher = new Teacher("李四", "男", 56, "数学");
        //输出学生信息
        student.display();
        System.out.println("-----------------");
        //输出教师信息
        teacher.display();
    }
}

package com.jiang.work.Day8.workone;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 学生类
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/8 19:00
 */
public class Student extends Person {
    private int id;

    public Student() {
    }

    public Student(String name, String gender, int age, int id) {
        super(name, gender, age);
        this.id = id;
    }
    @Override
    protected void display() {
        super.display();
        System.out.println("学号是:" + id);
    }
}

package com.jiang.work.Day8.workone;

/**
 * ============================
 * 一定要注意命名规则
 * 一定要注意命名规则
 * 一定要注意命名规则
 * ============================
 * TODO
 *
 * @version 1.0
 * @Description: 老师类
 * @author: https://github.com/cqpsjsl
 * @date: 2021/1/8 19:14
 */
public class Teacher extends Person{
    private String course;

    public Teacher() {

    }
    public Teacher(String name, String gender, int age, String course) {
        super(name, gender, age);
        this.course = course;
    }

    @Override
    protected void display() {
        super.display();
        System.out.println("教学课程是:"+course);
    }
}

运行结果:

姓名: 张三 性别男 年龄18
学号是:2006
-----------------
姓名: 李四 性别男 年龄56
教学课程是:数学

package com.cskaoyan.javase.oop;

/**
 * @description: 试题
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

public class Test {
    public static void main(String[] args) {
        Sub sub = new Sub();
    }
}

class Base{

    static {
        System.out.println("base 静态代码块");
    }
    {
        System.out.println("base 构造代码块");
    }
    public Base(){
        //super();
        System.out.println("base无参构造");
    }

}

class Sub extends Base{

    static {
        System.out.println("sub 静态代码块");
    }

    {
        System.out.println("sub 构造代码块");
    }

    public Sub(){
        //super();
        System.out.println("sub 无参构造");
    }

}

分析结果:

Sub sub--->加载Sub.class--->发现extends,加载Base.class--->加载Base中静态代码块--->加载Sub中静态代码块----> new Sub()----Sub()--->super-->Base()【进入object】
-->Base构造代码块--->Base构造方法--->Sub构造代码块--->Sub构造方法
1.base 静态代码块
2.sub 静态代码块
3.base 构造代码块
4.base无参构造
5.sub 构造代码块
6.sub 无参构造
package com.cskaoyan.javase.oop;

import java.nio.channels.Pipe;

/**
 * @description: test
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

public class Obj3 extends Obj1 {
    Obj2 ob2 = new Obj2();
    public Obj3(){
        System.out.println("obj3");
    }

    public static void main(String[] args) {
        Obj3 obj3 = new Obj3();
    }
}

class Obj1 {
    Obj2 ob2 = new Obj2();
    public Obj1() {
        System.out.println("Obj1");
    }
}

class Obj2 {
    public Obj2() {
        System.out.println("obj2");
    }
}

看题目说结果:

1.Obj2
2.obj1
3.obj2
4.obj3

总结:

Obj2 ob2 = new Obj2();比构造方法先执行。构造方法最后执行
上一篇:10章-项目沟通管理-day8


下一篇:小白的LeetCode日记记录Day8