博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
继承与多态 动手动脑
阅读量:7180 次
发布时间:2019-06-29

本文共 1817 字,大约阅读时间需要 6 分钟。

1

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

提示:

构造函数的主要作用是什么?

从这个方面去想!

【答】

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

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

2

请自行编写代码测试以下特性(动手动脑):

在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。

【答】

源代码:

 

public class M1 {

   

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Children c=new Children();

    }

 

}

class Parent

{

    public Parent()

    {

        System.out.println("父类方法!!!");

    }

    public Parent(String s)

    {

        System.out.println(s);

    }

}

class Children extends Parent

{

   

    public Children()

    {

       

        super("调用父类方法!!!");

        //System.out.println("");

        System.out.println("孩子方法!!!");

    }

}

截图:

【3】

 

 

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);
}
}

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

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

这个特性实际上就是面向对象“多态”特性的具体表现。

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

转载于:https://www.cnblogs.com/wahaha123123/p/7810883.html

你可能感兴趣的文章
Linux 索引节点(inode)详解
查看>>
[saiku] 简化/汉化/设置默认页
查看>>
使用nginx搭建https服务器(转)
查看>>
Hibernate注解
查看>>
[转]World Wind Java开发之四——搭建本地WMS服务器
查看>>
3D数学基础:四元数与欧拉角之间的转换
查看>>
算法导论:二叉搜索树
查看>>
【译】Spring 4 自动装配、自动检测、组件扫描示例
查看>>
使用VS Code从零开始开发调试.NET Core 1.1
查看>>
openssl req 证书请求及自签名证书
查看>>
《linux 内核全然剖析》编译linux 0.12 内核 Ubuntu 64bits 环境
查看>>
路由器不重启,是否ip就永远不变
查看>>
安卓数据传递之---putextra与putextras
查看>>
【后会有期】
查看>>
Codeforces Round #346 (Div. 2) - D Bicycle Race
查看>>
nginx php上传大小设置
查看>>
spring原理机制
查看>>
Oracle分析函数-nulls first/nulls last
查看>>
Python中时间类解决类似朋友圈时间显示的小问题
查看>>
NodeJs针对Express框架配置Mysql进行数据库操作
查看>>