java学习记录
1.java在实例化子类对象的时候,并没有实例化父类对象
在java中,子类继承父类,在子类实例化的时候必然会调用父类的构造器来加载父类的结构,在子类构造器中只能调用一次本类重写的其他构造器或者父类的构造器,且调用构造器相关语句必须放在代码块的首行(子类在实例化的时首先要知道其所具有的属性和方法),直至调用到Object类的无参构造器。
2.在类的成员方法中,this表示方法所属对象的引用,而super表示父类内存空间的标识(子类实例化的时候,没有实例化父类),super指向的是在子类实例的堆空间中存储父类属性的区域。
3.子类没有继承父类的private方法,所以也不能调用(更不存在重写和重载,子类可以重载和重写父类开放权限的方法),但是子类继承了父类的private属性,可以通过父类的getter和setter访问和修改。
4.子类通过super调用父类被重写的方法时,操作的是父类自身的属性(如果子类和父类存在重名的属性),因为在父类方法中不可能调用只存在于子类中的属性)。
5.子类不能重写父类的static方法,被static修饰的方法属于类的方法,但是子类可以通过父类类名调用该方法(即使不是父子类关系也可以,只要权限开放,执行的父类static方法的方法体),不能应用于多态,所以不存在重写的概念。
测试代码:
package com.zcf.exer;
public class Father {
// 父类属性
int age = 2;
double height = 1.9;
public void show() {
age++;
System.out.println("father age:" + age);//3
height++;
//System.out.println("father:" + height);
System.out.println("father height" + height);//2.9
}
private void earnMoney() {
System.out.println("father earn money");
}
}
package com.zcf.exer;
public class Child extends Father{
// 子类属性
int age = 1;
public void show() {
age++;
super.show();//super指向的不是父类对象,而是子类中存储父类成员的区域(包括方法和属性)
//在子类中调用父类的方法操作的也是父类的属性,而非子类的属性
System.out.println("Child age:" + age);//2
height++;
System.out.println("child height" + height);//3.9
}
public void isEquals() {
System.out.println(super.equals(this));//true,这表明super和this指向堆空间中同一块区域的首地址
}
public void HashCode() {
System.out.println(this.hashCode());//两个hashcode相同
System.out.println(super.hashCode());
}
public void doit() {
//super.earnMoney();子类没有继承父类的private方法
}
public void earnMoney() {
//不是重写或者重载,而是子类自己声明的方法
}
}