在讲这篇文章之前小编需要为大家补充一下基础,很多同学在学习对构造函数并没有很透彻,只停留在如何创建构造函数这一表层。这将使我们在学习这个知识时很吃力,所以必须把前面产生许多疑问解决掉。 如:为什么要创建构造函数,类中不创建构造函数可不可以和我不创建构造函数不也可以创建对象吗等疑问?
接下来由小编为大家系统性解答:
(1)、构造函数是用来创建和初始化对象。
(2)、可以不创建构造函数,但系统会帮你隐式的创建一个,这也是为什么你不创建也可以创建对象的原因
(3)、不管显式创建还是隐式的创建,一个类必须有构造函数。类中无构造函数则系统会自动创建一个无参构造,有则不会创建。
接下来进入今天的主题super关键字,由于子类不能继承父类的构造方法,因此,要显式调用父类的构造方法且必须在子类的构造方法的第一行使用super()方法。
常用情况:
1、用于当父类没有无参构造,使用super调用父类的有参构造
代码示例:
public class Test {
public static void main(String[] args) {
}
}
class Animal {
public Animal(String name) {
}
}
class Cat extends Animal {
public Cat(String name, int age) {
super(name);// 调用父类的有参构造方法
}
}
注:此代码无实际意义,只是为了理解该句。
2、用super访问父类字段和方法
代码示例
public class Test {
public static void main(String[] args) {
Cat cat = new Cat("动物","喵星人");
System.out.println(cat);
}
}
// 父类
class Animal {
String name;
//父类toString方法
public String toString() {
return "我是"+name;
}
}
// 子类
class Cat extends Animal {
String name;
public Cat(String fName, String sName ) {
//通过super关键字访问父类中的name属性
super.name = fName ;
//通过this关键字访问子类中的name属性
this.name = sName;
}
//子类toString方法
public String toString() {
//通过super访问父类toString方法,实现字符串拼接
return super.toString()+",我的名字叫"+this.name;
}
}
结果示例:
3、在子类中调用父类有参构造实现初始化父类的名称属性
代码示例
public class Test {
public static void main(String[] args) {
// 给子类对象初始化中调用父类有参构造实现初始化父类的名称属性
Cat cat = new Cat("Buddy", 5);
// 通过getName()方法获取父类私有属性name
System.out.println("Name: " + cat.getName());
// 通过getName()方法获取子类私有属性age
System.out.println("Age: " + cat.getAge());
}
}
class Animal {
// 声明私有属性name
private String name;
public Animal(String name) {
this.name = name;
}
// 创建公有方法使得外部类可以访问私有属性name
public String getName() {
return name;
}
}
class Cat extends Animal {
// 声明私有属性age
private int age;
// 创建公有方法使得外部类可以访问私有属性age
public Cat(String name, int age) {
super(name); // 调用父类的有参构造方法
this.age = age;
}
// 创建公有方法使得外部类可以访问私有属性age
public int getAge() {
return age;
}
}
结果示例:
今天内容就到这里,喜欢小编的为小编点点赞和关注,拜拜!