Java基础教程 从C/C++到Java(三)

Java基础教程 从C/C++到Java(三)

Java学习的第三天
今日学习内容包括java中的:

  1. 重载(多态)
  2. 继承(多态)
  3. 造型
  4. 抽象

java做为纯OB语言和和C++在面向对象的过程中体现的差距还是有一些的。部分内容如Override,Object类、抽象类的具体应用方面没有深究

程序结构

Java基础教程 从C/C++到Java(三)_第1张图片
背景大概是构造一个数据库A存放CD\DVD\Game的信息
共包含六个文件 其中DataBase是抽象类, CD、DVD、Game都是Item的子类

代码

首先是作为公共属性的DataBase抽象类 只是展示一下形式所以与DataBase无联系

DataBase.java

package dataBase;

import java.awt.*;

public abstract class DataBase {  // 抽象类 表达概念而无法构造实体的类 有点类似于C++的Virtual
    public abstract void abstractFunction();  // 抽象函数无函数体 表达概念而实现代码的函数

    // 有抽象函数的类一定是抽象类
    // 抽象类不能制造对象 但是可以定义变量
    // 任何继承了抽象类的非抽象类的对象可以赋给这个变量(与C++类似类似)
    // 继承自抽象类的子类必须覆盖父类中的抽象函数 否则子类会称为抽象类
}

紧接着是DataBaseA

DataBaseA

package dataBase;

import java.util.ArrayList;

public class DatabaseA {
    private ArrayList<Item> itemDatabase = new ArrayList<Item>();  // 范型容器类

    public void add(Item item){
        itemDatabase.add(item);
    }

    public void showDatabase(){
        for(Item item : itemDatabase) {
            item.print();       // 使用item这个父类的方法print
        }
    }

    public static void main(String[] arg){
        DatabaseA db = new DatabaseA();

        // 子类对象可以当作父类对象来使用 虽然是Item类但也可以放入其子类对象
        // 比如Item item = new CD();这种语句也可以 体现了java多态变量的特点
        // 当子类对象赋给父类对象时发生[向上造型]
        // java中不允许对象之间相互赋值(C++可以) 且仅允许子类对象给父类变量赋值 不可逆 如:
        // Parents p; Offspring f = new Offspring(); p = f 可以, f = p 不行
        // 可以用造型运算 f = (Offspring) p; 形式上有点像变量的强制转换

        db.add(new CD("Cat", "Tom"));  // 向上造型
        db.add(new CD("Mouse", "Jerry"));  // 向上造型
        db.add(new DVD("Interstellar", "Nolan", 2014));  // 向上造型
        db.add(new Game("Gris", "Traveling"));

        db.showDatabase();
    }
        // java中所有的类都是Object的子类(C++不是) Object类包含一些可被@Override的方法 有需要再深学
}

DataBase类中使用了Item类的对象,而Item类具有其子类CD\DVD\Game的公共属性 是三者的父类

Item.java

package dataBase;

public class Item {  //CD和DVD类继承于此
    private String title;  // 子类的共有属性 protected属性包内及子类可访问  尽量少用

    public Item(String title){  // 父类的构造函数 提供初始化 不能设成private
        super();                 // 似乎没有用?
        this.title = title;
    }

    public void print() {  //当子类对此函数重载时优先使用子类函数 若本函数为空函数则相当于静对动的多态
        System.out.print(title);    // 子类无法直接访问作为公共属性的title 需要在父类中操作
    }
}

子类1CD.java

package dataBase;

public class CD extends Item{  // 从Item父类继承  java不支持多继承
    private String title;
    private String artist;

    public CD(String title, String artist){
        super(title);
//        this.title = title;  // 使用了super()就无需这句了
        this.artist = artist;
    }

    public void print(){
        super.print();  // 输出title 由于title是父类私有的不允许子类访问 故对title的操作需要在父类中进行
        System.out.println(" " + artist + " ");
    }

    public static void main(String[] arg){
        //nothing
    }
}

子类2DVD.java

package dataBase;

public class DVD extends Item{  // 从Item父类继承 java不支持多继承

    private String director;
    private int publicYear;

    public DVD(String title, String director, int publicYear){
        super(title);  // 使用向上造型 传递title使其在父类中初始化
//        this.title = title;
        this.director = director;
        this.publicYear = publicYear;
    }

//    public void print(){
//        System.out.println(title + " " + director + " " + publicYear);  // title此处已经是null了
//    }
    public void print(){
        super.print();  // 输出title 由于title是父类私有的不允许子类访问 故对title的操作需要在父类中进行
        System.out.print(" " + director + " " + publicYear + "\n");
    }


    private static void main(String[] arg){
        //nothing
    }
}

子类3Game.java

package dataBase;

public class Game extends Item{
    private String gameType;

    public Game(String title, String gameType){
        super(title);
        this.gameType = "RPG";
    }

    @Override               // 重载 非Object类不要@Override也行?
    public void print(){
        super.print();
        System.out.print(" ");
        System.out.println(new Game("Gris", "Traveling").gameType);
    }

    public static void main(String[] arg){

    }
}

// 注意降低耦合度 提高可扩展性

明天还有最后一点讲交互、异常、流的内容,因为以例子为主,学起来可能比较艰难

你可能感兴趣的:(学习笔记)