文档章节

Java中super关键字的三种用法

天蚕宝衣
 天蚕宝衣
发布于 2016/01/27 17:49
字数 948
阅读 15
收藏 1

1、子类的构造函数如果要引用super的话,必须把super放在函数的首位。

class Base {
    Base() {   
        System.out.println("Base"); 
    } 
} 
public class Checket extends Base {  
    Checket() {   
        super();//调用父类的构造方法,一定要放在方法的首个语句。 
        System.out.println("Checket");  
    } 
    public static void main(String[] args[]) {   
        Checket c = new Checket(); 
    }
}

如果想用super继承父类构造的方法,但是没有放在第一行的话,那么在super之前的语句,肯定是为了满足自己想要完成某些行为的语句,但是又用了super继承父类的构造方法。那么以前所做的修改就都回到以前了,就是说又成了父类的构造方法了。
2、在Java中,有时还会遇到子类中的成员变量或成员方法与父类(有时也称父类)中的成员变量或成员方法同名。因为子类中的成员变量或成员方法名优先级高,所以子类中的同名成员变量或成员方法就隐藏了父类的成员变量或成员方法,但是我们如果想要使用父类中的这个成员变量成员方法,就需要用到super。

class Country {  
    String name;  
    void value() {
        name = "China"; 
    }
} 
class City extends Country {  
    String name;  
    void value() {  
        name = "Hefei"; 
        super.value();//不调用此方法时,super.name返回的是父类的成员变量的值null  
        System.out.println(name); 
        System.out.println(super.name); 
    }
    public static void main(String[] args) {
        City c=new City();
        c.value();
    }
}

为了在子类中引用父类中的成员变量name和成员方法value(),在代码中使用了super、super.name和super.value(),若不调用super.value()时,super.name返回父类成员变量默认值null,调用此方法时,super.value()方法把成员变量name赋值为China,再利用super.name调用父类的成员变量的值。另外,要注意的是super.name调用的是成员变量的值,

class Country {  
    String name="xianfan";  
    String value(String name) {   
        name = "China";   
        return name; 
     } 
} 
class City extends Country {  
    String name; 
    String value(String name) {  
        name = "Hefei"; super.value("失败");//不调用此方法时,super.name返回的是父类的成员变量的值null   
        System.out.println(name);   
        System.out.println(super.name);   
        return name; 
    } 
    public static void main(String[] args) {   
        City c=new City();   
        c.value("成功"); 
    } 
}

结果为:Hefei

              xianfan
此时,super.name返回的值是父类成员变量的值xianfan,而此时的super.value()方法是不起作用的。

3、用super直接传递参数:

class Person {  
    public static void prt(String s) {   
        System.out.println(s); 
    } 
    Person() {   
        prt("A Person.");  
    } 
    Person(String name) {   
        prt("A person name is:" + name);  
    } 
} 
public class Chinese extends Person {  
    Chinese() {   
        super(); // 调用父类无形参构造方法(1) 
        prt("A chinese.");// (4) 
    } 
    Chinese(String name) { 
        super(name);// 调用父类具有相同形参的构造方法(2) 
        prt("his name is:" + name); 
    } 
    Chinese(String name, int age) {   
        this(name);// 调用当前具有相同形参的构造方法(3) 
        prt("his age is:" + age); 
    } 
    public static void main(String[] args) {   
        Chinese cn = new Chinese();   
        cn = new Chinese("kevin");  
        cn = new Chinese("kevin", 22);
    }
}

结果为:A Person.
             A chinese.
             A person name is:kevin

             his name is:kevin

             A person name is:kevin

             his name is:kevin

             his age is:22

在这段程序中,this和super不再是像以前那样用“.”连接一个方法或成员,而是直接在其后跟上适当的参数,因此它的意义也就有了变化。super后加参数的是用来调用父类中具有相同形式的构造函数,如1和2处。this后加参数则调用的是当前具有相同参数的构造函数,如3处。当然,在Chinese的各个重载构造函数中,this和super在一般方法中的各种用法也仍可使用,比如4处,你可以将它替换为“this.prt”(因为它继承了父类中的那个方法)或者是“super.prt”(因为它是父类中的方法且可被子类访问),它照样可以正确运行。但这样似乎就有点画蛇添足的味道了。

© 著作权归作者所有

共有 人打赏支持
天蚕宝衣
粉丝 22
博文 239
码字总数 179255
作品 0
天津
私信 提问
Java关键字(六)——super

  在 Java关键字(五)——this 中我们说 this 关键字是表示当前对象的引用。而 Java 中的 super 关键字则是表示 父类对象的引用。   我们分析这句话“父类对象的引用”,那说明我们使用的...

ysocean
06/25
0
0
《Java从小白到大牛精简版》之第4章 Java语法基础

《Java从小白到大牛》纸质版已经上架了!! 本章主要为大家介绍Java的一些基本语法,其中包括标识符、关键字、保留字、常量、变量、表达式等内容。 4.1 标识符、关键字和保留字 任何一种计算...

tony关东升
06/26
0
0
Java编程学习:继承的概念及方法

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/30
0
0
JavaScript 中的继承:ES3、ES5 和 ES6

选择一种继承方式 JavaScript 是一门动态语言,动态意味着高灵活性,而这尤其可以体现在继承上面。JavaScript 中的继承有很多种实现方式,可以分成下面四类: Mixin 模式,即属性混入,从一个...

天方夜
10/30
0
0
深入理解Java中的volatile关键字

本文就围绕volatile展开,主要介绍volatile的用法、volatile的原理,以及volatile是如何提供可见性和有序性保障的等。 volatile这个关键字,不仅仅在Java语言中有,在很多语言中都有的,而且...

Mr_zebra
10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

FTP 协议 1.0

自己制作的FTP协议:

Explorer0
22分钟前
1
0
Android 通过DrawableInflater加载自定义Drawable

一、Drawable 在Android系统张,图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,因此系统提供了一个被称之为Drawable的类来进行绘制处理...

IamOkay
33分钟前
1
0
灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

yizhichao
39分钟前
1
0
Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
今天
7
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部