【Java咬文嚼字】关键字(一):super和this
这段时间一直在学Java,看了辣么多书以及博客,心痒也是着写写自己的学习心得。
这也算是新手篇:咬文嚼字Java中的关键字。
以关键字为第一篇博文也是考虑再三:1、本人基础也是薄弱 2、集跬步至千里 3、看了一些博文也是有些瑕疵。不多说废话正片开始:
super的用法:
1、调用父类的构造器:
class MyDate extends Date {
static public MyDate valueOf() {
return new MyDate();
}
static public MyDate valueOf(long time) {
return new MyDate();
}
private MyDate() {
super();
}
private MyDate(long time) {
super(time);
}
}
在子类中调用父类的构造器,可以传递响应的参数,初识化时使用(ps:只有在子类构造器中使用)。那么问题来了:如果父类构造器是私有的,子类能不能super调用呢?
众所周知 被private修饰的field、construc、method是不允许被外界访问的,那么super应该是调用不到的。
IDE(Eclipse)直接不允许
编译报错
2、调用父类方法或是父类的成员:
class MyDate extends Date {
static public MyDate valueOf() {
return new MyDate();
}
private MyDate() {
super.getTime();
}
public void doAction() {
super.getTime();
}
}
如上所示,调用父类的方法相对自由些:子类的方法、子类的构造器都可以调用。那么问题来了:如果先调用父类方法,后调用父类构造器会如何?
很容易想到,这是不允许。父类都还没有构造如何调用父类方法呢。。。
IDE(Eclipse)直接不允许
编译报错则提示的更加明显:super的调用必须是构造器中的第一个语句
当然各位博友也可以去试试其他情况是不是super的调用必须是第一个语句这问题?
3、泛型中的应用:
很多博文都是列举了上面两种,但是泛型中同样存在super关键字,所以我也姑且算作他的一种用法吧。
super关键字声明了类型的下界,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object
extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类
看上去有点绕,但是简单的一个例子就知道为啥要有super:
public class MainTest {
static public void main(String[] args) {
}
static private <T extends Comparable<? super T>> T min(T a, T b) {
if (a == null || b == null) {
return null;
}
if (a.compareTo(b) < 0) {
return a;
}
return b;
}
}
class SuperTest implements Comparable<SuperTest> {
@Override
public int compareTo(SuperTest o) {
return 0;
}
}
class SubTest extends SuperTest {
}
如上代码,表示使用min求出两个T类型中小的那个(打算这么实现而已)。用上泛型时,参数类型为T,T必须是Comparable子类或实现Comparable接口;同时考虑广泛适用性,T如果有父类实现了Comparable接口也是可以的。
this的用法:
1、调用对象本身的构造器
class MyDate extends Date {
static public MyDate valueOf() {
return new MyDate();
}
private MyDate() {
this(0);
}
private MyDate(long time) {
}
}
与super用法比较类似,必须是构造器中的第一个语句,但还有一个问题:如果构造其中this互相调用,即在private MyDate(long time){this();},会由啥情况?
报错很明显:禁止递归调用
2、调用对象本身方法或是对象本身的成员
class MyDate{
private long myDate;
static public MyDate valueOf() {
return new MyDate();
}
public void print() {
System.out.println(this.getMyDate());
}
public long getMyDate() {
return this.myDate;
}
}
this&super容易发生的误解:
this调用对象本身,super调用对象父类。这样的理解还是不准确的。
楼猪认为相对优秀的理解是:this是对象本身的引用,super只是作为一个具有提示意义的关键字而已。注意:this是类对象,super不是父类对象。
import java.util.*;
class MyDate extends Date{
static public void main(String[] args) {
MyDate.valueOf().print();
}
static public MyDate valueOf() {
return new MyDate();
}
private MyDate() {
}
public void print() {
System.out.println(this);
System.out.println(this.getClass());
System.out.println(super);//编译不通过
System.out.println(super.getClass());
}
}
如上述代码,如果加上System.out.println(super);编译无法通过。
编译报错,编译器试图告诉我们super不是这样用的。
而 System.out.println(this);是允许这样使用的。
另外一种判断方法,利用instanceof这个关键字(instanceof测试一个对象是否是一个类的实例):
import java.util.*;
class MyDate extends Date{
static public void main(String[] args) {
MyDate.valueOf().print();
}
static public MyDate valueOf() {
return new MyDate();
}
private MyDate() {
}
public void print() {
if (this instanceof MyDate) {
System.out.println("this is object");
}
if (super instanceof Date) {//编译不通过
System.out.println("super is object");
}
}
}
编译报错
啰嗦了这么多,一方面才疏学浅无法精简的表达自己的想法,另一方面第一次写博客也是挺紧张的,布局、措词、效果等等都不清楚。
如果问题希望各位指正。。。
【Java咬文嚼字】关键字(一):super和this的更多相关文章
- Java中关键字super与this的区别
一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引 ...
- java面对对象 关键字this super
this:this是指向对象本身的一个指针,成员函数内部指向当前类的对象 其实this主要要三种用法: 1.表示对当前对象的引用! 2.表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是 ...
- java方法重写和super关键字
//java方法重写和super关键字 //在继承中,其实就是子类定义了和父类同名的方法 //就是方法,属性都是相通的 //重写限制: //被子类重写的方法不能拥有比父类方法更加严格的权限 //sup ...
- java基础学习总结——super关键字
一.super关键字
- java的继承 和super关键字 构造器
面向对象的特性二继承: 继承的好处: 1.减少代码的冗余.提高了代码的复用性 2.便于功能的扩展 3.为之后多态的使用,提供了前提 继承的格式: class A extends B{} A:子类.派生 ...
- java 面向对象(十四):面向对象的特征二:继承性 (三) 关键字:super以及子类对象实例化全过程
关键字:super 1.super 关键字可以理解为:父类的2.可以用来调用的结构:属性.方法.构造器3.super调用属性.方法:3.1 我们可以在子类的方法或构造器中.通过使用"supe ...
- Java 常见关键字总结:final、static、this、super!
final,static,this,super 关键字总结 final 关键字 final关键字,意思是最终的.不可修改的,最见不得变化 ,用来修饰类.方法和变量,具有以下特点: final修饰的类不 ...
- java继承中关于super关键字和this关键字的使用
1.super关键字 由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字.super 可以用来访问父类的构造方法.普通方法和属性.super 关键字的功能: ...
- java中this和super关键字的作用
this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题:this可以调用成员变量,不能调用局部变量:this也可以调用成员方法,但是在普通方法中可以省略this,在构造方法中不允许省 ...
- IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic、 @synthesize、@property、@dynamic
IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic. @synth ...
随机推荐
- 查看mysql的注册表路径
原文地址:http://www.cppblog.com/lanshengsheng/archive/2012/11/23/195592.html
- iOS7 人机界面设计指南
iOS7 人机界面设计指南 苹果在WWDC 2013大会上发布了iOS 7,新系统一改5年来的拟物路线,在乔纳森•艾维的主导下,加入了更多的“扁平化”和“极简”现代设计元素. iOS7系统界面 ...
- VS项目如何运用svn的忽略列表
在实际的项目开发中,有些文件(比如bin,obj下的文件)是不需要放在svn里面的,因为每次都会重新生成. 该如何排除这些文件那? 我试着在svn server上删除了这些文件夹,但是在文件夹上还是显 ...
- 详解Android ActionBar之一:ActionBar概述与创建
前面一个系列中讲的是Fragment的内容,Android 3.0中除Fragment外,Action Bar同样也是一个很重要的知识点.我们经常使用Action Bar来替代传统的标题栏.如果是An ...
- sap 三代出口(BADI)的查找方法
sap 三代出口(BADI)的查找方法 对于根据事务代码查找对应的BADI,网上介绍的方法很多,但总结下来无非就两种方法,在此把它记录下来,方便以后自己查阅了.(1)通过SE24,输入CL_EXITH ...
- android131 360 04 手机安全页面
## Root权限 ## > 什么是Root权限? Root权限相当于系统管理员权限, 有了root权限,就可以随意修改和删除手机内部的文件. > 一般手机购买之后, 都没有root权限. ...
- careercup-中等难度 17.7
17.7 给定一个整数,打印该整数的英文描述(例如“One Thousand,Two Hundred Thirty Four”). 解法: 举个例子,在转换19 323 984时,我们可以考虑分段处理 ...
- [Effective C++ --012]复制对象时勿忘其每一个成分
引言: 在深拷贝和浅拷贝的理解中,我们知道了“拷贝构造函数”一词,并且也了解了它的构成. A(const A& r); // 形式有多种,在这里只列出一个 因此,在值传递的应用场景里,我们可以 ...
- 文件和目录之symlink和readlink函数
symlink函数创建一个符号链接. #include <unistd.h> int symlink( const char *actualpath, const char *sympat ...
- JavaScript/jQuery选择器简介
DOM提供的选择器 选择器是帮助我们选择页面元素的工具,在网站制作中常常会涉及到某个元素的改变,通过选择器提取这些元素可以很轻易的实现(DOM术语把所说的“元素”称作是“节点”).JavaScript ...