构造器的重载,同一个类中具有多个构造器,多个构造器的形参列表不同,被称为构造器重载。可以在一个构造器里直接调用另一个构造器。
例:
public class Apple{
public String name;public String color;public double weight;public Apple(){}public Apple(String name, String color){
this.name = name;this.color = color;
}public Apple(String name, String color, double weight ){
//通过this调用另一个重载的构造器的初始化代码this(name , color);
this.weight = weight;
}
}
private不能被重写,要重写用protected
重载( overload):主要发生在同一个类的多个同名方法之间
重写( override):主要发生在子类和父类的同名方法之间
一般子类中重写了父类方法后,则程序执行取子类中被重写的方法,而隐藏父类方法,要想在子类中继续使用父类方法,则可以使用super或者父类类名作为调用者来调用父类中被覆盖的方法。
例:
class BaseClass{
public int a = 5;
}
public class SubClass extends BaseClass{
public int a = 7;public void accessOwner{
System.out.println(a);
}public void accessBase{
System.out.println( super.a );
}public static void main(String[] args){
Subclass sc = new SubClass();//输出7sc.accessOwner();//输出5sc.accessBase();
}
}
当系统创建SubClass时,实际上会为SubClass对象分配两块内存,一块用于存储在SubClass类中定义的a 成员变量,一块用于存储从BaseClass类中继承得到的a 成员变量。
当程序创建一个子类对象时,系统不仅会为该类中定义的实例变量分配内存,也会为它从父类继承得到的所有实例变量分配内存,即时子类定义了与父类中同名的实例变量。也就是说,当系统创建一个java对象时,如果该java类中有两个父类(一个直接父类A,一个间接父类B),假设A类中定义了2个实例变量,B类中定义了3个实例变量,当前类中定义了2个实例变量,那么这个java对象将会保存2+3+2个实例变量。
例
class Parent{
Public String tag="我是你爹";
}
class Son extends Parent{
private String tag="滚,你是我儿子";
}
public class HideTest{
public static void main(String[] args){
Son s = new Son();//程序不能访问 s 的私有变量tag//输出“我是你爹”System.out.println( ( (Parent)d).tag);
}
}
将s变量强制向上转型为Parent类型,再通过它来访问tag实例变量是允许的。