4

Java中有父类/子类、无参/有参构造方法、实例化父类/子类的区别,都明白了吗?

 1 year ago
source link: https://blog.51cto.com/u_11894/5745855
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Java中有父类/子类、无参/有参构造方法、实例化父类/子类的区别,都明白了吗?

精选 原创

小小迷糊 2022-10-11 10:14:46 博主文章分类:测试 ©著作权

文章标签 构造方法 父类 子类 测试 测试开发 文章分类 IT职场 其它 私藏项目实操分享 阅读数143

在学习java的父类、子类的用法时,突然提示了这个一个异常

   there is no default constructor available in ...的错误,看起来挺诡异的,为什么会出现这个错误提示呢?我们来看看

   有一个父类Animal

package extendsTest;
public class Animal {
private String name; private int id;
public Animal(String myName, int myId){
name = myName; id = myId; System.out.println("父类的构造方法"); }

public void cool(){
System.out.pr

该父类有一个有参构造方法 public Animal(String myName, int myId)

我们来看看继承的子类

package extendsTest;
public class Penguin extends Animal {
//企鹅:属性(姓名,id),方法(吃,睡,自我介绍) //有参构造方法 public Penguin(String myName,int myId){
//super(myName,myId); System.out.println("子类的构造方法"); }

public void funny(){
System.out.println("我是子类的方法"); }

在public Penguin(String myName, int myId)处出现红线提示

Java中有父类/子类、无参/有参构造方法、实例化父类/子类的区别,都明白了吗?_测试开发

为什么会出现这个提示呢,错误很明显 constructor,构造函数错误

子类继承了父类,但是父类没有默认的构造函数(Animal父类没有无参构造函数)(当类显示定义带参构造函数,而没有显示定义无参的情况,无参构造消失

继承了父类,那么子类就是父类的延伸。实例化的时候是父类先实例化但是子类中没有调用父类的构造方法 (有默认构造函数的就不用担心这个问题,会自动调用默认构造方法 因为不需要给参数)

所以只要在子类的构造方法中显示的调用父类的有参构造 super(args)就行啦,所以这个问题这么修改下就好了

package extendsTest;
public class Penguin extends Animal {
//企鹅:属性(姓名,id),方法(吃,睡,自我介绍) //有参构造方法 public Penguin(String myName,int myId){
super(myName,myId); System.out.println("子类的构造方法"); }

public void funny(){
System.out.println("我是子类的方法"); }

public static void main(String[] args) {
Animal am = new Animal("hello",1); //没法调用子类的方法 am.cool();// am.eat();// am.introduction();// am.sleep(); System.out.println("我是分隔符------------");

运行下,果然可以了。

下面,我们再聊下父类/子类的有参构造方法,对应的类的实例化

前提条件:

父类有参构造方法,也有非构造方法
子类有参构造方法,也有非构造方法

我们在子类中去操作以下步骤:

  1. 父类 xxx = new 父类 xxx;
  2. 父类 xxx = new 子类 xxx;
  3. 子类 xxx = new 子类 xxx;
  4. 子类 xxx = new 父类 xxx;

第4个最简单,直接报错了,不能子类实例化父类

  1. 可以调用父类的有参构造方法,可以调用父类里的非构造方法,不能调用子类的有参构造方法,不能调用子类的非有参构造方法
  2. 可以调用父类的有参构造方法,可以调用父类里的非构造方法,可以调用子类的有参构造方法,不能调用子类的非有参构造方法
  3. 可以调用父类的有参构造方法,可以调用父类里的非构造方法,可以调用子类的有参构造方法,可以调用子类的非有参构造方法

我们是怎么知道是否可以调用呢,其实直接写就可以了,是否能调用,编译器就会告诉你了。

下面多说一些,如果B继承于A, C继承与B,那么C可以调用A类里的有参构造方法和非构造方法么?大家可以下去试下

Java中有父类/子类、无参/有参构造方法、实例化父类/子类的区别,都明白了吗?_测试_02

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK