首页 > 其他分享 >动手动脑10.7

动手动脑10.7

时间:2022-10-13 16:01:00浏览次数:52  
标签:调用 10.7 parent 子类 动脑 动手 myValue 父类 public

1.动手实验1:
运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大!

运行结果:

由此我们可以得出结论

通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。

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

构造函数主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可以根据参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。

构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用也是这个原因,因为父类不知道子类有什么变量而且子类也得不到初始化的父类变量,导致程序运行出错。

3.请按照以下步骤进行技术探险: (1)使用javap –c命令反汇编ExplorationJDKSource.class; (2)阅读字节码指令,弄明白println()那条语句到底调用了什么? (3)依据第(2)得到的结论,使用Eclipse打开JDK源码,查看真正被执行的代码是什么 激动啊,我终于发现了……

main方法实际上调用的是
public void println(Object x)

这一方法内部调用了String类的valueOf方法。
valueOf方法内部又调用Object.toString方法:
public String toString() {
    return getClass().getName() +"@" +
    Integer.toHexString(hashCode());
}
4.

 

 为什么会这样输出?

在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。

代码:

package wsz;
class test1{
    public test1()
    {
        System.out.println("父类测试");
    }
}
class Son extends test1
{
    public test2()
    {
        super();
        System.out.println("子类测试");
    }
}
public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Son son = new Son();
    }

}

 

运行结果

 

Java方法覆盖原则

(1)覆盖方法的允许访问范围不能小于原方法。 (2)覆盖方法所抛出的异常不能比原方法更多。 (3)声明为final方法不允许覆盖。 例如,Object的getClass()方法不能覆盖。 (4)不能覆盖静态方法。

多态( polymorphism )的概念为相同的一条语句,在不同的运行环境中可以产生不同的运行结果。

5.下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m; 先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确。

 

 

错误原因:类型不匹配:不能从 Mammal 转换为 Dog。

请看以下“变态”的类(参看示例ParentChildTest.java)

 

 

上述代码的特点是: 子类和父类定义了一模一样的字段和方法

package wsz;

public class test {
    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);
    }
}

1. 左边的程序运行结果是什么? 2. 你如何解释会得到这样的输出? 3. 计算机是不会出错的,之所以得 到这样的运行结果也是有原因的, 那么从这些运行结果中,你能总 结出Java的哪些语法特性?

运行结果为

 

 

第一个100:是parent调用PrintValue方法输出parent类中myValue值为100;

第二个200:是child调用PrintValue方法输出child类中myValue值为200;

第三个200:是parent = child,将子类对象的赋值给父类,但此时parent只能调用子类的方法,调用子类PrintValue时,输出的当然是子类的myValue值200。

第四个200:虽然parent = child,但parent不能调用子类的变量,所以parent.myValue++;只是将父类对象中的变量myValue值+1但不能改变子类的myValue值,但调用的是子类PrintValue方法时,输出的是子类的myValue值200。

第五个201:(Child)parent,强制转化parent为child对象,此时parent完全成为child对象,所以输出值为201。

由此可以得出Java语言有什么特点

1.当子类和父类拥有同名方法时,并且让一个父类变量引用一个子类对象时,调用哪个方法由自己的真实类型来决定。

2.如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。

5.多态为什么它被看成是面向对象编程技术中最重要的特性之一?

多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

多态优势

  • 消除类型之间的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

多态存在的三个必要条件

  • 继承关系
  • 方法重写
  • 父类引用指向子类对象

 

标签:调用,10.7,parent,子类,动脑,动手,myValue,父类,public
From: https://www.cnblogs.com/azwz/p/16788433.html

相关文章

  • 10.7 上课问题的讨论与思考
    一、动手实验:继承条件下的构造方法调用继承的语法:class子类名extends父类名{......}  父类(parentclass)和超类(superclass)两者通常指直接上级基类(baseclass)......
  • 动手动脑——继承和多态
    动手实验 classGrandparent{publicGrandparent(){System.out.println("GrandParentCreated.");}publicGrandparent(St......
  • 实战项目-用winform动手写一个计算器
    实战项目-用winform动手写一个计算器实战项目--用winform动手写一个“计算器”实战项目旨在交流学习,欢迎在评论区交流意见。简介:分享一个简单的软件项目---自己动手写一个......
  • 继承与多态中动手动脑
    -子类自动拥有父类声明为public和protected的成员,这就是继承特性的体现之一。-public:外界可自由访问-private:外界不可访问-protected:同一包中的子类都可以访问,另一包......
  • 动手动脑
    引用类型vs原始数据类型“引用”一个对象的变量称为“引用类型”的变量,有时又简称为“对象变量”。例:MyClassobj=newMyClass();诸如int,float之类的变量称为“原始......
  • 动手动脑:方法覆盖
    注:方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload)测试:1.  在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。packagetest2;classGrandp......
  • 动手实验:继承条件下的构造方法调用
    packagetest2;classGrandparent{publicGrandparent() { System.out.println("GrandParentCreated."); }publicGrandparent(String......
  • 2022.10.7 Java第五次课总结
    继承java的继承与C++的继承的区分java中的继承是单项继承,区分与C++的多项继承,这种继承避免了C++继承中可能出现的冲突的问题,单项继承父类所有的属性,子类对于好的属性可以......
  • 自己动手写ls命令——Java版
    自己动手写ls命令——Java版介绍在前面的文章Linux命令系列之ls——原来最简单的ls这么复杂当中,我们仔细的介绍了关于ls命令的使用和输出结果,在本篇文章当中我们用Java代......
  • 9.30动手动脑
    对于Java字段的初始化来说,共有以下几种方法:1.类的构造函数(构造方法):当创建一个对象时,其构造函数就会自动调用。构造方法必须与类名相同,无返回值。如果程序员没有定义一......