第1关:学习-Java继承和多态之子类对象特点

  • 任务描述
  • 相关知识
  • 子类对象的特点
  • instanceof 运算符
  • 编程要求
  • 测试说明

任务描述

本关任务:使用 instanceof 运算符判断所指对象是否为特定类的一个实例。

相关知识

为了完成本关任务,你需要掌握:1. 子类对象的特点;2. instanceof 运算符。

子类对象的特点

在 Java 中一切都以对象的形式进行处理,在继承的机制中,创建一个子类对象,同样会创建一个父类子对象,这个对象与父类创建的对象是一样的。两者的区别在于后者来自外部,而前者来自子类对象的内部。当实例化子类对象时,父类对象相应被实例化。换句话说,在实例化子类对象时,Java 编译器会在子类的构造方法中自动调用父类的无参构造方法。

例子:

1. class Person {
2. // 父类无参构造方法
3. Person() {
4. System.out.println("调用父类的构造方法");
5. }
6. }
7. // 子类继承父类
8. class Students extends Person{
9. // 子类无参构造方法
10. Students() {
11. System.out.print("调用子类的构造方法");
12. }
13. }
14. class Demos{
15. public static void main(String[] args) {
16. // 实例化一个子类对象
17. Students s = new Students();
18. }
19. }

执行结果:

  1. 调用父类的构造方法
  2. 调用子类的构造方法

我们发现实例化子类对象时,会先实例化父类对象,然后再实例化子类对象,所以在子类构造方法访问父类的构造方法之前,父类已经完成实例化操作。

在实例化子类对象时,父类无参构造方法将被自动调用。有参构造方法不能被自动调用,用户只能使用 super 关键字显示地调用父类的构造方法。

当用子类的构造方法创建一个子类的对象时,不仅子类中声明的成员变量被分配了内存,而且父类的成员变量也都被分配了内存空间,但只将其中子类继承的那部分成员变量为分配给子类的变量。但为什么要将未继承的变量分配内存呢?因为,子类也许有一部分方法从父类继承,而这部分方法却可以操作继承的变量。所以我们需要。

1. class Person {
2. // 定义腿属性,并设置为 2
3. private int leg = 2;
4. int money; // 定义钱属性
5. // 定义 action 方法,设置腿的数量为 5,并输出相关信息
6. void action(){
7. leg = 5;
8. System.out.print(leg);
9. }
10. }
11. // Man 类继承 Person 类
12. class Man extends Person{
13. int height;
14. }
15. class human{
16. public static void main(String args[]){
17. Man you = new Man(); /*这条语句的执行意味着:money,leg,height,action 都被分配了空间*/
18. you.action(); //这条语句的执行说明了子类可以通过继承的方法来操作没继承来的变量
19. }
20. }

执行结果:

  1. 5

instanceof 运算符

Java 中的 instanceof 运算符是用来在运行时判断对象是否是特定类的一个实例。instanceof 通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

用法:

    1. boolean result = Object instanceof Class;

    名词介绍:

    • result:布尔类型;
    • Object:必选项。任意对象表达式;
    • Class:必选项。任意已定义的对象类。 说明: 如果 Object 是 Class 的一个实例,则 instanceof 运算符返回 true;如果 Object 不是指定类的一个实例,或者 Object 是 null,则返回 false。

    需要注意的是 instanceof 在 Java 的编译状态和运行状态是有区别的:

    在编译状态中,Class 可以是 Object 对象的父类、自身类、子类。在这三种情况下 Java 编译时不会报错。

    在运行转态中,Class 可以是 Object 对象的父类,自身类,不能是子类。在前两种情况下 result 的结果为 true,最后一种为 false。但是 class 为子类时编译不会报错,运行结果为 false。

    例子:

    1. class instanceOfDemo{
    2. public static void main(String []args){
    3. instanceOfDemo t=new instanceOfDemo();
    4. if(t instanceof instanceOfDemo){
    5. System.out.println("t是instanceOfDemo的实例");
    6. }
    7. }
    8. }

    执行结果:

    1. t是instanceOfDemo的实例

    编程要求

    仔细阅读右侧编辑区内给出的代码框架及注释,按照提示编写程序代码。

    测试说明

    平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。


    开始你的任务吧,祝你成功!

    /**
     * 任务:使用 instanceof 运算符判断指定对象是否为特定类的一个实例
     */
    class Person{}
    class Students extends Person{}
    class Sch extends Students{}
    public class Demos{
        public static void main(String[] args) {
            // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
            /********* Begin *********/
            // 创建一个Students对象,判断该对象是否是Person类的实例
            //如果是输出:true,否则为false
        Students students=new Students();
        if(students instanceof Person){
            System.out.println("true");
        }else System.out.println("false");
            // 创建一个Sch对象,判断该对象是否是Person类的实例
            // 输出判断结果
        Sch sch=new Sch();
        if(sch instanceof Person){
            System.out.println("true");
        }else System.out.println("false");
            // 创建一个Person对象,判断该对象是否是Students类的实例
            // 输出判断结果
        Person person = new Person();
        if(person instanceof Students){
            System.out.println("true");
        } else System.out.println("false");
            /********** End **********/
        }
    }