第七章-复用类-继承语法-2初始化基类-带参构造器

书上代码示例:

 1 package com.learnJava.test;
 2
 3 /**
 4  * @Author zhuchangli
 5  * @Date 2019/9/14
 6  **/
 7 class Game{
 8     Game(int i){
 9         System.out.println("Game constructor");
10     }
11 }
12
13 class BoardGame extends Game{
14     BoardGame(int i){
15         super(i);
16         System.out.println("BoardGame constructor");
17     }
18 }
19 public class Chess extends BoardGame{
20     Chess(){
21         super(11);
22         System.out.println("Chess constructor");
23     }
24
25     public static void main(String [] args){
26         Chess x = new Chess();
27     }
28 }

结论:如果不在BoardGame() 中调用基类构造器,编译器将抱怨无法找到符合Game() 形式的构造器。

练习6:用Chess.java 来证明前一段话。

注释掉:BoardGame 类中的super(i) 即可证明。

练习7:(1)修改练习5,使A和B以带参数的构造器取代默认构造器,为C写一个构造器,并在其中执行所有的初始化。

我的答案:

package com.learnJava.test;

/**
 * @Author zhuchangli
 * @Date 2019/9/14
 **/

class ArtA{
    ArtA(int i){
        System.out.println("A constructor");
    }
}

class ArtB extends ArtA{
    ArtB(int i){
        super(i);
        System.out.println("B constructor");
    }
}

public class CartoonC extends ArtB{
    CartoonC(int i){
        super(i);
        System.out.println("C constructor");
    }
    public static void main(String [] args){
        //ArtB b  = new ArtB(10);
        CartoonC c = new CartoonC(10);
    }

}

参考答案:

 1 package com.learnJava.test;
 2
 3 /**
 4  * @Author zhuchangli
 5  * @Date 2019/9/14
 6  **/
 7 class A7{
 8     A7(char c,int i){
 9         System.out.println("A7(char,int)");
10     }
11 }
12
13 class B7 extends A7{
14     B7(String d,float j){
15         super(‘ ‘,10);
16         System.out.println("B7(String,j)");
17     }
18 }
19
20 public class C7 extends A7{
21     private char c;
22     private int j;
23     C7(char a,int i){
24         super(a,i);
25         c = a;
26         j = i;
27     }
28
29     B7 b7 = new B7("hi",0.7f);
30     public static void main(String [] args){
31         C7 c7 = new C7(‘a‘,100);
32     }
33 }

我未知的是:可以在 C7类中 定义B7 类和 初始化。而C7类和B7类都是继承的是 A7。

练习8:(1)创建一个基类,它仅有一个非默认的构造器;再创建一个导出类,它带有默认构造器和非默认构造器。在导出类的构造器中调用基类构造器。

参考答案:

 1 package com.learnJava.test;
 2
 3 /**
 4  * @Author zhuchangli
 5  * @Date 2019/9/14
 6  **/
 7
 8 class A8{
 9     private char a;
10     private int i ;
11     A8(char c,int j){
12          a = c;
13          i = j;
14          System.out.println("A8(char,int)");
15     }
16 }
17
18 public class C8 extends A8{
19     private char ch;
20     private int k;
21     C8(){
22        super(‘z‘, 0);
23         System.out.println("C8()");
24     }
25     C8(char a,int i){
26         super(a,i);
27         ch = a;
28         k = i;
29         System.out.println("C8(char,int)");
30     }
31
32     public static void main(String [] args){
33         C8 c8 = new C8();
34         C8 c81 = new C8(‘a‘,100);
35     }
36 }

未知点:在C8(),默认构造方法中不知道该如何调用基类方法。

原文地址:https://www.cnblogs.com/changlili/p/11520726.html

时间: 2024-11-10 18:59:37

第七章-复用类-继承语法-2初始化基类-带参构造器的相关文章

Thinking In Java笔记(第七章 复用类)

第七章 复用类 复用代码是Java众多引人注目的功能之一,但想要成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. Java中所有事物都是围绕着类来展开的.通过创建新类来复用代码,不必重新开头编写.此方法的窍门在于使用类而不破坏现有程序代码.本章中有两种代码重用机制来达到这一目的: 只需要在新的类中生成现有类的对象.由于新的类是由现有类的对象所组成的,这种方法通常成为组合.该方法只是复用了现有程序代码功能,而非形式上和之前的类有相似之处. 第二种方法更加细致

《JAVA编程思想》学习笔记——第七章 复用类

复用类的主要方式有两种:组合,继承 组合 例: class A {} class B {A a;} 继承 继承是所有OOP语言和Java语言不可缺少的组成部分.当创建一个类时,总是在继承,因此,除非已明确指出要从其它类中继承,否则就是在隐式地从Java的标准根类Object进行继承. 继承适用关键词:extends,继承会自动得到基类中所有的域和方法 super super关键字表示超类的意思,当前类就是从超类继承来的.调用超类方法:super.funcName(); 初始化基类 无参构造器,J

《Java编程思想》笔记 第七章 复用类

1.组合 将其他类的对象引用置于新的类中. 3.继承 关键词extends  一个类继承基类后自动获得 基类的所有域(包括字段 引用 内部类 )和方法,当然不包括private,子类中调用继承下来的方法也不需要基类对象引用.继承相当于对基类的一个扩展,因为基类有的它都有,再额外添加了一些域和方法(或覆写方法)而已. 4.super 4.1 super.f() 调用基类的f()方法. 4.2 构造器中的super(args) 调用基类构造器,且只能在第一行. 4.3 由于构造器被重载后默认构造器不

【转载】 C++多继承中重写不同基类中相同原型的虚函数

本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class CBaseB { public: virtual void TestB(); }; class CDerived : public CBaseA, public CBaseB { public: virtual void TestA()

C++ 类的继承五(多继承的二义性--虚基类)

//多继承的二义性--虚基类(了解为主) #include<iostream> using namespace std; /* 多继承在现在的项目开发中一般不使用,他会增加项目的复杂度 */ class Point{ public: Point(){ x = 1; y = 1; } int x; int y; }; class PointA :virtual public Point{ public: PointA(){ a = 2; } int a; }; class PointB :vir

类的集成,对基类私有成员的访问

派生类不能直接访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数.实现方法有如下两种: 1.在基类的声明中增加保护成员,将基类中提供给派生类访问的私有成员定义为保护成员.2.将需要访问基类私有成员的派生类成员函数声明为友元. #include<iostream> using namespace std; class Base {       friend class Derived2;//friend       int x;       protected://protecte

java 编程思想之7.2.1初始化基类

继承是所有OOP语言不可缺少的能成部分.但继承并不只是复制基类的接口.当创建一个导出类的对象时,该对象包含了一个基类的子对象.这个子对象与你用基类直接创建的对象是一样的.二者的区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部. 对基类子对象的正确初始化顺序之前不能说不知道,好像所有知道点都一样,只是去看,就觉得自己掌握了,其实不是.那只是当时的自以为.呵呵,眼高手低.今天看到相关的章节,翻翻又是觉得都是自己知道的呀.也许是对同一个知识点有过太多次这种想,于是今天决定不只是看,不只是

【C++】派生类对象初始化基类的引用

//派生类对象初始化基类的引用 //引用是别名,但这个别名只能包含派生类对象中的由基类继承来的隐藏对象 #include <iostream> using namespace std; class B { public: B() { cout<<"B"<<endl; } void fun() { cout<<"B::fun()"<<endl; } private: int x; }; class D : p

详解C++中基类与派生类的转换以及虚基类

很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生