继承(inheritance)

本文详细介绍了Java中的继承概念,包括`extends`关键字的使用,以及在不同访问权限下子类如何调用父类的属性和方法。同时,讲解了方法重写(override)的规则和注意事项,强调了子类如何扩展和覆盖父类的功能。此外,还讨论了对象转型,包括向上转型和向下转型的安全性和限制。最后,通过实例展示了子类在创建对象时调用属性、构造方法以及父类成员的过程。
摘要由CSDN通过智能技术生成

一、语法

关键字 : extends

格式:

public class 子类名 extends 父类名{
    
}



二、继承的范围

1. 子类以及子类对象 可以调用继承的哪些东西?

4个控制修饰符总结:

  • private——仅对本类可见
  • public——对外部完全可见
  • protected——对本包和所有子类可见
  • 缺省——对本包可见(default)

 

//本包

public class Student{
    public String name;
    private int id;
    protected  int age;
    int score;

    public void exam(){
        System.out.println("父类定义的考试方法");
    }

}


public class UNStudent extends  Student{

    public void printInfo(){
        /**
         * 在同包的子类中
         * private不可以调用
         * public、protected、缺省的可以调用
         */
        System.out.println("name:"+name);
//        System.out.println("id:"+id);
        System.out.println("age:"+age);
        System.out.println("score:"+score);
    }

    public void exam(){
        System.out.println("子类重写的考试方法");
    }


}


public class StuManage {

    public static void main(String[] args) {

        //在同包的非子类中,子类对象可以调用除private的属性
        UNStudent unstu1 = new UNStudent();
            unstu1.name="hunter0";
            unstu1.age=23;
            unstu1.score=100;

        //不同包的子类 在与父类同包的非子类中可以调用public 和Protectd
        MidStudent midstu1 = new MidStudent();
            midstu1.name = "hunter1";
            midstu1.age= 17;



    }
}

//不同包:
public class MidStudent extends Student {

    public void printInfo(){
        /**
         * 在不同的包的子类中
         * private和缺省的不可以调用
         * public和protected可以调用
         */
        System.out.println("name:"+name);
//        System.out.println("id:"+id);
        System.out.println("age:"+age);
//        System.out.println("score:"+score);
    }

    public static void main(String[] args) {
        // 在不同包的子类中 子类对象可以调用public 修饰的属性
        UNStudent unstu1= new UNStudent();
        unstu1.name="";
//        unstu1.age=20;
//        unstu1.score=20;

        MidStudent midstu1= new MidStudent();
        midstu1.name="";
        midstu1.age=20;


    }

}


public class StuManage {

    public static void main(String[] args) {

        //在不同包的非子类中,子类对象可以调用public修饰的属性
        UNStudent unstu1 = new UNStudent();
            unstu1.name="hunter0";
//            unstu1.age=20;
//            unstu1.score=20;


        MidStudent midstu1 = new MidStudent();
            midstu1.name = "hunter1";
//            midstu1.age= 17;




    }
}

三. 方法重写(override)

存在继承关系的前提:

子类中可以写与父类方法一致的方法
一般情况下: 要求子类中的方法除方法体之外皆与父类一致 子类以及子类对象会优先调用重写之后的方法

-- 继承父类,然后扩展父类方法的功能

动物类: 吃食物 老虎: 吃 -> 吃肉 牛: 吃-> 吃草

-- 检查重写是否正确:注解 @Override // 重写检查注解




四.转型

对象:

学生 男性 硕士研究生

对象名: 同一时刻编译只能具备一种类型
// 自动转型,子类对象可以自动转型为父类类型 A a = new B();// B 必须是 A的子类

向上转型: 自动转型 -- 安全 自动转型之后的变量不能调用子类独有的方法属性 向下转型: 强制转型 -- 不安全 注意哪里来的才能回哪里

对象原本的实际类型是什么,不要只看对象名所属的类型

int i = (int)1.2; --- 1.2 --- 1

父类: A
子类:C S
C --> A --强制的 >C
S --> A -- 强制> C 错误的 -- 类型转型异常

保证安全的强制转型:先比较对象是否是这一类型,再向这一类型转型

if (anObject instanceof String) {
String anotherString = (String)anObject;
}

五。 子类在创建对象时 调用属性、构造方法以及父类的属性、构造方法

public class User {

    String name;

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

    public User(){
        System.out.println("父类构造方法1");
    }

    public User(String name) {
        this.name = name;
        System.out.println("父类构造方法2");
    }

    // 静态方法
    public static void getName(){
        System.out.println("父类静态方法 ");
    }

    public void getInfor(){
        System.out.println("父类普通方法");
        System.out.println(name);
    }
}


 class Son extends User {

        int id;
    {
        System.out.println("子类代码块");
    }
    static {
        System.out.println("子类静态代码块");
    }


    public Son() {
        System.out.println("子类构造方法1");
    }


    public Son(String name, int id) {
        super(name);
        this.id = id;
        System.out.println("子类构造方法2");
    }

    // 静态方法
    public static void getName(){
        System.out.println("子类静态方法 ");
    }

    public void getInfo(){
        System.out.println("子类普通方法");
        System.out.println(name+id);
    }

    public static void main(String[] args) {

        Son son1 = new Son();
        System.out.println("****************************");
        Son son2 = new Son("hunter",1111111);
        System.out.println("****************************");
        System.out.println(son2.name);
        System.out.println(son2.id);
    }

}

output

父类静态代码块
子类静态代码块
父类代码块
父类构造方法1
子类代码块
子类构造方法1
****************************
父类代码块
父类构造方法2
子类代码块
子类构造方法2
****************************
hunter
1111111

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值