Java初学踩坑-构造方法/super()/类的实例化,这些你都了解么

大家在学习编程语言的时候,根据上手的难易程度,一般选择Python的比较多。Python的编程形式更自由化,且容易被人理解。

  Java就不一样了,使用前需要先声明,还要给变量指定类型。麻烦倒是其次,最重要的是理解和使用。比如构造方法。

      下面我们来看看这个例子,为什么继承的子类实例化会报错

      

public class Puppy {
//创建类的默认构造方法(无参) public Puppy(){
System.out.println("类Puppy的默认构造方法"); }

public Puppy(String name){ //带参构造方法 System.out.println("Puppy类带参构造方法"); }
}

首先我们在父类中创建2个构造方法

其中一个为默认无参构造方法,一个为有参构造方法

然后我们在子类中,想要调用父类的有参构造方法,对子类进行实例化(加参数)

public class Tomorrow extends Puppy{

public static void main(String[] args){

Tomorrow tr = new Tomorrow("TK"); // 运行后结果为: 类Puppy的默认构造方法 }

}

我们来看看运行结果:

Error:(5, 23) java: 无法将类 Tomorrow中的构造器 Tomorrow应用到给定类型;
  需要: 没有参数
  找到: java.lang.String
  原因: 实际参数列表和形式参数列表长度不同

  我们先尝试调用下父类的无参构造方法,将子类main中的参数去掉

 

public class Tomorrow extends Puppy{

public static void main(String[] args){

Tomorrow tr = new Tomorrow(); // 运行后结果为: 类Puppy的默认构造方法 }

}

ok,运行后,结果为 类Puppy的默认构造方法

我们再给子类加上无参构造函数

public class Tomorrow extends Puppy{

public Tomorrow(){
System.out.println("子类的无参构造方法"); }

public static void main(String[] args){

Tomorrow tr = new Tomorrow(); // 运行后结果为: 类Puppy的默认构造方法 }

}

运行下看看结果

类Puppy的默认构造方法
子类的无参构造方法

说明当子类实例化时,先调用父类的无参构造方法,然后调用子类的无参构造方法

那么,如果想调用父类的有参构造方法呢,直接在子类main中()添加参数是不行的。我们来试下在子类中添加有参构造方法

public class Tomorrow extends Puppy{

public Tomorrow(){
System.out.println("子类的无参构造方法"); }

public Tomorrow(String name){
}

public static void main(String[] args){
Tomorrow tr1 = new Tomorrow("1"); }

运行结果,还是只能显示父类的无参构造方法。这时候,发现原来是子类的有参构造方法内容是空的。我们来修改下

public class Tomorrow extends Puppy{

public Tomorrow(){
System.out.println("子类的无参构造方法"); }

public Tomorrow(String name){
System.out.println("子类有参构造方法" + name); }

public static void main(String[] args){
Tomorrow tr1 = new Tomorrow("1"); }

}

运行下。哈哈,调用子类的有参构造方法了,但是父类的没有调用,因为没有显示出来。运行结果为:

类Puppy的默认构造方法
子类有参构造方法1

再想想,还有什么忘记了,原来是没有用到super()关键字

修改下代码再看看

public class Tomorrow extends Puppy{

public Tomorrow(){
System.out.println("子类的无参构造方法"); }

public Tomorrow(String name){
super(name); }

public static void main(String[] args){
Tomorrow tr1 = new Tomorrow("1"); }

}

看下运行结果

哈哈,对了

Puppy类带参构造方法

我们来看看super()的含义,super可以理解为是指向自己超(父)类对象的一个指针。这里我们用super()的主要原因就是来调用父类的构造方法,加上参数后,就是调用父类有参的构造方法

来让我们最后更新下子类的代码,将父类的无参构造方法和有参构造方法都调用下

父类代码

public class Puppy {
//创建类的默认构造方法(无参) public Puppy(){
System.out.println("类Puppy的默认构造方法"); }

public Puppy(String name){ //带参构造方法 System.out.println("Puppy类带参构造方法"); }
}

子类代码

public class Tomorrow extends Puppy{

public Tomorrow(){

}

public Tomorrow(String name){
super(name); }

public static void main(String[] args){
Tomorrow tr = new Tomorrow(); //调用父类无参构造方法 Tomorrow tr1 = new Tomorrow("1"); //调用父类有参构造方法 }

}

如果我们还想运行下子类本身的无参构造方法和有参构造方法,我们这样

public class Tomorrow extends Puppy{

public Tomorrow(){
System.out.println("子类无参构造方法调用"); }

public Tomorrow(String name){
super(name); System.out.println("子类有参构造方法调用"); }

public static void main(String[] args){
Tomorrow tr = new Tomorrow(); //调用父类无参构造方法 Tomorrow tr1 = new Tomorrow("1"); //调用父类有参构造方法 }

}

看下运行结果:

类Puppy的默认构造方法
子类无参构造方法调用
Puppy类带参构造方法
子类有参构造方法调用

成功~

发表评论

相关文章