Javainheritance示例
以下是inheritance的示例
class Parent { Parent(int a, int b) { int c = a + b; System.out.println("Sum=" + c); } void display() { System.out.println("Return Statement"); } } class Child extends Parent { Child(int a, int b) { int c = a - b; System.out.println("Difference=" + c); } } public class InheritanceExample { public static void main(String args[]) { Child c = new Child(2, 1); c.display(); } }
当我没有非参数化构造函数parent()时,我得到以下错误
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor at Child.(InheritanceExample.java:14) at InheritanceExample.main(InheritanceExample.java:22)
能否请您解释一下在基类中没有参数的构造函数的用途是什么。
class child extends parent { child(int a,int b) { int c=ab; System.out.println("Difference="+c); } }
子类构造函数必须做的第一件事就是调用父类构造函数。 如果你没有明确地这样做(例如super(a,b)
),则暗示默认构造函数的调用( super()
)。
为此,您必须具有此默认构造函数(不带任何参数)。
如果您没有声明任何构造函数,那么您将获得默认构造函数。 如果声明至少一个构造函数,则不会自动获取默认构造函数,但可以再次添加它。
您收到的错误消息是抱怨对super()
的隐含调用不起作用,因为父类中没有这样的构造函数。
有两种方法可以解决它:
- 添加默认构造函数
- 在子构造函数的第一行中,调用非默认的父构造函数(
super(a,b)
)
另外,请不要使用全小写的类名。
它要求parent()的原因是因为child扩展了parent,但是你没有在子构造函数中显式调用super(a,b)。 由于没有对父构造函数的显式调用,javac尝试调用默认构造函数parent()并在无法找到它时进行抱怨。
您可以使用以下代码查看:
class parent { public parent() { System.out.println("Parent Constructor"); } public parent(int a,int b) { int c=a+b; System.out.println("Sum="+c); } public void display() { System.out.println("Return Statement"); } } class child extends parent { public child(int a,int b) { int c=ab; System.out.println("Difference="+c); } } public class InheritanceExample { public static void main(String args[]) { child c=new child(2,1); c.display(); } }
输出:
Parent Constructor Difference=1 Return Statement
此外,这没有默认构造函数可以正常工作:
class parent { public parent(int a,int b) { int c=a+b; System.out.println("Sum="+c); } public void display() { System.out.println("Return Statement"); } } class child extends parent { public child(int a,int b) { super(a,b); int c=ab; System.out.println("Difference="+c); } } public class InheritanceExample { public static void main(String args[]) { child c=new child(2,1); c.display(); } }
输出:
Sum=3 Difference=1 Return Statement
我认为有一个类似的问题:
为什么派生类构造函数总是访问基类构造函数?
你可以这样想:由于“child”inheritance自“parent”,“child”也必须是“parent”(多态)的有效实例才能表现为“parent”本身。 因此,“child”必须做的第一件事就是将自身构造为有效的“父” – 因此通过super()调用“parent”的构造函数必须是构造函数中的第一个方法调用。 如果不存在此类调用,则会对“父”的无参数构造函数进行隐式调用。
错误是因为如果我们不显式调用super,那么JVM将super()放在子类的构造函数中,这个super()搜索父类中的构造函数而不使用不在类中的参数,因此它是错误。 要么将非参数化构造函数放在父类中,要么将语句super(a,b)放在子构造函数的第一行中。
class Parent { Parent(int a, int b) { int c = a + b; System.out.println("Sum=" + c); } void display() { System.out.println("Return Statement"); } } class Child extends Parent { Child(int a, int b) { super(a,b); int c = a - b; System.out.println("Difference=" + c); } } class InheritanceExample { public static void main(String args[]) { Child c = new Child(2, 1); c.display(); } }
public class Mobile{ private String manufacturer; private String operating_system; public String model; private int cost; Mobile(String man, String o,String m, int c){ this.manufacturer=man; this.operating_system=o; this.model=m; this.cost=c; } public String getModel(){ return this.model; } } public class Android extends Mobile{ Android(String man, String o,String m, int c){ super(man,o,m,c); } public String getModel(){ return "This is Android mobile" +model; }
import java.io.*; public class XXX { public static void main()throws IOException { System.out.println("Enter your name."); String name = in.readLine(); System.out.println(name+" rules!! Thank You!!"); } }