关于java中的Super详解
我们在上一篇文章中了解到了面向对象三大基本特征,继承,我们本篇文章中来了解一下Super😀。
一、Super和this调用属性
- this:当前类中使用。
- super:父类使用。
我们直接用代码来说明一下。
1、首先我们新建一个人类,一个学生类,然后让学生类去继承人类。
//人类
public class Person
{
}
//学生类
public class Student extends Person
{
}
2、我们在父类(人类)中,定义一个属性,用受到保护修饰符protected去声明一个名字name,然后在学生类(子类)里面声明一个私有属性name,并且在学生类(子类)定义一个方法去输出名字。
//人类
public class Person
{
protected String name="xiaoming";
}
//学生类
public class Student extends Person
{
private String name="ming";
public void test(String name)
{
System.out.println(name);//传参的name
System.out.println(this.name);//当前类的name
System.out.println(super.name);//父类的name
}
}
3、我们用main方法调用一下,创建学生类的对象。
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test("羊");
}
}
我们执行以下输出结果,可以发现,输出的东西也是我们定义属性赋值的内容。
羊
ming
xiaoming
进程结束.......
二、Super和this调用方法
1、我们在学生类和人类中,都定义一个输出的方法。
//人类
public class Person {
protected String name="xiaoming";
public void print()
{
System.out.println("Person");
}
}
//学生类
public class Student extends Person
{
private String name="ming";
public void print()
{
System.out.println("Student");
}
public void test(String name)
{
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
public void test1()
{
print();//当前类中的方法,但是不建议这样去写,因为会分不清
this.print();//当前类中的方法
super.print();//父类中的方法
}
}
3、我们用main方法调用一下。
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test1();
}
}
4、我们执行以下输出结果。
Student
Student
Person
进程结束.....
5、如果把父类(人类)中的方法换成私有的方法,就会无法被调用,因为私有的东西无法被继承。
三、隐藏的代码
我们在学构造器的时候,知道无参构造是被隐藏的,但是我们这里给它写出来,然后输出一句话,学生类和人类都写出来。
- ALT+INS(快捷键)
//人类
public class Person {
public Person() {
System.out.println("Person无参执行");
}
}
//学生类
public class Student extends Person
{
public Student()
{
//隐藏代码:调用了父类的无参
super();
//调用父类构造器必须放在子类构造器的第一行
System.out.println("Student无参执行");
}
}
我们在main方法中只创建对象然后直接执行。
public class Application {
public static void main(String[] args) {
Student student = new Student();
}
}
Person无参执行
Student无参执行
进程结束......
- 所以,隐藏代码调用了父类的无参(super();)
- 调用父类构造器必须放在子类构造器的第一行。
- 不写也可以,这里只是展示一下隐藏代码的样子😊。
- 在父类中写了有参构造,必须要写出无参构造,如果不在父类写出无参,默认隐藏调用是无参,会导致程序报错。
四、super和this注意点
- super
1、super调用父类的构造方法,必须在构造方法的第一个
2、super 必须只能出现在子类的方法或者构造方法中!
3、super和 this 不能同时调用构造方法!
- this
1、代表的对象不同:
this:本身调用者这个对象
super: 代表父类对象的应用前提
2、没有继承也可以使用this
3、super:只能在继承条件才可以使用构造方法。
4、this();本类的构造
5、super();父类的构造
五、idea向右拆分
我们可以点击页面,右键,向右拆分或者向左拆分,来把代码分页,这样比较方便大家观看😊
- ALT+1 关闭项目结构