继承(单继承、方法重写、权限修饰符,父类,子类,Object)

本文介绍了Java中的继承关键字`extends`,如何创建和使用子类,以及继承的执行原理。重点讲述了权限修饰符的作用,单继承的特性,方法重写的概念及其注意事项,包括重写规则和应用场景。同时涉及子类构造器的调用机制和使用super和this关键字访问成员的方法。
摘要由CSDN通过智能技术生成

描述:java中提供了一个关键字extends,用这个关键字,可以让一个类和另一类建立起父子关系

public A extends B{
}

当中A类称为父类(基类或者超类),B类称为子类(派生类)。

继承的特点

  • 子类能继承父类的非私有成员(成员变量、成员方法)。

继承后对象的创建

  •  子类的对象是由子类、父类共同完成的。

继承的执行原理 

带继承的类,java是如何创建它的对象?对象创建出来后,可以直接访问哪些成员?
  •  带继承关系的类,java会用类和其父类,这多张设计图一起来创建类的对象。
  • 对象能直接访问什么成员,是由子父类这多张设计图共同决定的,这张设计图对外暴露了什么成员,对象就可以直接访问哪个成员。

 好处:减少重复代码的编写

继承相关的注意事项

 1.权限修饰符

作用:用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围。 

package com.zz.extend.modifer;

import java.util.Map;

public class Student {
    //1.私有成员只能在本类中访问
    private void privateMethod(){
        System.out.println("==私有==");
    }

    //2,缺省:可以本类、同一个包下的类被访问
    void Method(){
        System.out.println("==缺省==");
    }

    //3.受保护的:可以被访问的范围——本类、同一个包下的类,任意包的子类
    protected void protectedMethod(){
        System.out.println("==受保护的==");
    }

    //4.公开的:可以在本类、同一个包下的类、任意包的子类、任意包的任意类
    public void publicMethod(){
        System.out.println("公开的");
    }

    public void test(){
        privateMethod();
        Method();
        protectedMethod();
        publicMethod();
    }
}
2.单继承
  • 描述

package com.zz.extend.feature;

public class Test {
    public static void main(String args[]){
        /**
         * 目标:掌握继承的两个注意事项
         * 1.java是单继承的:一个类只能继承一个直接父类,
         * java中的类不支持多继承,但是支持多层继承。
         * 2.Object类是java中所有类的祖宗
         */
    }

    class A{ }
    class B extends A{ }
    class C extends B{}
}
  • 为何java中的类不支持多继承

  

  • object类

3.方法重写 
  1.  什么是方法重写?
  •  当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。
  • 注意:重写后,方法的访问,Java会遵循就近原则。
      2. 方法重写其他注意事项
  •  重写小技巧:使用Override注解,他可以指定Java编译器,检查我们方法重写的格式是否正确,可提高代码的可读性。
  • 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限(public>protected>缺省)。
  • 重写的方法返回值类型,必须与重写方法的返回值类型一样,或者范围更小。
  • 私有方法、静态方法不能被重写,如果重写会报错
      3.方法重写的应用场景 

 子类重写Object类的toString()方法,以便返回对象的内容。

Student类

package com.zz.extend.override;

public class Student {
    private String name;
    private int 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 Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}

Test类

package com.zz.extend.override;

public class Test {
    public static void main(String args[]){
        B b = new B();
        b.print1();
        b.print2();

        System.out.println("=====");
        Student s = new Student("波妞", 12);
        System.out.println(s);//默认调用toString方法
    }
}

运行结果

4.在子类方法中访问其他成员( 成员变量、成员方法),依照就近原则
  •  先子类局部范围找。
  • 然后子类成员范围找。
  • 最后父类成员范围找,如果父类范围还没有找到则报错

 如果子父类中出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的怎么办?

 可以通过super关键字,指定访问父类的成员:super.父类成员变量/方法

可以通过this关键字,指定访问当前对象的成员:this.子类成员变量/方法

5 .子类构造器

  • 特点:子类的全部构造器都会先调用父类的构造器,再执行自己。

 子类构造器驶入和实现调用父类构造器的

  • 默认情况下,子类全部构造器的第一行代码都是super()(写不写都有),它会调用父类的无参构造器 。
  • 如果父类没有无参构造器,则我们必须在子类构造器的第一行手写super(...),指定去调用父类有参构造器。
class Z extends F{
    public Z{
        //super();默认存在,先调用父类(F)构造器
}

 应用场景

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值