往父类的构造方法中添加了一个参数运行后会报错。我们之前说过,如果一个类没有写构造方法,我们调用它的话系统会给一个默认的无参数的构造方法,但若写了构造方法,这个默认的构造方法则不会调用。这一点父类也一样,我们在创建子类对象的时候会先调用父类的构造方法。而对于子类来说,无论父类有没有参数,都会调用默认的无参数的构造方法,但是因为上面代码中CC父类已经写了一个有参数的构造方法,所以父类中并没有一个默认的无参数的构造方法,编译器便会报错。
上面问题我们可以通过在父类中再写一个无参数的构造方法来解决或者在子类中调用父类的构造方法。
在子类中调用父类的构造方法:
package source;
class Circle {//公共类型的类必须定义在它回自己的文件里面。
public Circle(int a) { //构造方法
System.out.println("circle " + a);
}
public void ss(){
System.out.println("father");
}
}
public class Test extends Circle {
public Test(int a) {
super(a);//调用父类构造方法
System.out.println("Test " + a);
}
public void ss(){//函数重载
System.out.println("son");
}
public static void main(String[] args) {
int a = 1;
Test t = new Test(55);
t.ss();
}
}
package source;
public class FatherChild {
public static void main(String[] args) {
// 主方法开始
Child c = new Child();
// 实例化
}
}
class Father {
public Father() {
System.out.println("父类无参构造函数");
}
public Father(String name) {
System.out.println("父类有参构造函数");
}
}
class Child extends Father {
public Child() {
this("dd");
System.out.println("子类无参构造函数");
}
public Child(String name) {
// super("dd");
System.out.println("子类有参构造函数");
}
}
父类无参构造函数
子类有参构造函数
子类无参构造函数
默认调用父类无参的构造函数
package source;
public class FatherChild {
public static void main(String[] args) {
// 主方法开始
Child c = new Child();
// 实例化
}
}
class Father {
// public Father() {
// System.out.println("父类无参构造函数");
// }
public Father(String name) {
System.out.println("父类有参构造函数");
}
}
class Child extends Father {
public Child() {
this("dd");
System.out.println("子类无参构造函数");
}
public Child(String name) {
super("dd");
System.out.println("子类有参构造函数");
}
}
父类有参构造函数
子类有参构造函数
子类无参构造函数
super关键字调用父类带参数构造函数
栈与堆
package source;
class Person {//构造方法
String name;
public Person(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("hello " + name);
}
}
public class AppTest {
public static void main(String[] args) {
Person person = new Person("张三");
person.sayHello();
}
}
/*
新建一个main线程的一个栈jvm在方法区寻找是否存在Person类的信息如果没找到类加载器加载Person类信息到方法区,
然后在堆中创建Person对象,并持有方法区的引用把person添加到main主线程栈中,
并指向堆上的Person实例。执行person的sayhello方法,找到堆上的Person实例。
根据堆上Person的方法区引用,找到方法区上sayhello的字节码,然后执行完成。
*/