`
ydwcn
  • 浏览: 63394 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中super的几种用法并与this的区别

阅读更多

转载自:http://blog.csdn.net/anmei2010/article/details/4093118

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 argv[]) {
       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(),在代码中使用了supersuper.namesuper.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

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

4superthis的异同:

 

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

    2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
    3)super:
 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参)

     4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

    5)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

  6)super()this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

  7)super()this()均需放在构造方法内第一行。

  8)尽管可以用this调用一个构造器,但却不能调用两个。

  9)thissuper不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

  10)this()super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

  11)从本质上讲,this是一个指向本对象的指针然而super是一个Java关键字。

 

分享到:
评论

相关推荐

    Java中this与super的区别

    Java中this与super的区别 this&super; 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 Java关键字this只能用于方法的方法体内。当一个对象创建后, Java虚拟机(JVM)就...

    详解Java中super的几种用法并与this的区别

    主要介绍了Java中super的几种用法并与this的区别,有需要的朋友可以参考一下

    Java面试宝典2020修订版V1.0.1.doc

    1、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 56 2、sleep() 和 wait() 有什么区别? 56 3、当一个线程进入一个对象的一个synchronized方法后,其它线程...

    java面试800题

    Q0032 Oracle的集合操作函数,如sum(),avg(),max(),min(),与select,where,grouby,having的先后顺序,使用方法 Oracle集合查询基本知识,只有进行分组的列,才可以取在集合查询SQL语句中取字段,先Group By,再Having...

    Java 基础核心总结 +经典算法大全.rar

    关于 null 的几种处理方式大小写敏感 null 是任何引用类型的初始值 null 只是-种特殊的值使用 Null-Safe 方法null 判断 关于思维导图 Java.IO Java.lang Java.math Java.net Java 基础核心总结 V2.0 IO 传统的 ...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    其它对象对它的访问,访问权限所以有以下几种:private, protected, public, friendly。 1.8.2 对象 把类实例化,我们可以生成多个对象,这些对象通过消息传递来进行交互(消息 传递即激活指定的某个对象的方法以改变...

    Java语言基础下载

    构造方法在继承中的使用 96 super关键字 97 包装类 97 toString( )方法 100 内容总结 101 独立实践 102 第七章:类的高级特征 103 学习目标 103 static关键字 104 final关键字 106 内部类 106 实例分析 110 抽象类,...

    Java服务器端开发面试.doc

    Java服务器端开发面试题 Java服务器端开发面试题篇1 Hashcode()和equals(), 明白背后的原理,包括hashcode()的用法,各自的区别,如何,何时覆盖,为何覆盖 区别new String()和 申明的字符串的区别,String不变量,堆...

    Java学习题答案

    14 super()和this()方法只能在构造函数里调用. 15 方法的参数变量不能是final的 16 接口的所有方法默认都是public,abstract和non-static的 17 接口可以声明成final 18 内部类可以访问外层类的任何...

    java范例开发大全源代码

     实例169 super()方法的使用 271  实例170 this方法的使用 274  实例171 一张考试成绩单 275  实例172 银行自动存取一体机 278  9.4 多态 284  实例173 饮食文化 284  实例174 使用构造方法的...

    java范例开发大全

    实例169 super()方法的使用 271 实例170 this方法的使用 274 实例171 一张考试成绩单 275 实例172 银行自动存取一体机 278 9.4 多态 284 实例173 饮食文化 284 实例174 使用构造方法的重载计算课程的GPA值 287 第10...

    Java范例开发大全 (源程序)

     实例169 super()方法的使用 271  实例170 this方法的使用 274  实例171 一张考试成绩单 275  实例172 银行自动存取一体机 278  9.4 多态 284  实例173 饮食文化 284  实例174 使用构造方法的重载计算...

    Java开发技术大全 电子版

    4.5.2使用super调用父类的构造方法157 4.6继承的内部处理158 4.7多态的基本概念159 4.8重载159 4.8.1普通方法的重载160 4.8.2构造方法的重载161 4.8.3重载的解析163 4.8.4重载与覆盖的区别165 4.9运行时多态...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    Java范例开发大全(全书源程序)

    实例169 super()方法的使用 271 实例170 this方法的使用 274 实例171 一张考试成绩单 275 实例172 银行自动存取一体机 278 9.4 多态 284 实例173 饮食文化 284 实例174 使用构造方法的重载计算课程的GPA值 ...

    java范例开发大全(pdf&源码)

    实例169 super()方法的使用 271 实例170 this方法的使用 274 实例171 一张考试成绩单 275 实例172 银行自动存取一体机 278 9.4 多态 284 实例173 饮食文化 284 实例174 使用构造方法的重载计算课程的GPA值 287 第10...

    java经典面试2010集锦100题(不看你后悔)

    C) 子类继承父类,如果父类中只有一个构造方法并且有参数,那么在子类的构造方法中必须先用super调用父类构造方法并传参。 D) 以上说法都不正确。 题目11:d 程序如下: class Test { private int day; public int...

Global site tag (gtag.js) - Google Analytics