Java:继承——父子类成员、构造访问顺序超详解(代码举例详解)

news/2024/12/22 11:00:18/

目录

一、父子类成员访问顺序

1、子类中访问父类的成员变量

2、子类中访问父类的成员方法

2.1 成员方法名字不同

2.1 成员方法名字相同

 3、带super、this 的执行举例

二、父子类构造访问顺序


一、父子类成员访问顺序

1、子类中访问父类的成员变量

代码示例:

class Animal {int age = 0;double weight = 5.0;
}
class Cat extends Animal {double weight = 9.5;String color = "Black";String name = "花花";public void display() {String name = "小黑";System.out.println(age);    //0System.out.println(weight);     //9.5System.out.println(color);      //BlackSystem.out.println(name);       //小黑}
}

总结:1、父类有子类没有的,访问从父类继承的成员变量

           2、父类有子类也有的,访问子类自己的成员变量

           3、父类没有子类有的,访问子类自己的成员变量

           4、子类父类都没有的,编译报错

           5、局部变量访问优先级高于成员变量

成员变量访问就近原则:自己有先访问自己的,自己没有再去父类中找

2、子类中访问父类的成员方法

2.1 成员方法名字不同

代码示例:

class Animal {public void methodA() {System.out.println("Animal————A");}
}
class Cat extends Animal {public void methodB() {System.out.println("Cat————B");}public void method() {methodA();  //Animal————AmethodB();  //Cat————B    //methodC();//编译报错}
}

总结:成员方法名不同时,在子类方法中或通过子类对象访问时,优先访问自己的,自己没有的时候再到父类中找,如果父类中也没有,则报错。

2.1 成员方法名字相同

代码示例:

class Animal {public void methodA() {System.out.println("Animal————A");}public void methodB() {System.out.println("Animal————B");}
}
class Cat extends Animal {public void methodA(int num) {System.out.println("Cat————A");}public void methodB() {System.out.println("Cat————B");}public void method() {methodA();      //Animal————AmethodA(1);     //Cat————AmethodB();      //Cat————B}
}

总结:1、方法同名时,如果参数列表相同,则就近访问

           2、如果参数列表不同,则根据参数选择合适的方法访问(方法的重载)

           3、如果没有该方法就报错

 3、带super、this 的执行举例

class Parent {public void printMe() {System.out.println("Parent_print");}
}class Child extends Parent {public void printMe() {System.out.println("Child_print");}public void printAll() {super.printMe();this.printMe();printMe();}
}public class Main{public static void main(String[] args) {Child child = new Child();child.printAll();}
}

执行结果为:

        

由此可知:当成员方法同名时,带super前缀,执行父类方法;带this前缀的,执行本类方法;不带前缀的,就近执行。

二、父子类构造访问顺序

父子即先有父,后有子。子类对象构造时,需先调用父类的构造方法。

代码示例:

class Base {public Base() {System.out.println("Base构造方法");}}class Child extends Base {public Child() {//super();//没写时编译器会自动添加 且一定是方法中的第一条语句System.out.println("Child构造方法");}
}

所以当我们要实例化一个Child类的对象时,会先后输出:

因为在Child类的构造方法中,会自动添加super()在第一条语句,调用父类的构造方法。

        所以我们可以知道,在我们构造子类对象时,先执行父类的构造方法,再执行子类的构造方法

注意:

1、若父类定义无参或默认的构造方法,则在子类构造方法的第一条默认会有隐含的super()调用。

2、如果父类定义的是有参的构造方法,则在子类中一定要显示定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。

3、在子类构造方法中,super(…)调用父类构造时,必须为方法中第一条语句。

4、super(…)只能在子类构造中出现一次,不能与this(…)同时出现。


        以上就是 Java:继承——父子类成员、构造访问顺序超详解(代码举例详解)的全部内容了,希望能对您有所帮助!您的点赞收藏就是对我最大的支持!


http://www.ppmy.cn/news/1352425.html

相关文章

Java中的序列化是什么?如何实现对象的序列化和反序列化?请解释Serializable接口的作用是什么?请解释transient关键字的作用是什么?为什么会使用它?

Java中的序列化是指将对象转换为字节序列的过程,以便可以在网络上传输或将其保存到持久存储介质中。反序列化则是将字节序列重新转换回对象的过程。Java提供了一种称为序列化(Serialization)的机制来实现对象的序列化和反序列化。 要实现对象…

算法详解(力扣141——环形链表系列)

博主ID:代码小豪 文章目录 环形链表环形链表的性质分析快慢指针法指针的追及相遇问题 环形链表(2) 环形链表 先来看看环形链表的原题: 中间的部分叙述有点繁杂,简单来概括就是,假如有一个节点&#xff0c…

PHP+vue+mysql校园学生社团管理系统574cc

运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp 前端框架:vue.js 服务器:apache 数据库:mysql 数据库工具:Navicat/phpmyadmin 前台功能: 首页:展示社团信息和活动…

如何用 ChatGPT 做项目管理?

ChatGPT 可以通过创建和维护跨团队项目协作计划,让员工更容易理解他们的角色和职责。 这个协作计划里面会包括每个团队或个人要执行的具体任务,每个任务最后期限和任何事情之 间的依赖关系。 该场景对应的关键词库:(24 个) 项目管理、项目协作计划、跨…

Nvm安装(windows版)

1、nvm 是什么 (1)nvm(Node.js version manager) 是一个命令行应用,可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 (2)有时候,我们可能同时在进行多个项目开发,而多个项…

【C#】.net core 6.0 创建默认Web应用,以及默认结构讲解,适合初学者

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…

database “postgres“ has a collation version mismatch

遇到这种情况,一般是apt更新之后,导致postgresql版本不匹配,可以使用下面的命令更改 #进入posgresql sudo -u postgres psql #查看数据库 \l #连接数据库 \c [DATABASE NAME]#更改版本,别忘记分号,两句命令执行完退出…

支持向量机SVM

支持向量机(SVM,Support Vector Machines)是一种广泛使用的监督学习方法,适用于分类、回归和其他任务。SVM的核心思想是找到一个最优的决策边界(在二维空间中是一条线,在更高维度是一个超平面)&…