3

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

 2 years ago
source link: https://blog.51cto.com/u_11894/5657541
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初学踩坑-构造方法/super()/类的实例化,这些你都了解么

精选 原创

小小迷糊 2022-09-07 10:19:57 博主文章分类:测试 ©著作权

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

大家在学习编程语言的时候,根据上手的难易程度,一般选择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类带参构造方法
子类有参构造方法调用

不积跬步,厚积薄发


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK