构造方法
构造方法的定义格式:
权限 方法名(参数列表){
}
方法的名字必须和类名一致,
构造方法没有返回值类型
public class Person {
private String name;
private int age;
public Person(){
System.out.println("I am null");
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
}
}
每个class必须有构造方法,不写也有(默认无参构造)
如果没有,编译器会自动添加一个构造方法
public Person(){}
构造方法是可以重载的
public class Person {
private String name;
private int age;
public Person(){
System.out.println("I am null");
}
public Person(String name,int age){
this.name = name;
this.age = age;
//System.out.println(this.name +" "+ this.age);
}
}
This关键字
在无参构造中调用有参构造方法
public class Person {
private String name;
private int age;
public Person(){
//调用了有参构造方法,参数传给了name,age
this("李四",20); //必须写在方法的第一行
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yx3ITGms-1586964293901)(E:\Typora\workspace\javaSE\面向对象\this调用构造方法内存图.JPG)]
super关键字
子类中,super()的方式,调用父类的构造方法
super() 调用父类的无参构造方法
super(参数) 调用父类的有参构造方法
子类的构造方法,有一个默认添加的构造方法
注意:子类构造方法中,有一个隐式代码 super()
public Student(){
super();
}
子类的构造方法第一行super语句,调用父类的构造方法
public class Person {
public Person(){
System.out.println("I am facther");
}
}
public class Student extends Person{
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EW9WhvO7-1586964293904)(E:\Typora\workspace\javaSE\面向对象\子类父类的内存图.JPG)]
public class Person {
public Person(int a){
//System.out.println("I am facther");
}
public Person(String s){
}
}
/*
注意:子类中所有的构造方法,无论重载多少个,第一行必须是super()
如果父类有多个构造方法,子类任意调用一个就行
super()语句必须是构造方法的第一行代码
*/
public class Student extends Person{
public Student(){
super(0);
}
}
// 构造方法第一行,写this()还是super()
// 不能同时存在,任选其一,保证子类的所有构造方法调用到父类的构造方法即可
public class Student extends Person{
public Student(){
//调用的是自己的构造方法
//间接形式调用到了父类的构造方法
this("abc")
}
public Student(String s){
super(1);
}
}
//小结论:无论如何,子类的所有构造方法,必须直接或间接调用到父类的构造方法
//子类的构造方法,什么都不写,默认的构造方法第一行是super()
)
}
public Student(String s){
super(1);
}
}
//小结论:无论如何,子类的所有构造方法,必须直接或间接调用到父类的构造方法
//子类的构造方法,什么都不写,默认的构造方法第一行是super()