2023-03-26 Java OOP学习笔记(短)

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 

Leave a Comment Anonymous comment is allowed / 允许匿名评论