Java基础教程 从C/C++到Java(三)
Java学习的第三天
今日学习内容包括java中的:
- 重载(多态)
- 继承(多态)
- 造型
- 抽象
java做为纯OB语言和和C++在面向对象的过程中体现的差距还是有一些的。部分内容如Override,Object类、抽象类的具体应用方面没有深究
程序结构
背景大概是构造一个数据库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){
}
}
// 注意降低耦合度 提高可扩展性
明天还有最后一点讲交互、异常、流的内容,因为以例子为主,学起来可能比较艰难