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

在学习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类里的有参构造方法和非构造方法么?大家可以下去试下

发表评论

相关文章