super关键字
super()
- 如果一个类没有提供任何构造方法,则系统默认提供一个无参数的构造方法,其中方法体内是空语句
如果一个类提供了构造方法,则系统就不提供一个默认的无参数的构造方法 - 当构造方法的第一行, this()和super()都没有,会默认有一个super(),表示通过当前子类的构造方法去调用父类的无参构造方法,
所以必须要保证父类的无参构造方法是存在的,当我们父类有构造方法时,习惯上手动写上无参构造方法
父类构造第一句也有super(),调用Object类里面的 - 因为this()和super()都只能出现在构造方法的第一行,所以二者不能共存
* 执行顺序有先调用,后结束的规律,类似于栈*/
public class Super {
public static void main(String[] args) {
new B();//1.调B的无参构造
}
}
class A{
public A(){
//默认存在super() 此处是Object类里面的无参构造,是空语句
System.out.println("A类的无参构造方法");//4.
}
}
class B extends A{
public B(){
this("xiao");//2.用到this(),实现用类的有参构造去给在无参构造中的属性进行初始化操作
System.out.println("B类的无参构造方法");//6.
}
public B(String name){
//3. 此处默认存在super();,再次调用父类的无参构造
System.out.println("B类的有参构造方法");//5.
}
}
/*A类的无参构造方法
B类的有参构造方法
B类的无参构造方法*/
super(参数列表)
public class Text {
public static void main(String[] args) {
//调无参构造
CreditAccount a = new CreditAccount();
System.out.println(a.getName()+","+a.getBalance()+","+a.getCredit());
//调有参构造
CreditAccount b = new CreditAccount("xiaozi",1000,0.9);
System.out.println(b.getName()+","+b.getBalance()+","+b.getCredit());
}
}
//账户类
class Account{
private String name;
private double balance;
//无参构造
public Account() {
}
//有参构造
public Account(String name, double balance) {
this.name = name;
this.balance = balance;
}
//封装
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
//信用户
class CreditAccount extends Account{
//信用值
private double credit;
//无参构造
public CreditAccount() {
}
//有参构造
public CreditAccount(String name, double balance,double credit) {
// this.name = name;
// this.balance = balance;
super(name,balance);
this.credit = credit;
}
// 在此处,不可以访问父类中的私有属性,
// 我们可以在子类的构造方法中调用父类中的有参构造方法,实现对其赋值要借助super(name,balance)
// 若不显示的写出super(),则默认用super()去调用父类中的无参构造,
// 因为父类中的无参构造也是没有对其赋值,则默认给成员变量赋初值,
// String name=null double balance=0.0
//封装
public double getCredit() {
return credit;
}
public void setCredit(double credit) {
this.credit = credit;
}
// 输出结果:
// null,0.0,0.0
// xiaozi,1000.0,0.9
}
super. 何时不可以省略
public class Test2 {
public static void main(String[] args) {
Vip v = new Vip("xiaozi");
v.shopping();
}
}
class Customer{//父类
String name;
public Customer() {
}
public Customer(String name) {
super();//调用Object类中的无参构造
this.name = name;
}
}
class Vip extends Customer{
public Vip() {
}
public Vip(String name) {
super(name);//调用父类的有参构造
}
public void shopping() {
System.out.println(this.name+"学习中");
System.out.println(name+"学习中");
System.out.println(super.name+"学习中");
}
}
//xiaozi学习中
//xiaozi学习中
//xiaozi学习中
当在子类中出现一个和父类相同的属性名或方法名时 :(不要忘记在构造方法中没有给变量赋初值,则赋予默认值)
public class Test2 {
public static void main(String[] args) {
Vip v = new Vip("xiaozi");
v.shopping();
v.yidong();
}
}
class Customer{//父类
String name;
public Customer() {
}
public Customer(String name) {
super();//调用Object类中的无参构造
this.name = name;
}
public void move() {
System.out.println("move!");
}
}
class Vip extends Customer{
String name;
public Vip() {
}
public Vip(String name) {
super(name);//调用父类的有参构造
// 因为当在子类中出现一个和父类相同的属性name,在构造方法中没有赋值,则会赋予它默认值
// this.name=null;
}
public void shopping() {
System.out.println(this.name+"学习中");
System.out.println(name+"学习中");
System.out.println(super.name+"学习中");
}
public void move() {
System.out.println(" Cat move!");
}
public void yidong() {
this.move();
move();
super.move();
}
// null学习中
// null学习中
// xiaozi学习中
// Cat move!
// Cat move!
// move!
}
总结:
在父类和子类中有同名的属性,或者相同的方法,想在子类中访问父类中的属性或者方法,super. 不可以省略
super.属性名 访问父类的属性
super.方法名(实参) 访问父类的方法
super(实参) 调用父类的构造方法
区分this 和 super
this:
- this 可以出现实例方法和构造方法中,不能出现在静态方法中
- this的语法有 this. this()
- this. 大部分情况下是可以省略的
- this 在区分局部和实例变量时不能省略
- this()只能出现在构造方法的第一行,通过当前的构造方法去调用“本类”中的其他构造方法,目的时代码复用
指的是无参构造中使用 this(与有参构造对应的参数)
super:
- super 可以出现实例方法和构造方法中,不能出现在静态方法中
- super的语法有 super. super()
- super. 大部分情况下是可以省略的
- super 在父类和子类中有同名的属性,或者相同的方法,想在子类中访问父类中的属性或者方法,super. 不可以省略
- super()只能出现在构造方法的第一行,通过当前的构造方法去调用父类中的构造方法,目的是:创建子类对象时,先初始化父类型特征
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现