课程作业09:继承与多态课件中动手动脑的相关问题。

1. 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

构造方法在创建对象时被调用,用来初始化新对象,即为对象成员变量赋初值。子类要继承父类的成员变量和方法,如果不调用父类的构造方法,那么父类的成员变量和成员方法无法在子类创建对象时正确初始化。反过来调用不可以,因为父类不知道子类有什么变量,这样子类也得不到初始化的父类变量。

 

2.请自行编写代码测试以下特性,在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。

package practice;

public class UseSuperInherits

{

public static void main(String[] args)

{

Child c=new Child();

c.printValue();

}

}

class Parent

{

public int value=100;

public void printValue()

{

System.out.println("parent.value="+value);

}

}

class Child extends Parent

{

public int value=200;

public void printValue()

{

System.out.println("child.value="+value);

super.printValue();

}

}

运行结果截图:

3.类型转换知识点考核

下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?

m=d;

d=m;

d=(Dog)m;

d=c;

c=(Cat)m;

先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确。

m=d;       ture

d=m;       false

d=(Dog)m;  true

d=c;        false

c=(Cat)m;   true

测试结论:

d=m;和d=c;会引起编译错误,c=(Cat)m;会引起运行错误,编译错误因为子类对象可以直接赋给基类对象变量,基类对象要赋给子类对象变量,必须执行类型转换;运行错误因为基类对象变量m已经强制转化成Dog类对象变量,而Dog类与Cat类不存在子父类关系,不能强制类型转化。

4.在实践中理解把握复杂的知识

1)左边的程序运行结果是什么?

2)你如何解释会得到这样的输出?

3)计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

 

运行结果截图:

运行结果原因:

第一行与第二行:分别创建子类和父类的对象,并调用各自的方法。

第三行:将子类对象child赋值给父类对象parent,父类对象parent的属性值不变,只是将父类的同名方法覆盖,所以当父类对象parent只能调用子类的printValue()方法,又因为子类方法访问的是子类中的字段而不是父类,所以输出子类对象parent的myValue属性值200。

第四行:parent.myValue++是将父类对象parent的属性myValue++,变为101,但是父类对象parent调用方法时调用的还是子类的printValue()方法,子类方法访问的还是子类中的字段,所以输出子类对象child的myValue属性值200。

第五行:把父类对象parent强制类型转换成子类Child类型,此时对象parent的为子类对象,拥有子类的属性和方法,因此((Child)parent).myValue++后,parent的myValue的属性值变为201,输出结果201。

Java特性总结:

1.当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

  2.如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。

  3.如果子类被当作父类使用,则通过子类访问的字段是父类的。

时间: 2024-11-09 00:06:46

课程作业09:继承与多态课件中动手动脑的相关问题。的相关文章

课程作业10:异常处理课件中动手动脑的相关问题。

1.阅读以下代码CatchWho.java,CatchWho2.java,写出程序运行的结果:阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结. CatchWho.java示例代码: package ExceptSourceCode07; public class CatchWho { public static void main(String[] args) { try { try { throw new ArrayIndexOutOfBoundsExceptio

课堂作业05继承与多态

第七讲  继承与多态 一.为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 1. 由于子类是继承父类的,所以想用子类创建对象时,必须先创建父类的对象,这样子类才能有父类的属性和方法.在创建对象时如果父类的数据需要进行初始化,那么就需要调用父类的构造函数,使构造函数初始化. 2. 不能反过来 3. 原因:因为父类不知道子类有什么属性,而且反过来子类也不能得到父类初始化的变量. 二.运行以下测试代码: 1. 左边的程序运行结果是什么? 1. 你如何解释会得到这

java学习——关于java课件上动手动脑问题简单的分析

问题一:关于以下的代码为什么会产生错误的问题的简单分析. 第一个动手动脑提供了一下的代码,可以发现,在Foo的这个类中只定义了一个Foo(int)类型的构造函数,在之前的学习工程中,我们并没有接触到java的构造函数的声明过程,因此,在类中没有书写构造函数的方法的时候,编译器默认继承Object类,并在编译的时候会产生一个参数为空的构造函数,然而在定义的Foo这个类的时候,给予了一个Foo(int)类型的构造方法,所以在上述Test的调用过程中,obj1并不能够调用到new Foo()这个构造函

JAVA中动手动脑

第一个动手动脑: 首先用枚举类型定义两个变量,然后判断两个变量是否引用同一对象,在判断枚举类型是否是原始数据类型,再从字符串中转换,最后列出所有的对象. 很明显,这两个变量都是枚举类型,但是这两个变量引用的对象不一样,同样,枚举类型并不是原始数据类型. 得出的结论就是,同是枚举类型,但是引用的对象可以不同,枚举类型并不是原始数据类型. 我可能还是用不好枚举类型. 第二个动手动脑: 很明显,+a+b,只不过是先显示a再显示b, 而a+b+“  .. ”,就是先把a+b的结果显示出去,然后再加上要显

多态与异常------动手动脑

课堂动手动脑 1.    下面那个语句会引起编译错误? class Mammal{} class Dog extends Mammal {} class Cat extends Mammal{} public class TestCast { public static void main(String args[]) { Mammal m; Dog d=new Dog(); Cat c=new Cat(); m=d;//不会报错,子类的对象可以赋值给父类的引用 d=m;//会报错,父类的引用不

C++里的继承和多态(中)

  继承 1.单继承 class Base { public:                 Base()                 {                                 cout << "Base()" << this << endl;                 }                  void FunTest1()                 {                    

继承和多态中动手动脑

当子类对象和父类对象调用同名的方法的时候,只看这个对象是子类还是父类,调用他最真实的类中的方法. 这个是println调用的方法的不同,实际上他调用了内部的String类的valueOf方法,又接着调用了valueOf内部方法Object.toString   所导致的 这也验证了调用的是内部的toString方法从而实现调用类里边的函数. 原文地址:https://www.cnblogs.com/0518liu/p/9949645.html

多态与异常处理动手动脑

1.编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”.“及格”.“中”.“良”.“优”的结论.要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃. import java.util.Scanner; public class CourseEvaluation { public static void main(String[] args) throws Exception {//抛出异常信息 int n = 0; while(n!

java多态与异常处理——动手动脑

编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”.“及格”.“中”.“良”.“优”的结论. 要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃. import java.util.*; public class Mark { public static void main(String[] args) { Scanner sc =new Scanner(System.in); int score=0; System.out.pri