zoukankan      html  css  js  c++  java
  • JAVA_SE基础——40.super关键字

    只要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



  • 相关阅读:
    arcpy脚本使用多接图表图斑对对应多幅影像进行裁边处理
    小辉轶事
    一些常ArcGIS常用简单算法 C#
    Wowza 4.5 修改 manager 端口号
    win7x64 串口程序无法运行,提示:component 'MSCOMM32.OCX' or one of its dependencies not correctlu registered。。。
    win7不正常开关机,系统恢复选项
    远程桌面+程序自启动
    Beyond Compare4 激活
    edusoho 支持同一账号多人同时登录
    windows 2008 gpt
  • 原文地址:https://www.cnblogs.com/Jhaiha0/p/8465303.html
Copyright © 2011-2022 走看看