This article is categorized as "Garbage" . It should NEVER be appeared in your search engine's results.
Table of Contents
Part1
尽量简单一点,不要搞得像Java编程思想那样绕了。
🔗 [Java 重写(Override)与重载(Overload) | 菜鸟教程] https://www.runoob.com/java/java-override-overload.html
下面这个例子使用上面的菜鸟教程的代码改的,学习效果并不好,但还是先贴在这里:
class Animal {
public void move() {
System.out.println("动物可以移动");
}
}
class Dog extends Animal {
public void move() {
System.out.println("狗可以跑和走");
}
public void bark() {
System.out.println("狗可以吠叫");
}
}
public class demo {
public static void main(String args[]) {
Animal animal = new Animal(); // Animal 对象
Animal animal_dog = new Dog(); // 编译时是Animal,运行时是Dog
animal.move();
// 执行 Animal 类的方法:动物可以移动
// ((Dog)animal).move();
// 这段代码可以通过编译
// 这是不合法的,会抛出错误:class Animal cannot be cast to class Dog
animal_dog.move();
// animal_dog在运行时为Dog,所以执行 Dog 类的方法:狗可以跑和走
((Animal) animal_dog).move();
// 仍然只能执行Dog类的方法:狗可以跑和走
// intellij会提示:Casting 'b' to 'Animal' is redundant
// animal_dog.bark();
// 由于animal_dog在编译时是Animal,所以这段代码无法通过编译
((Dog) animal_dog).bark();
// 狗可以吠叫
}
}
class Employee {
public void changeSalary() {
System.out.println("员工只能扣工资");
}
}
class Boss extends Employee {
public void changeSalary() {
System.out.println("老板只能加工资");
}
public void steel() {
System.out.println("只有老板才有权限偷取公司财务");
}
}
public class demo {
public static void main(String args[]) {
Employee eBoss = new Boss();
eBoss.changeSalary();
}
}
观察这段代码,然后猜测它的运行结果。答案
如果我们尝试这样调用会怎么样?
public class demo {
public static void main(String args[]) {
Employee eBoss = new Boss();
eBoss.steel();
}
}
但这样是不太符合程序原本的构思的。我们想做的是创造一个“看起来像员工的老板”,这个老板自称和员工打成一片,但他却只能做老板的事情(只能加工资,能偷公司财务)。
所以只能这样做,在class Employee里面添加一个效果为空的steel(),但一般不推荐,因为用这个例子不容易体现出上抛/下抛的核心思想:
class Employee {
public void changeSalary() {
System.out.println("员工只能扣工资");
}
public void steel() {
}
}
class Boss extends Employee {
public void changeSalary() {
System.out.println("老板只能加工资");
}
public void steel() {
System.out.println("只有老板才有权限偷取公司财务");
}
}
public class demo {
public static void main(String args[]) {
Employee eBoss = new Boss();
if (eBoss instanceof Employee) {
System.out.println("这个老板自称和员工打成一片");
}
eBoss.changeSalary();
eBoss.steel();
}
}
// 这个老板自称和员工打成一片
// 老板只能加工资
// 只有老板才有权限偷取公司财务
Part2
上面这个程序效果还行,现在继续用这个程序学习上抛和下抛:
class Employee {
public void changeSalary() {
System.out.println("员工只能扣工资");
}
public void steel() {
}
}
class Boss extends Employee {
public void changeSalary() {
System.out.println("老板只能加工资");
}
public void steel() {
System.out.println("只有老板才有权限偷取公司财务");
}
}
public class demo {
public static void main(String args[]) {
Employee employee = new Employee();
((Boss) employee).changeSalary();
// 试图把员工变成老板
}
}
我们创建了一个Employee对象,然后尝试把他变成老板。程序会得到什么结果呢?
继续:
class Employee {
public void changeSalary() {
System.out.println("员工只能扣工资");
}
public void steel() {
}
}
class Boss extends Employee {
public void changeSalary() {
System.out.println("老板只能加工资");
}
public void steel() {
System.out.println("只有老板才有权限偷取公司财务");
}
}
public class demo {
public static void main(String args[]) {
Boss boss = new Boss();
// 创建了一个不演戏的boss
((Employee) boss).changeSalary();
boss.steel();
Employee boss_employee = new Boss();
// 创建了一个假装成员工的boss
((Employee) boss_employee).changeSalary();
boss_employee.steel();
}
}
继续猜测上面的程序会得到什么结果。
总结上抛和下抛,注意:下面的程序去掉了class Employee里的那个空的steel()方法:
class Employee {
public void changeSalary() {
System.out.println("员工只能扣工资");
}
}
class Boss extends Employee {
public void changeSalary() {
System.out.println("老板只能加工资");
}
public void steel() {
System.out.println("只有老板才有权限偷取公司财务");
}
}
public class demo {
public static void main(String[] args) {
// 创建一个假装和员工打成一片的老板
// 向上转型,将子类对象赋值给父类引用
Employee eBoss = new Boss();
eBoss.changeSalary(); // 输出 "老板只能加工资"
// 向下转型,将父类引用强制转换为子类引用
Boss b = (Boss) eBoss;
b.steel(); // 输出 "只有老板才有权限偷取公司财务"
// 如果class Employee没有那个空的steel()方法,则必须使用(Boss) eBoss向下转型才能使用class Boss的steel()方法
}
}
Last Modified in 2023-06-11