目录
JAVA入门级教学之(super关键字)
1.super关键字用在构造方法中:
2.语法规则:
3.注意:super();的调用只能放在构造方法的第一行,和this();的调用规则一样
4.通过子类的构造方法去调用父类的构造方法
5.super();调用了父类中的构造方法,但是不会创建父类对象 ,只是为了给当前子类对象中的父类型特征赋值
6.为什么super();不会创建对象呢?
7.因此:构造方法执行,不一定创建对象【这个的意思指的是super关键字的意思】
8.父类的构造方法并不会被子类继承,但是可以被子类去调用
JAVA入门级教学之(super关键字)
1.super关键字用在构造方法中:
语法:
super(实参);【通过子类的构造方法去调用父类的构造方法】
this(实参);【通过一个构造方法去调用另一个构造方法,实现代码重用,调用当前对象的构造方法】
2.语法规则:
一个构造方法第一行如果没有this();也没有显示的去调用super();
系统会默认调用super();并且是一级一级往父类去调用
3.注意:super();的调用只能放在构造方法的第一行,和this();的调用规则一样
super()和this()不能共存在同一个构造函数内
构造方法的第一行如果什么都不写的话就会默认调用父类的无参数构造方法【super();】
4.通过子类的构造方法去调用父类的构造方法
作用是:给当前子类对象中的父类型特征赋值
super(值1,值2.....);
5.super();调用了父类中的构造方法,但是不会创建父类对象 ,只是为了给当前子类对象中的父类型特征赋值
6.为什么super();不会创建对象呢?
按道理来说,一个类我们只会给它实现一个对象,但是如果继承过来的东西也实例化的话,相当于实例化了Object,实例化Account,
实例化当前对象,一共有三个对象,这样会导致混乱
7.因此:构造方法执行,不一定创建对象【这个的意思指的是super关键字的意思】
8.父类的构造方法并不会被子类继承,但是可以被子类去调用
补充:
1:super是一个关键字,全部小写
2:super和this对比学习:
this:
this 能出现在实例方法和构造方法中
this 的语法是 this. 或者 this()
this 不能使用在静态方法中
this 大部分情况下可以省略
this 在什么情况下不能省略呢?
在局部变量和实例变量的时候不能省略
public void serName(String name){
this.name=name;
}
this() 只能出现在构造方法的第一行,通过当前的构造方法去调用本类中的其它构造方法,目的是:代码复用
super:
super 能出现在实例方法和构造方法中
super 的语法是 super. 或者 super()
super 不能使用在静态方法中
super 大部分情况下可以省略
super 在什么情况下不能省略呢?
super() 只能出现在构造方法的第一行,通过当前的构造方法去调用父类中的其它构造方法,目的是:创建子类对象的时候,先初始化父类型特征
代码演示:
public class Teat01 {public static void main(String[] args){new B();}
}class A{public A(){System.out.println("这是A类的无参构造方法");}
}class B extends A{public B(){System.out.println("这是B类的无参构造方法");}
}
运行结果:
运行结果分析:
创建对象后,先掉用父类,再调用子类
3:super()
表示通过子类的构造方法调用父类的构造方法
模拟的是现实世界中,要是想要有儿子,先需要有父亲的存在
4:一个类如果没有手动添加任何构造方法,系统会默认提供一个无参构造方法
一个类如果手动添加一个构造方法,那么系统将不会提供无参构造方法
代码演示:
public class Teat01 {public static void main(String[] args){new B();}
}class A{
// public A(){
// System.out.println("这是A类的无参构造方法");
// }public A(int i){}
}class B extends A{public B(){System.out.println("这是B类的无参构造方法");}
}
演示结果:
5:重要结论:
当一个构造方法的第一行:
既没有明显写出this() 又没有明显写出super()
系统会默认添加super()
表示通过当前子类的构造方法调用父类的无参构造方法,所以必须保证父类的无参构造方法是存在的。
因此一般都会显式添加类的无参构造方法
super() 和 this () 不能共存
括号中有参数和无参数也不能共存
他们都只出现在构造方法的第一行
有了一个后不能出现第二个
在java语言中,不管是new什么对象,最后老祖宗的Object类的无参构造方法一定会执行
由于继承关系,所有的类都是继承自一个父类 Object 类,因此Object 类中的无参构造方法一定是最先执行的
object 类的无参构造方式处于 “栈”的顶部
定义一个 Account类:
package com.lbj.javase15;public class Account extends Object{//这里隐藏调用了Object类private String actno;private double balance;public Account() {//这里即使是缺写super();系统也会调用Object的无参构造方法去执行System.out.println("无参数构造器");}public Account(String actno, double balance) {this.actno = actno;this.balance = balance;}public String getActno() {return actno;}public void setActno(String actno) {this.actno = actno;}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}}
定义一个DebitAccount类 继承extends Account类:
package com.lbj.javase15;
/*** * 1.super关键字用在构造方法中:* 语法:super(实参);【通过子类的构造方法去调用父类的构造方法】* this(实参);【通过一个构造方法去调用另一个构造方法,实现代码重用,调用当前对象的构造方法】* * 2.语法规则:一个构造方法第一行如果没有this();也没有显示的去调用super();* 系统会默认调用super();并且是一级一级往父类去调用* * 3.注意:super();的调用只能放在构造方法的第一行,和this();的调用规则一样* * super()和this()不能共存在同一个构造函数内* * 构造方法的第一行如果什么都不写的话就会默认调用父类的无参数构造方法【super();】* * 4.通过子类的构造方法去调用父类的构造方法,作用是:给当前子类对象中的父类型特征赋值* super(值1,值2.....);* * 5.super();调用了父类中的构造方法,但是不会创建父类对象 ,只是为了给当前子类对象中的父类型特征赋值* * 6.为什么super();不会创建对象呢?* 按道理来说,一个类我们只会给它实现一个对象,但是如果继承过来的东西也实例化的话,相当于实例化了Object,实例化Account,* 实例化当前对象,一共有三个对象,这样会导致混乱* * 7.因此:构造方法执行,不一定创建对象【这个的意思指的是super关键字的意思】* * 8.父类的构造方法并不会被子类继承,但是可以被子类去调用* * * * * * @author 14811**/
public class DebitAccount extends Account {//独有属性private double debit;public DebitAccount(String actno,double balance,double debit) {super(actno,balance);this.debit = debit;}public DebitAccount() {//super("001",1000.0);//这里调用的是父类的有参数的构造函数//报错super();//单纯调用无参构造函数的时候这里即使不写也会自动存在//报错super("001",1000.0);}public double getDebit() {return debit;}public void setDebit(double debit) {this.debit = debit;}}
定义一个测试类:
package com.lbj.javase15;
/*** * 1.super不是引用类型(this是引用类型,引用的是当前对象),super中存储的不是内存地址,super指向的不是父类对象* * 2.super代表的是当前子类对象中的父类型特征* * 3.什么时候使用super? * 子类和父类中都有某个数据,* 例如:子类和父类中都有name这个属性* 如果要在子类中访问父类中的name属性,需要使用super关键字* * 4.super可以使用在什么地方?* 第一:super可以用在成员方法中,不能用在静态方法中* 第二:super可以用在构造方法中* * 5.this和super相同,都不能用在静态上下文中(static)* * * @author 14811**/
public class Test {public static void main(String[] args) {DebitAccount da=new DebitAccount();da.}}