重学java 20.面向对象 继承 下

对未来真正的慷慨,是把一切献给现在

                                                —— 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衔接,调用父类中的有参构造,为父类赋值

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值