Java super关键字(超详细!)
1.什么是super?
super是一个关键字,全部小写。
2.怎么学?super和this对比着学习。
this:
- this能出现在
实例方法
和构造方法
中。 - this的语法是:“
this.
”、“this()
” - this
不能
使用在静态方法
中。 - this. 大部分情况下是可以省略的。
- this.什么时候不能省略呢? 在区分局部变量和实例变量的时候不能省略。
eg.
public void setName(String name){this.name = name;
}
this()
在构造方法里,只能出现在构造方法
第一行,通过当前的构造方法去调用“本类”中其它的构造方法。
目的是:代码复用。
2021.07.07补充:(感谢 “迷~麟” 指出错误)
“
this.
”可以引用本类的属性或方法“
this
” 可以作为函数的返回值。
eg.
//重新JList渲染类(部分代码)private rolecolor = red;public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);if (isSelected) {setBackground(this.rowcolor);setFont(getFont().deriveFont((float) (getFont().getSize() + 2)));}return this;//返回当前JList对象
}
super:
- super能出现在
实例方法
和构造方法
中。 - super的语法是:“
super.
”、“super()
”
2.1 super()
2.1.1 在恰当的时间使用:super(实际参数列表);
2.1.2 注意:在构造方法执行过程中一连串调用了父类的构造方法,父类的构造方法又继续向下调用它的父类的构造方法,但是实际上对象只 创建了一个
。
2.1.3 “super(实参)”到底是干啥的?
super(实参)的作用是:初始化当前对象的父类型特征
。
并不是创建新对象。实际上对象只创建了1个。
2.1.4 super关键字代表什么呀?
super关键字代表的就是“当前对象
”的那部分父类型特征。
eg.
public class SuperTest03{public static void main(String[] args){CreditAccount ca1 = new CreditAccount();System.out.println(ca1.getActno() + "," + ca1.getBalance() + "," + ca1.getCredit());CreditAccount ca2 = new CreditAccount("1111", 10000.0, 0.999);System.out.println(ca2.getActno() + "," + ca2.getBalance() + "," + ca2.getCredit());}
}// 账户
class Account extends Object{// 属性private String actno;private double balance;// 构造方法public Account(){//默认有以下代码//super();//this.actno = null;//this.balance = 0.0;}public Account(String actno, double balance){// super();this.actno = actno;this.balance = balance;}// setter and getterpublic void setActno(String actno){this.actno = actno;}public String getActno(){return actno;}public void setBalance(double balance){this.balance = balance;}public double getBalance(){return balance;}
}// 信用账户
class CreditAccount extends Account{// 属性:信誉度(诚信值)// 子类特有的一个特征,父类没有。private double credit;// 构造方法// 分析以下程序是否存在编译错误????public CreditAccount(String actno, double balance, double credit){// 私有的属性,只能在本类中访问。/*this.actno = actno;this.balance = balance;*/// 以上两行代码在恰当的位置,正好可以使用:super(actno, balance);// 通过子类的构造方法调用父类的构造方法。super(actno, balance);this.credit = credit;}// 提供有参数的构造方法public CreditAccount(){//super();//this.credit = 0.0;}// setter and getter方法public void setCredit(double credit){this.credit = credit;}public double getCredit(){return credit;}}
内存图:
2.2 super.
- super
不能
使用在静态方法
中。 - super. 大部分情况下是可以省略的。
super.
什么时候不能省略呢?
父中有,子中又有
,如果想在子
中访问“父的特征”
,super. 不能省略。
在父和子中
有同名
的属性,或者说有相同
的方法,
如果此时想在子类中访问父中的数据,必须使用“super.
”加以区分。
eg1.
class Animal{public void move(){System.out.println("Animal move!");}
}class Cat extends Animal{// 对move进行重写。public void move(){System.out.println("Cat move!");}// 单独编写一个子类特有的方法。public void yiDong(){this.move();//子类的move//前面不写默认有this.move();//子类的move// super. 不仅可以访问属性,也可以访问方法。super.move();//父类的move}
}
eg2.
public class Super{public static void main(String[] args){Vip v = new Vip("张三");v.shopping();}
}
class Customer {String name;public Customer(){}public Customer(String name){super();this.name = name;}public void doSome(){System.out.println(this.name + " do some!");System.out.println(name + " do some!");//错误: 找不到符号//System.out.println(super.name + " do some!");//Object类没有name属性}
}
class Vip extends Customer{// 假设子类也有一个同名属性// java中允许在子类中出现和父类一样的同名变量/同名属性。String name; // 实例变量public Vip(){}public Vip(String name){super(name);// this.name = null;}public void shopping(){/*java是怎么来区分子类和父类的同名属性的?this.name:当前对象的name属性super.name:当前对象的父类型特征中的name属性。*/System.out.println(this.name + "正在购物!"); // null 正在购物 子类的nameSystem.out.println(super.name + "正在购物!"); // 张三正在购物 父类的nameSystem.out.println(name + "正在购物!"); //null 正在购物 子类的name}
}
内存图:
super()
只能出现在构造方法
第一行,通过当前的构造方法去调用“父类”中的构造方法。
目的是:创建子类对象的时候,先初始化父类型特征。
3.1 super()
表示通过子类的构造方法调用父类的构造方法。
模拟现实世界中的这种场景:要想有儿子,需要先有父亲。
3.重要的结论:
3.1 当一个构造方法第一行:既没有this()又没有super()的话,默认会有一个super();
表示:通过当前子类的构造方法调用父类的无参数构造方法。
所以必须保证父类的无参数构造方法是存在的。
3.2 在java语言中不管是是new什么对象,最后老祖宗的Object类
的无参数构造方法一定会执行。(Object类的无参数构造方法是处于“栈顶部”)
4. 注意:
4.1 this()
和 super()
不能共存
,它们都是只能出现在构造方法第一行。
4.2 无论是怎样折腾,父类的构造方法是一定会执行的。(百分百)
4.3 结论
- this是引用。this也保存内存地址,this也指向任何对象。
- super 不是引用。super也不保存内存地址,super也不指向任何对象。
super 只是代表当前对象内部的那一块父类型的特征。
eg.
public class SuperTest06 {// 实例方法public void doSome(){// SuperTest06@2f92e0f4System.out.println(this);// 输出“引用”的时候,会自动调用引用的toString()方法。//System.out.println(this.toString());//编译错误: 需要'.'//System.out.println(super);}// this和super不能使用在static静态方法中。/*public static void doOther(){System.out.println(this);System.out.println(super.xxx);}*/// 静态方法,主方法public static void main(String[] args){SuperTest06 st = new SuperTest06();st.doSome();}
}
eg.
public class Super{public static void main(String[] args){new C();}
}/*
class Object{public Object(){ }
}
*///不写默认继承Object
class A /*extends Object*/{public A(){//默认有super();不写默认存在;调用Object构造方法super();System.out.println("1"); //1}
}class B extends A{public B(){//默认有super();不写默认存在;调用Object构造方法super();System.out.println("2"); //2}public B(String name){super();System.out.println("3"); // 3}
}class C extends B{public C(){ // 这个是最先调用的。但是最后结束。this("zhangsan");System.out.println("4");//4}public C(String name){this(name, 20);System.out.println("5");//5}public C(String name, int age){super(name);System.out.println("6");//6}
}
5.结论
super.属性名
【访问父类的属性】super.方法名(实参)
【访问父类的方法】super(实参)
【调用父类的构造方法】
Java super关键字(超详细!)相关推荐
- java super关键字简述
java super关键字简述 super关键字访问父类属性,访问权限必须是允许的 super关键字访问父类属性,访问权限必须是允许的 当创建子类对象时,默认调用父类的无参构造方法,除非显式调用父类的 ...
- JAVA 正则表达式 (超详细,转)
转 JAVA 正则表达式 (超详细,转) 2015年03月25日 10:27:57 阅读数:1514 在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍 ...
- Java super关键字
super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类. super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法.super 也可以用在子类的子类 ...
- java super关键字_Java入门(二)下
点击蓝字关注我们 01 面向对象三大特性(2)---继承 一. 概念 继承是java三大特性之一(封装装,继承,多态).继承是从已有的类中派生出新的类.新的类继承原有类所有的属性和行为,并能拓展新的能 ...
- 【面向对象】一文了解Java继承(超详细、超有趣)
目录 引子 何为继承 超类和子类 继承的实现 子承父业 类的继承层次 类的继承路径 青出于蓝--方法重写 创新驱动发展 命名冲突 后继无人 血脉相连--protected修饰符 引子 在具体讲解之前, ...
- java super关键字的作用_详解Java编程中super关键字的用法
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...
- Java super关键字详解
一.super关键字作用 1:主要存在于子类方法中,用于指向子类对象中父类对象. 2:访问父类的属性 3:访问父类的函数 4:访问父类的构造函数 二. super注意的地方 this和super很像, ...
- Java——super关键字
1.super是关键字,全部小写. 2.super和this对比: this: this能出现在实例方法和构造方法中. this的语法: "this." . "this ...
- Java super关键字:super调用父类的构造方法、利用super访问父类成员
由于子类不能继承父类的构造方法,因此,要调用父类的构造方法,必须在子类的构造方法体的第一行使用 super() 方法.该方法会调用父类相应的构造方法来完成子类对象的初始化工作. 在以下情况下需要使用 ...
最新文章
- [LeetCode] Factorial Trailing Zeroes
- 如何通过简化标题来提升核心关键词排名?
- 济南python工资一般多少钱-济南python编程培训班价格
- PDF文件加密有什么方法?如何给PDF文件加密
- Always keep in mind
- 方立勋_30天掌握JavaWeb_使用httpUrlConnection模似ie
- 264,avs重要的变量:
- 服务器高并发下出现大量的time wait的解决办法
- BZOJ 1228: [SDOI2009]ED(SG定理)
- Android飞机大战小游戏
- 【求助】想知道Xcode怎么像devc一样调试程序
- 苹果计算机远程控制软件,向日葵远程控制软件iPhone手机远程控制电脑
- TI的C64X系列的DSPLib实现fft
- 阿里云部署网站全流程(基于nodejs)
- 中科大自主招生2018笔试数学之三
- 【Pandas】常用姿势积累
- 你同学都身价上亿了,你还在纠结早晨几点能起床
- 4月20日第壹简报,星期四,农历三月初一,谷雨
- 开机提示:one of your disks needs to be checked解决方法
- idea列模式按列选取代码或按行选取代码快捷键
热门文章
- 微信小程序 | 小程序组件化开发
- android 蓝牙相关广播,Android通过广播接收器BroadcastReceiver监听蓝牙连接变化
- MYSQL添加远程用户或允许远程访问
- html上下滑动css样式,网页滚动条CSS样式
- TopK问题算法详解
- 洛克菲勒资本管理公司成立洛克菲勒资产管理国际公司,将在伦敦开设第一家国际办事处
- 洛克菲勒写给儿子的38封信(终结)、抱怨只会让优秀沦丧、让合适的人出现在合适的地方、永远做策略性思考、始终把部属放在第一位、财富是种责任、充实你的心灵、谁都有机会成为大人物、给贪心留一个好位置
- 2D游戏——2021年4月14日
- 耳机化身充电宝 南卡N2s可还行
- Struts2拦截器和标签