super到底是什么?
为什么下面这段代码的输出的hashCode是一样的
System.out.println(this.hashCode());
System.out.println(super.hashCode());
下面的这段代码怎么理解?
abstract class JustTest1{
public void test(){
System.out.println("This is abstract class");
}
}
public class TestSuperS extends JustTest1{
public static void main(String[] args) {
}
public void tes(){
super.test();
}
}
在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象,要引用就是用super关键字
是用来继承用的。子类继承父类
hashCode这个函数,你在子类没有重新覆盖父类的,所以它还是和父类一样的
super就是用来访问父类的,super()访问父类构造函数,super.XXX(),访问父类方法
从面向对象的角度理解,派生类重写了基类的方法,那么在对象外部来看,只有派生类的重写版本,基类的版本永远看不见了。
对于派生类对应的派生类的方法来说,它可以看到基类的方法,用super访问。之所以这么规定,是为了派生类可以复用基类的代码。
hashCode这个方法是Object的方法,如果不重写这个hashCode方法,所有类都是继承的Object类的hashCode,
你可以测试下,用eclipse自动生成一个类的hashcode方法,eclipse自动补全的代码如下:
@Override
public int hashCode() {
// TODO Auto-generated method stub
return super.hashCode();
}
明显的看到它也是调用的super.hashCode(),因此你的程序里
“System.out.println(this.hashCode()); System.out.println(super.hashCode());”这两行代码本质都是调用的Object对象的hashcode方法,
当然返回的结果是一样的了。
Java中,super表示对父类的引用,this表示对本身的调用。从构造器开始,super()或者加参数表示调用父类的构造函数,注意,前面不能有可执行代码,因为类对象实例尚未创建,this()或者加参数表示调用本身的参数对应的构造方法,再看成员函数,子类往往会对父类进行函数重写override,然而父类中的方法体可能我们也需要,我们可以在重写的函数体中写super.method(param)来调用父类对应方法,此时顺序上就没有严格要求了,因为对象已经存在。注意,类可以super,接口不行。
super关键字的两种用法:
1.用于调用超类的构造函数;
2.用于访问超类中被子类的某个成员隐藏的成员;
super的充分理解应当和this对比理解:
简单理解,父类好比你父亲,本类就比对自身,
"this." = "自身的“
”super." = " 父亲的“
比如你要使用自身的东西的时候可定义为使用自身的,也就是你使用的是this.money
而如果你要使用你父亲的东西的时候就要定义为使用父亲的,也就是使用的是super.money
其实我想问的是,为什么在静态方法中不能用super? 既然编译器规定我们不能在静态方法中使用super,只能在实例方法中使用.而子类中的实例方法要调用,
只有等到对象产生后,子类的实例方法才能被调用.但是,我们都知道抽象类是不能被实例化的. 如果说super是指向父类的引用,这个引用在虚拟机中是怎样
形成的,又是何时形成的?