有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否不需要在构造函数中放入super()?

如果我不把它放在子类的构造函数中,编译器不是会自动把它放进去吗

那意味着我根本不需要关心它?在一些文章中,他们把它发表了

如果我有一个带参数的构造函数,这个是构造函数,还是不带参数列表的构造函数


共 (5) 个答案

  1. # 1 楼答案

    调用无参数超级构造函数只是浪费屏幕空间和程序员时间。无论您是否编写,编译器都会生成完全相同的代码

    class Explicit() {
        Explicit() {
            super();
        }
    }
    
    class Implicit {
        Implicit() {
        }
    }
    

    更新(2018年12月):

    编写显式super()有助于在IDE中导航源代码

    截至2018年12月,Eclipse和IntelliJ都没有提供从派生类的构造函数轻松导航到基类的构造函数的任何方法

  2. # 2 楼答案

    默认父构造函数是从子默认构造函数调用的,即使您没有调用它

    主要

    public class Main {
    
        public static void main(String[] args) {
            A a = new B();
        }
    }
    

    A

    public class A {
    
        public A() {
            System.out.println("A");
        }
    }
    

    B

    public class B extends A {
    
        public B() {
            System.out.println("B");
        }
    }
    

    印刷品

    A
    B
    
  3. # 3 楼答案

    如果没有显式调用super([arguments]),任何类构造函数都会调用“super()”,只是我们在编程时要记住对超类构造函数的访问。。。 当我们不扩展任何特定类时,自动扩展java。对象类

  4. # 4 楼答案

    首先是一些术语:

    • 无参数构造函数:无参数的构造函数
    • 可访问的无参数构造函数:子类可见的超类中的无参数构造函数。这意味着它要么是公共的,要么是受保护的,或者,如果两个类在同一个包中,则为包访问;及
    • 默认构造函数:当类中没有显式构造函数时,编译器添加的公共无参数构造函数

    所以所有类都至少有一个构造函数

    子类构造函数可以在执行子类构造函数中的代码之前,首先指定调用超类中的哪个构造函数

    如果子类构造函数没有指定要调用的超类构造函数,那么编译器将自动调用超类中可访问的无参数构造函数

    如果超类没有无参数构造函数或不可访问,则不指定要调用的超类构造函数(在子类构造函数中)是一个编译器错误,因此必须指定它

    例如:

    public class Base { }
    public class Derived extends Base { }
    

    这很好,因为如果您没有显式添加构造函数,Java会为您添加一个公共默认构造函数

    public class Base { }
    public class Derived extends Base { public Derived(int i) { } }
    

    也很好

    public class Base { public Base(String s) { } }
    public class Derived extends Base { }
    

    以上是一个编译错误,因为Base没有默认构造函数

    public class Base { private Base() { } }
    public class Derived extends Base { }
    

    这也是一个错误,因为Base的no args构造函数是私有的

  5. # 5 楼答案

    abstract class Book
     {
    String title;
    String author;
    Book(String t,String a){
        title=t;
        author=a;
    }
    abstract void display();
    
    }    
    

    如果超类可以有一个无参数构造函数。最好有一个无参数构造函数,否则必须传递带参数的超级构造函数

    如果超类没有参数构造函数或无法访问,则不指定要调用的超类构造函数(在子类构造函数中)是编译器错误,因此必须指定它

    class MyBook extends Book{   
    int price ;
    public  MyBook(String t,String a,int price){
         super(t,a);
        this.price=price;
    }
    
    public void display(){
        System.out.println("Title: "+title);
     System.out.println("Author: "+author); 
    System.out.println("Price: "+price);
    
    }
    

    }