只要this关键字掌握了,super关键字不在话下,因为他们原理都差不多的。。

this&super

什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的。要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。his也可作为构造函数来使用。在后面可以看到

而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。super的作用同样是可以作为构造函数使用,或者是获取被局部变量屏蔽掉的父类对象的某个同名变量的值。

当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这问题,在Java中专门提供了一个super关键字用于访问父类的成员。例如访问父类的成员变量、成员方法和构造方法。

①使用super关键字调用父类的成员(变量和方法)

格式:

super.成员变量

super.成员方法([参数1,参数2……])

测试代码1(使用super调用父类的成员):

package day08;
//定义Animal类
class Animal_3{ String name = "动物";
//定义动物叫的方法
void shout(){
System.out.println("动物发出声音中……");
} }
//定义Cat类继承动物类
class Cat_3 extends Animal_3{ String name = "猫科" ;
//重写父类的shout()方法
void shout(){
super.shout();
}
//定义打印name的方法
void printName(){
System.out.println("name = "+super.name);
}
} public class Demo4 {
public static void main(String[] args){
Cat_3 cat = new Cat_3();
cat.shout();
cat.printName();
}
}

运行结果:

动物发出声音中……

name = 动物

代码测试1解释:定义了一个Cat类继承Animal_3类,并重写了Animal_3类的shout()方法。在子类Cat的shout()方法中使用super.shout()  调用了父类被重写的方法,在printName()方法中使用了 super.name 访问了父类的成员变量。  所以从结果看出而得出的结论是:子类通过super关键字可以成功的访问父类成员变量和成员方法。

②使用super关键字调用父类的构造方法

格式:

super([参数1,参数2……])

测试代码2(使用super调用父类的构造方法):

<span style="font-size:18px;">package day08;
class Animal_4{
//定义Animal类有参的构造方法
public Animal_4(String name){
System.out.println("有参构造方法被调用中……");
System.out.println("我是一只"+name);
}
}
//定义Dog_2类继承Animal类
class Dog_2 extends Animal_4{
public Dog_2(){
super("哈士奇");
}
}
public class Demo5 {
public static void main(String[] args){
Dog_2 dog = new Dog_2();
}
}</span>

运行结果:

有参构造方法被调用中……

我是一只哈士奇

代码测试2解释:在实例化Dog_2对象时候一定会调用Dog_2类的构造方法。从运行结果可以看出,Dog_2类的构造方法被调用时父类的构造方法也被调用。

需要注意的是:通过super调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。

P.S.

如果把super(“哈士奇”); 这行代码删除    编译器会报错,出错原因:实际参数列表和形式参数列表长度不同,在子类的构造方法中一定会调用父类的某个构造方法。这时子类构造方法会通过super指定调用父类的哪个构造方法,如果没有指定,在实例化子类对象时候,会自动调用父类无参的构造方法。  为了解决测试代码2的问题,可以在子类中显示地调用父类中已有的构造方法,当然也可以在父类定义无参构造方法。

解决问题后:

package day08;

class A{
int x = 10 ;
public A(){
System.out.println("A类无参构造方法被调用");
}
public A(int x){
System.out.println("A类的有参构造方法被调用");
}
}
class B extends A{
//显式构造无参代码
public B(){
//隐式super()
//方法体无代码
}
}
public class Demo6 {
public static void main(String[] args){
B b = new B(); }
}

运行结果:

A类无参构造方法被调用

从结果看出,子类在实例化时默认调用了父类的无参的构造方法。

从这代码得出结论: 在定义一个类的时候,如果没有特殊需求,尽量在类中定义一个无参的构造方法,避免被继承时出现错误。

测试代码3(为何实例对象B,A对象的无参构造方法也被调用)

package day08;

class A{
public A(){
System.out.println("A类无参构造方法被调用");
}
}
class B extends A{
public B(){
System.out.println("B类无参构造方法被调用");
}
}
public class Demo6 {
public static void main(String[] args){
B b = new B(); }
}

运行结果:

A类无参构造方法被调用

B类无参构造方法被调用

大家思考下,为何A类 的无参构造方法也被调用了 ,按道理来说 不是实例B类 然后只打印“B类无参构造方法被调用”

测试代码3解释:B类的构造方法被调用时父类B类的构造方法也被调用了。B类的构造方法第一行有一个隐私的super();这点和 this关键字是一样的理解的所以才可以调用父类的无参构造方法。

super关键字与this关键字的区别:
1. 代表的事物不一致。
1. super关键字代表的是父类空间的引用。
2. this关键字代表的是所属函数的调用者对象。
2. 使用前提不一致。
1. super关键字必须要有继承关系才能使用。
2. this关键字不需要存在继承关系也可使用。
3. 调用构造函数的区别:
1. super关键字是调用父类的构造函数。
2. this关键字是调用本类的构造函数。

super关键字调用父类构造方法要注意的事项:
1. 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法上面加上super()语句。
2. super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
3. super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。

this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

总结调用变量和方法:

用于变量时:this用于访问实例变量,以区分局部局部变量,super用于访问父类的属性(前提是访问控制权限允许)

用于方法时:隐含调用本类的方法,super用于访问父类的方法(前提是访问控制权限允许)

交流学习企鹅:654249738

JAVA_SE基础——40.super关键字的更多相关文章

  1. JAVA_SE基础——6.标识符&关键字

    学会写helloworld之后,  我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...

  2. java基础之super关键字

    一.在java里面,对于super关键字通常有两种用法: 1. 用在子类的构造方法里(初始化用),主要是调用父类的默认构造方法,如果父类有不止一个构造方法,可以通过super指定具体的构造函数,比如 ...

  3. JAVA_SE基础——41.instanceof关键字(运算符)

    instanceof 关键字 instanceof关键字的作用:判断一个对象是否属于指定的类别. instanceof关键字的使用前提:判断的对象与指定的类别必须要存在继承或者实现的关系.关于实现以后 ...

  4. JAVA_SE基础——33.this关键字的练习

    需求:使用java定义的一个人类,人具备 id ,name ,age 三个属性,还具备一个比较年龄的方法. 要求:必须要写上构造函数,构造函数也必须要使用上this关键字. class Person{ ...

  5. JAVA_SE基础——32.this关键字调用本类的构造方法

    黑马程序员入学blog... 也算是学习笔记. 下面我们来看段代码: package day07; class Student{ int id; //身份证 String name; //名字 pub ...

  6. JAVA_SE基础——31.this关键字

    黑马程序员入学blog... 也算是学习笔记体会. this的通俗解释: 有一个A类,一个B方法,一个C变量,其中B和C都在类A中 this.B()就是调用A类中的B方法 this.C=1(假设C是一 ...

  7. java基础学习总结——super关键字

    一.super关键字

  8. java基础—super关键字

    一.super关键字

  9. Java基础学习总结(8)——super关键字

    一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引 ...

随机推荐

  1. Linux系统中svn服务器设置开机启动

    安装完svn服务器后虽然好用但是因为经常重启Linux服务器,每次重启完就要去手动启动svn服务器,很是麻烦,于是在网上找了一些方法后,自己把svn服务器设置成开机启动 步骤一:安装svn服务器: h ...

  2. TP5模型类关键字赋值

    在写项目过程中 开始的代码如下 $ms = new MStore(); $ms->userid = $userid; $ms->address = $mc->address; $ms ...

  3. 17.HTML

    HTML简介 htyper text markup language  即超文本标记语言. 超文本: 就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 标准模板 <!DOCTYPE ...

  4. PAT乙级-1057. 数零壹(20)

    给定一串长度不超过105的字符串,本题要求你将其中所有英文字母的序号(字母a-z对应序号1-26,不分大小写)相加,得到整数N,然后再分析一下N的二进制表示中有多少0.多少1.例如给定字符串" ...

  5. Google Chrome Plus——绿色便携多功能谷歌浏览器

    我更新浏览器的时候一般没有时间更新这个帖子,所以具体请看我网盘下载链接里面的更新日志,请自行查看最新版本下载,谢谢. 近期更新日期:2016.8.15(此时间可能不是最新,请看我网盘里面的更新日志) ...

  6. ASP.NET部分代码示例

    using System; using System.Collections.Generic; using Model; using System.Data; using System.Data.Sq ...

  7. Algorithm --> 筛法求素数

    一般的线性筛法 genPrime和genPrime2是筛法求素数的两种实现,一个思路,表示方法不同而已. #include<iostream> #include<math.h> ...

  8. echarts地图的引用

    最近是跟echarts杠上了 所在公司是搞数据的 所以身为前端的我 就必须使用echarts将数据展示出来 ,进公司一周 ,前前后后大概用了八九种echarts图,我举得最难的就是引用的地图,因为刚开 ...

  9. 走进webpack(2)--第三方框架(类库)的引入及抽离

    在当代的前端开发中,很少会用原生JS来开发页面,最基本的都会使用jQuery来节省我们开发的时间和效率,而angular,vue,react的出现更是为前端开发者带来了福音.那么这篇文章就说说如何用w ...

  10. 如何用Word编辑参考文献------这是引用一位大师的

    如何用Word编辑参考文献修改文献是一件非常痛苦的事情,虽然现在也有很多软件可以编排参考文献,其实word本身就可以. 采用合适的编辑方法会方便地做到整齐,规范,自动排序和交叉引用.1.以尾注的方式插 ...