继承(extends)
class Animal {}
public class Dog extends Animal {} //Dog类继承Animal类
示例
class Animal //父类
{
private int weight;
Boolean sex;
public Animal(){
System.out.println("调用父类构造方法Animal(): " + this);
this.weight=20;
this.sex=true;
//this.age=10;//父类看不到子类新增属性
}
public int getWeight()
{
return this.weight;
}
public void setWeight(int w)
{
this.weight = w;
this.sex = false;
//this.age=10;//父类看不到子类新增属性
}
}
class Dog extends Animal //子类Dog继承父类Animal
{ //子类新增属性
int age;
public Dog(){
System.out.println("Dog(): " + this);
this.age=10;
this.sex=false;
//this.weight = 20;
}
/**
子类新增方法
*/
public void Bark(){
//this.weight = 20;
this.sex = false;
System.out.println("Wang~~Wang~~~");
}
}
public class Test{ //测试类
private static Animal myAnimal; //定义一个父类引用变量myAnimal
public static void main(String args[])
{
myAnimal = new Dog(); //父类引用变量指向子类对象 上转型
/**
谁定义,绑定谁
子类Dog类没有重写setWeight()方法,所以setWeight()方法动态绑定父类Aniaml
先通过隐式传递的this找到子类(Dog类)对象空间,在子类对象空间找weight,找不到就通过动态绑定找到父类,父类找到动态绑定的私有属性weight,赋值50
*/
myAnimal.setWeight(50); //调用父类引用变量myAnimal指向的子类对象的setWeight()方法
System.out.println("My Dog's Weight is"+ myAnimal.getWeight());
//myAnimal.weight=100;
// myAnimal.Bark();
//((Dog)myAnimal).Bark(); //引用变量myAnimal的类型(Animal)不变,引用变量的值(对象地址)造型 对象地址由父类Animal转换为子类Dog 下转型
//Dog dog=new Dog();
//dog.Bark();
}
}
重载(Overload)与重写/覆盖(Override)
条件
- 重载在同一个类里,重写在两个类里(先继承,后重写);
- 重载可以多次,重写只能一次;
语法:
重载方法名相同 [参数签名不同]
#参数签名:参数类型,参数顺序,参数个数
重载两个方法的访问权限,返回值类型没有要求
结论:一个类当中不能有方法名相同,参数签名也相同的两个方法,不然会出错
使用场景
- 构造方法
- println方法
- 抽象方法可以重载为非抽象方法
- 主方法也能重载(虚拟机通过方法名和参数签名找主方法,所以主方法可以重载,但不推荐使用)
- 静态方法可以重载为非静态方法
调用机制
编译时期调用重写和重载方法——又叫静态多态/编译多态/静态联编