1.什么是super?

super是一个关键字,全部小写。

2.怎么学?super和this对比着学习。

this:

  1. this能出现在实例方法构造方法中。
  2. this的语法是:“this.”、“this()
  3. this 不能 使用在静态方法中。
  4. this. 大部分情况下是可以省略的。
  5. this.什么时候不能省略呢? 在区分局部变量和实例变量的时候不能省略。

eg.

public void setName(String name){this.name = name;
}
  1. this() 在构造方法里,只能出现在构造方法第一行,通过当前的构造方法去调用“本类”中其它的构造方法。
    目的是:代码复用

2021.07.07补充:(感谢 “迷~麟” 指出错误)

  1. this.”可以引用本类的属性方法

  2. 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:

  1. super能出现在实例方法构造方法中。
  2. 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.

  1. super 不能 使用在静态方法中。
  2. super. 大部分情况下是可以省略的。
  3. 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}
}

内存图:

  1. 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关键字(超详细!)相关推荐

  1. java super关键字简述

    java super关键字简述 super关键字访问父类属性,访问权限必须是允许的 super关键字访问父类属性,访问权限必须是允许的 当创建子类对象时,默认调用父类的无参构造方法,除非显式调用父类的 ...

  2. JAVA 正则表达式 (超详细,转)

    转 JAVA 正则表达式 (超详细,转) 2015年03月25日 10:27:57 阅读数:1514 在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍 ...

  3. Java super关键字

    super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类. super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法.super 也可以用在子类的子类 ...

  4. java super关键字_Java入门(二)下

    点击蓝字关注我们 01 面向对象三大特性(2)---继承 一. 概念 继承是java三大特性之一(封装装,继承,多态).继承是从已有的类中派生出新的类.新的类继承原有类所有的属性和行为,并能拓展新的能 ...

  5. 【面向对象】一文了解Java继承(超详细、超有趣)

    目录 引子 何为继承 超类和子类 继承的实现 子承父业 类的继承层次 类的继承路径 青出于蓝--方法重写 创新驱动发展 命名冲突 后继无人 血脉相连--protected修饰符 引子 在具体讲解之前, ...

  6. java super关键字的作用_详解Java编程中super关键字的用法

    通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...

  7. Java super关键字详解

    一.super关键字作用 1:主要存在于子类方法中,用于指向子类对象中父类对象. 2:访问父类的属性 3:访问父类的函数 4:访问父类的构造函数 二. super注意的地方 this和super很像, ...

  8. Java——super关键字

    1.super是关键字,全部小写. 2.super和this对比: this: this能出现在实例方法和构造方法中. this的语法: "this." . "this ...

  9. Java super关键字:super调用父类的构造方法、利用super访问父类成员

    由于子类不能继承父类的构造方法,因此,要调用父类的构造方法,必须在子类的构造方法体的第一行使用 super() 方法.该方法会调用父类相应的构造方法来完成子类对象的初始化工作. 在以下情况下需要使用 ...

最新文章

  1. [LeetCode] Factorial Trailing Zeroes
  2. 如何通过简化标题来提升核心关键词排名?
  3. 济南python工资一般多少钱-济南python编程培训班价格
  4. PDF文件加密有什么方法?如何给PDF文件加密
  5. Always keep in mind
  6. 方立勋_30天掌握JavaWeb_使用httpUrlConnection模似ie
  7. 264,avs重要的变量:
  8. 服务器高并发下出现大量的time wait的解决办法
  9. BZOJ 1228: [SDOI2009]ED(SG定理)
  10. Android飞机大战小游戏
  11. 【求助】想知道Xcode怎么像devc一样调试程序
  12. 苹果计算机远程控制软件,向日葵远程控制软件iPhone手机远程控制电脑
  13. TI的C64X系列的DSPLib实现fft
  14. 阿里云部署网站全流程(基于nodejs)
  15. 中科大自主招生2018笔试数学之三
  16. 【Pandas】常用姿势积累
  17. 你同学都身价上亿了,你还在纠结早晨几点能起床
  18. 4月20日第壹简报,星期四,农历三月初一,谷雨
  19. 开机提示:one of your disks needs to be checked解决方法
  20. idea列模式按列选取代码或按行选取代码快捷键

热门文章

  1. 微信小程序 | 小程序组件化开发
  2. android 蓝牙相关广播,Android通过广播接收器BroadcastReceiver监听蓝牙连接变化
  3. MYSQL添加远程用户或允许远程访问
  4. html上下滑动css样式,网页滚动条CSS样式
  5. TopK问题算法详解
  6. 洛克菲勒资本管理公司成立洛克菲勒资产管理国际公司,将在伦敦开设第一家国际办事处
  7. 洛克菲勒写给儿子的38封信(终结)、抱怨只会让优秀沦丧、让合适的人出现在合适的地方、永远做策略性思考、始终把部属放在第一位、财富是种责任、充实你的心灵、谁都有机会成为大人物、给贪心留一个好位置
  8. 2D游戏——2021年4月14日
  9. 耳机化身充电宝 南卡N2s可还行
  10. Struts2拦截器和标签