动手动脑(课堂作业05)第二句错误显示为:类型不匹配:不能从 Mammal 转换为 Dog 第三句错误显示为:类型不匹配:不能从 Cat 转换为 Dog

---恢复内容开始---

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

构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用也是这个原因,因为父类根本不知道子类有什么变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!

[email protected] 结果产生的原因

public class ExplorationJDKSource

{

/**

* @param args

*/

public static void main(String[] args)

{

System.out.println(new A());

}

}

class A{};

运行结果:

[email protected]

为啥会产生这样的结果??!!

原因分析:

main方法实际上调用的是: public void println(Object x),这一方法内部调用了String类的valueOf方法。

valueOf方法内部又调用Object.toString方法:

现在有三个类: class Mammal{} class Dog extends Mammal {} class Cat extends Mammal{} 针对每个类定义三个变量并进行初始化 Mammal m=null ; Dog d=new Dog(); Cat c=new Cat();

下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m;

我认为第一句不出错,可以用子类给父类赋值,因为子类里有父类里所有的变量;第二句会出错,不能用父类变量来给子类赋值,父类里面不一定包含不全子类里所有的变量;第三句不会出错若要用子类给父类赋值必须强转;第四句出错,这两个变量间没有直接关系;第五句对同第三句。

public class ParentChildTest {

public static void main(String[] args) {

Parent parent=new Parent();

parent.printValue();

Child child=new Child();

child.printValue();

parent=child;

parent.printValue();

parent.myValue++;

parent.printValue();

((Child)parent).myValue++;

parent.printValue();

}

}

class Parent{

public int myValue=100;

public void printValue() {

System.out.println("Parent.printValue(),myValue="+myValue);

}

}

class Child extends Parent{

public int myValue=200;

public void printValue() {

System.out.println("Child.printValue(),myValue="+myValue);

}

}

第二句错误显示为:类型不匹配:不能从 Mammal 转换为 Dog

第三句错误显示为:类型不匹配:不能从 Cat 转换为 Dog

public class ParentChildTest {

public static void main(String[] args) {

Parent parent=new Parent();

parent.printValue();

Child child=new Child();

child.printValue();

parent=child;

parent.printValue();

parent.myValue++;

parent.printValue();

((Child)parent).myValue++;

parent.printValue();

}

}

class Parent{

public int myValue=100;

public void printValue() {

System.out.println("Parent.printValue(),myValue="+myValue);

}

}

class Child extends Parent{

public int myValue=200;

public void printValue() {

System.out.println("Child.printValue(),myValue="+myValue);

}

}

先定义了一个父类对象以及子类变量,输出就显示出来第一二句,然后用children对象给parent对象赋值,parent对象的myValue变为200;parent函数printvalue也被覆盖,于是就有了第三句,value++是先输出再加一,于是输出第四句,然后强转输出,这是value已经是201,先输出在加一有了第五句

---恢复内容结束---

时间: 2024-10-27 07:22:48

动手动脑(课堂作业05)第二句错误显示为:类型不匹配:不能从 Mammal 转换为 Dog 第三句错误显示为:类型不匹配:不能从 Cat 转换为 Dog的相关文章

动手动脑课堂作业7---------

动手动脑1 CatchWho.java运行结果: CatchWho2.java运行结果: EmbedeFinally.java运行结果: finally语句块一定会执行吗? SystemExitAndFinally.java运行结果: 只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行.如果在try语句块之前返回(return)或者抛出异常,try对应的finally语句块就不会执行. 动手动脑2 如何跟踪异常的传播路径? 当程序中出现异常时,JVM

动手动脑(课堂作业05)

1,思考 class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent2 extends Grandparent { publi

动手动脑与作业

一.古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:请编写一个程序,使用上述算法加密或解密用户输入的英文字串. 1.设计思想 输入数据后,输入数字n,若n>5,则为加密过程,数据按ASCII码转化为int型,转化得来的数字加数字做为加密后的数据,再将这些数据转化为字符,这就是加密.若n<5,则为解密过程,数据按ASCII码转化为int型,转化得来的数字减数字做为解密后的数据,再将这些数据转化为字符,这就是解密. 2.程序流程图 3.源代码 //信1403-1班 张妞妞   加解密 imp

动手动脑课堂练习

一.原码.反码和补码 (出处:http://www.cnblogs.com/zhangziqiu/ ) 1.机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. (1).机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011.如果是 -3 ,就是 10000011 .那么,这里的 00000011 和 100

课堂作业05继承与多态

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

课堂作业05 《6种质量属性战术》

实现xxxx系统质量属性战术 1.可用性战术:错误检测战术 对XXXX系统的所有信息的输入及数据处理进行异常的处理.尤其对信息进行填报时,编写异常类来捕获异常. 2.易用性战术:设计战术 (1)在进行归口部门填写时,可以使用搜索词进行提示,方便进行填写. 在填写需求征集表格时,对于用户已注册填写过的基本信息,可以折叠,看起来更加简洁明了. (2)将用户接口与应用的其余部分分离开来:为方便用户接口的修改.将用户操作界面与实现分开实现. 3.可修改性战术:局部化修改 设计登陆的泛化模块,不同身份登陆

动手动脑java作业

1.程序截图 第一个false:判断s和t里的值,不同则输出false 第二个false:当且仅当这个类表示一个基本类型此方法返回true 第三个true:判断s和u里的值,相同则输出true 最后则是列出Size的所有值. 其中的问题: //s和t引用同一个对象?不是 //是原始数据类型吗?不是 2.计算机的原码.补码和反码: 1.原码:原码表示法是机器数的一种简单的表示法.其符号位用 0表示正号,用1表示负号,数值一般用二进制形式表示. 2.补码:机器数的补码可由原码得到.如果机器数是正数,

Java课堂作业05

1.随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路:定义一个长度为10的数组---->数组初始化---->利用随机数给数组元素分别赋值--->转换成字符串求和--->输出结果 程序流程图: 程序源代码: 结果截图: 编程注意及总结: 编写该程序定义数组时一定要初始化,随机数产生也借助for循环.

动手动脑+课后作业

一.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. 二.代码MethodOverLoad有什么特殊之处? 使用了同一种方法但是是不同类型. 这是"方法重载",构成重载的条件:1.方法名相同(square) 2.参数类型不同(int,double),参数个数不同或参数类型的顺序不同. 三. (1) (2) (3) (4) (5)