this在构造方法间的使用,
public class Person { private String name; private int age; public Person() { //this()是调用其他的构造方法 //this()必须写在构造方法第一行 this("张三", 20); } public Person(String name, int age) { this.name = name; this.age = age; } }
public class Test { public static void main(String[] args) { Person p1 = new Person("张三", 18); Person p2 = new Person(); } }
super:
在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的super();语句父类的构造方法第一行也有隐式的super();语句,所有的类都有一个object祖宗类,父类都继承object类
super()和this()的区别
this()是调用自己的构造方法
super()是调用父类的构造方法
public class Fu { public Fu(){ System.out.println("这是父类构造方法");
}
}
public class Zi extends Fu { public Zi() { //这里有隐式的super(); System.out.println("这是子类构造方法"); } }
public class Test1 { public static void main(String[] args) { new Zi(); } }//运行结果:这是父类构造方法 ,
// 这是子类构造方法
子类和父类内存:
创建子类对象对象空间中,划分两个空间,一个存放父类用super标记,一个存放自己用this标记;父类成员变量随子类进入划分给父类的区域,(super标记的区域)
父类的构造方法如果有参数,子类必须写全,
子类可以重载构造方法,不过第一行必须是super();
(上面this中写到,this()必须写在第一行,在这里写到super()必须写在第一行,这里就存在矛盾,因此这两个关键字不能共存,要保证子类的所有构造方法直接或间接调用到父类的构造方法即可,具体如下代码)
父类如果有多个构造方法,子类任意调用一个就行;
public class Fu { public Fu() { } }
public class Zi extends Fu { public Zi() { this("hhh");//调用自己的构造方法,间接调用父类构造方法 } public Zi(String s){ super(); } }
super用法:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class Student extends Person { public Student(String name, int age) { super(name, age); } }
public class Teacher extends Person { public Teacher(String name, int age) { super(name, age); } }
public class Test1 { public static void main(String[] args) { Student s=new Student("学生", 18); Teacher t=new Teacher("老师", 28); System.out.println(s.getName()); System.out.println(t.getAge()); } }