super详解
什么是super?
1.super怎么用?
- 在讲解之前,先建立三个程序,一个是主程序,一个是student类(子类),另一个是person类(父类)。
- 咱们的主程序肯定是要调用student类的,student类是继承person类的。
- 咱们先看一下这三个程序的代码。
2.调用属性的时候
- 先看看person(父类)
public class person {
protected String name="gao";
}
- 然后写个student(基类)
public class student extends person{
private String name="GAO";
public void test(String name){ //这地有个形参,表示需要主程序里面的实参给他传递参数。
System.out.println(name);
System.out.println(this.name); //this表是输出本类的name
System.out.println(super.name);// super则表示输出person(父类)的name.
}
}
- 然后写个主程序
public class application {
public static void main(String[] args) {
student student = new student();
student.test("GAOming"); //这个GAOming 表示是实参,传给text方法的形参。
}
}
===================================================
那么他的最终输出结果就是
Gaoming
GAO
gao
- 通过这个程序不难发现super和this的区别。
3.调用方法的时候
咱们再看一下用调用方法的时候一些问题。
- person类(父亲)
public class person {
public void say(){
System.out.println("person");
}
}
- student类(子类)
public class student extends person{
public void say(){
System.out.println("student");
}
public void test1(){
say(); //这个既没有this和super,它默认的是调用本类的方法。
this.say(); //使用了this他肯定是调用了本类的方法。
super.say(); //使用了super他肯定是调用了父类的方法。
}
}
- 主程序
public class application {
public static void main(String[] args) {
student student = new student();
student.test1();
}
}
========================================
他的最终出结果
student
student
person
也就是说,没有加this和super的时候,他是默认调用本类的方法。
- 咱们现在将父类的方法改成,private,代码如下
public class person {
private void say(){
System.out.println("person");
}
}
此时主程序和student类(子类)是爆红的,也就是说他不能运行。可以得出一个结论:私有的东西无法被继承。
4.探究一下无参构造器在里面是怎么运行的
- 咱们之前说过,调用一个对象的时候,他是先走无参构造器的。那么咱们给无参构造器加一个 输出。
- person(父类)
public class person {
public person(){
System.out.println("person无参构造器在这");
}
}
- studen(子类)
public class student extends person{
public student(){
System.out.println("student无参构造器在这");
}
}
- 主程序
public class application {
public static void main(String[] args) {
student student = new student();
}
}
==========================================
他的最终输出结果是
person无参构造器在这
student无参构造器在这
我们只是new了一个student类的对象,他却也罢person类的无参构造输出了,也就是说再student(子类)里面有一个隐藏代码,位置如下
- 子类
public class student extends person{
public student(){
//隐藏代码:调用了父类的无参构造。
super(); //若要显示定义,他必须放student类的无参构造里面的最前面,在他前面不能有任何东西,否则会报错。
System.out.println("student无参构造器在这");
}
}
也就是调用父类的构造器,必须要在子类的第一行。
- 咱们之前还说过:当你写了一个有参构造的时候,无参构造就没了,那么这种情况下会怎么运行。
此时咱们再输入这个子类代码,他就会爆红。
public class student extends person{
public student(){ //public student 爆红
super(); //super(); 爆红
System.out.println("student无参构造器在这");
}
}
因为父类里面的无参构造没有了,不管写不写super();这个子类的无参构造都会爆红。
那么我们就是想用子类的无参构造,咱们需要在子类的无参构造,写上super(“name”);即调用父类的有参构造,那么这个子类的无参构造就不会爆红了。