• JAVA继承


    目录

    概念

    1、super关键字

    2、继承关系上的执行顺序

    3、protected 关键字

    4、继承与接合

    5、final 关键字


    概念

    理解

    将相同的属性和方法提出来构成一个方法 然后可以被继承

    子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。先有父再有子,所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整 ,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整 。

    内容

    1、this会优先访问子类自己的,如果子类没有,访问的就是父类的

    2、super只是一个关键字,在代码层面上,能够达到易读的效果。只访问父类的

    3、此时虽然执行了父类的构造方法,但是并没有生成父类的对象,这里只是帮助子类初始化从父类继承过来的属性。

    注意:

    1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构 造方法
    2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的 父类构造方法调用,否则编译失败。
    3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
    4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

    代码

    1. class Animal{
    2. public String name;
    3. public int age;
    4. public Animal(String name,int age)//父类构造方法
    5. {
    6. this.name = name;
    7. this.age = age;
    8. }
    9. public void eat(){
    10. System.out.println(name+"吃饭");
    11. }
    12. }
    13. class Dog1 extends Animal{
    14. // 傻 是狗1的特殊属性
    15. public boolean silly;
    16. //有参数要自己显性构造方法
    17. public Dog1(String name,int age,boolean silly){
    18. super(name,age);//必须在第一行,先帮父类部分初始化
    19. this.silly = silly;
    20. }
    21. public void houseGuard(){
    22. System.out.println(super.name+"正在看家护院");
    23. System.out.println(name+"正在看见护院");
    24. }
    25. }
    26. /*class Cat extends Animal{
    27. // 猫特有的行为
    28. public void catchMouse(){
    29. System.out.println(name+"抓老鼠");
    30. }
    31. }*/
    32. public class TestAnimal {
    33. public static void main(String[] args) {
    34. Dog1 dog = new Dog1("xiao",18,false);
    35. //Cat cat = new Cat();
    36. }
    37. }

    1、super关键字

    理解

    1. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
    2. 在构造方法中:super用于调用父类构造方法,不能同时与this在构造方法中出现  

    3. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加

    内容

    Dog1 dog = new Dog1("xiao",18,false);
    

    带参数的构造需要自己创建构造函数

    创建Dog1对象的时候会调用

    1. public Dog1(String name,int age,boolean silly){
    2. super(name,age);//必须在第一行,先帮父类部分初始化
    3. this.silly = silly;
    4. }

    super可以理解成调用

    1. public Animal(String name,int age)//父类构造方法
    2. {
    3. this.name = name;
    4. this.age = age;
    5. }

    代码

    1. class Animal{
    2. public String name;
    3. public int age;
    4. public Animal(String name,int age)//父类构造方法
    5. {
    6. this.name = name;
    7. this.age = age;
    8. }
    9. }
    10. class Dog1 extends Animal{
    11. // 傻 是狗1的特殊属性
    12. public boolean silly;
    13. //有参数要自己显性构造方法
    14. public Dog1(String name,int age,boolean silly){
    15. super(name,age);//必须在第一行,先帮父类部分初始化
    16. this.silly = silly;
    17. }
    18. // 狗的特有行为
    19. public void houseGuard(){
    20. System.out.println(super.name+"正在看家护院");
    21. System.out.println(name+"正在看见护院");
    22. }
    23. }
    24. public class TestAnimal {
    25. public static void main(String[] args) {
    26. Dog1 dog = new Dog1("xiao",18,false);
    27. }
    28. }

    2、继承关系上的执行顺序

    理解

    静态——实例——构造

    内容

    结论:

    1、父类静态代码块优先于子类静态代码块执行,且是最早执行

    2、父类实例代码块和父类构造方法紧接着执行

    3、子类的实例代码块和子类构造方法紧接着再执行

    4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

    注意:

    1. 静态代码块先执行,并且只执行一次,在类加载阶段执行
    2. 当有对象创建时,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

    代码

    1. class Person {
    2. public String name;
    3. public int age;
    4. public Person(String name, int age) {
    5. this.name = name;
    6. this.age = age;
    7. System.out.println("1:Person:构造方法执行");
    8. }
    9. {
    10. System.out.println("2:Person:实例代码块执行");
    11. }
    12. static {
    13. System.out.println("3:Person:静态代码块执行");
    14. }
    15. }
    16. class Student extends Person{
    17. public Student(String name,int age) {
    18. super(name,age);
    19. System.out.println("4:Student:构造方法执行");
    20. }
    21. {
    22. System.out.println("5:Student:实例代码块执行");
    23. }
    24. static {
    25. System.out.println("6:Student:静态代码块执行");
    26. }
    27. }
    28. public class TestDemo4 {
    29. public static void main(String[] args) {
    30. Student student1 = new Student("张三",19);
    31. System.out.println("===========================");
    32. Student student2 = new Student("李四",20);
    33. //代码输出为:14 2356

    3、protected 关键字

    理解

    可在不同包的子类里调用

     

    内容

    注意:父类中private成员变量虽然在子类中不能直接访问,但是也继承到子类中了

    代码

    1. package demo1;//在demo1下的同一类
    2. public class TestDemo {
    3. protected int a = 10;//a被protected修饰
    4. public void func(){
    5. System.out.println(a);
    6. }
    7. }
    1. package demo1;//在demo1下的不同类
    2. public class TestDemo2 {
    3. public static void main(String[] args) {
    4. TestDemo testDemo = new TestDemo();
    5. System.out.println(testDemo.a);
    6. }
    7. }
    1. package demo2;//在demo2不同包的子类
    2. import demo1.TestDemo;
    3. //不同包的子类
    4. public class Test extends TestDemo {
    5. public void test(){
    6. System.out.println(super.a);
    7. }
    8. public static void main(String[] args) {
    9. Test t = new Test();
    10. t.test();
    11. }
    12. }

    4、继承与接合

    理解

    继承:可以看做 是 is - a的关系 class Dog extends Animal Dog is a Animal
    组合:a part of / has-a 的关系 学生和老师 是学校的一部分 学校有学生和老师

    内容

     

    组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用组合。

    代码

    1. // 轮胎类
    2. class Tire{
    3. // ...
    4. } // 发动机类
    5. class Engine{
    6. // ...
    7. } // 车载系统类
    8. class VehicleSystem{
    9. // ...
    10. }
    11. class Car{
    12. private Tire tire; // 可以复用轮胎中的属性和方法
    13. private Engine engine; // 可以复用发动机中的属性和方法
    14. private VehicleSystem vs; // 可以复用车载系统中的属性和方法
    15. // ...
    16. } // 奔驰是汽车
    17. class Benz extend Car{
    18. // 将汽车中包含的:轮胎、发送机、车载系统全部继承下来
    19. }

    5、final 关键字

    理解

    final关键可以用来修饰变量、成员方法以及类。

    内容

    1. 修饰变量或字段,表示常量(即不能修改)
    2. 修饰类:表示此类不能被继承 String 字符串类, 就是用 final 修饰的, 不能被继承. 

    3. 修饰方法:表示该方法不能被重写
       

    代码

    1. final int a = 10;
    2. a = 20; // 编译出错
    1. final public class Animal {
    2. ...
    3. }
    4. public class Bird extends Animal {
    5. ...
    6. }
    7. // 编译出错Error:(3, 27) java: 无法从最终com.bit.Animal进行继

     

  • 相关阅读:
    SE-ResNet34对结构性数据进行多分类
    设计模式(5)--模板方法模式概念要点及例子说明
    k8s-生产级的k8s高可用(1) 24
    融云直播 SDK 玩法翻新,入围信通院「实时互动创新应用优秀案例」
    [TS基础]开发环境,类型的声明
    排序算法之---归并排序
    maven的下载以及配置的详细教程(附网盘下载地址)
    如何设计一个优惠券系统
    io_uring 之 liburing 的简单使用
    锐捷NBR路由器fileupload.php任意文件上传漏洞
  • 原文地址:https://blog.csdn.net/qq_35056587/article/details/126852533