Java类的扩展
*当我们创建一个Java project,这个项目名和包都可以命名为demo,在这个包中创建我们需要的类,来完成某些功能。但这远远不够,当我们需求变得更多的时候。Java类的扩展是一个非常好的解决问题方法。
或者说Java类的继承 *
package dome;
public class CD extends Item {
//extends扩展,CD就是Item的一个子类,通过派生,继承
//CD中的属性动作
// private String title;
private String artist;
private int numbofTracks;
// private int playingTime;
// private boolean gotIt = false;
// private String comment;
//属性构造
public CD(String title, String artist, int numbofTracks, int playingTime, String comment) {
super(title,playingTime,false,comment); //构造
// this.title = title; //this一般指的是类CD
this.artist = artist;
this.numbofTracks = numbofTracks;
// this.playingTime = playingTime;
// this.comment = comment;
}
代码中能看到类CD扩展类Item,也可以说子类CD继承父类Item
但是也要注意:
- 子类和父类的关系,属性访问并不继承;
- 当我们去构造一个子类的对象的时候,他首先要确保它的父类所拥有的那些成员变量得到恰当的初始化;
- 所谓父类中的初始化:1定义初始化,2构造器,若这两个模块同时存在,先做定义初始化;
- 如果父类和子类都有定义初始化和构造器,先开始执行父类中的程序,在做子类中的程序;
父类Item
对象变量和属性
package dome;
public class Item {
//定义 子类中的公共属性
private String title;
private int playingTime;
private boolean gotIt = false;
private String comment;
//构造初始化这些属性
public Item(String title, int playingTime, boolean gotIt, String comment) {
super();
this.title = title;
this.playingTime = playingTime;
this.gotIt = gotIt;
this.comment = comment;
}
父类和子类的关系:
- 类定义了类型,子类定义了子类型
- 子类的对象可以被当作父类的对象来使用:1赋值给父类的变量2传递给需要父类对象的函数3放进存放父类对象的容器;
- 子类的对象可以传递给需要父类的对象的函数,子类对象可以赋值给父类的变量,变量只是对象的一个管理者;
容器的定义
需要一个类对容器的定义,方便父类中的变量执行后续操作对子类中的对象和属性。
子类的对象可以放在存放父类对象的容器中;
package dome;
import java.util.ArrayList;
public class Database {
// private ArrayList<CD>listCD = new ArrayList<CD>(); //容器CD唱片
private ArrayList<Item>listItem = new ArrayList<>(); //做一个新类Item
// public void add(CD cd) //添加数据
// {
// listCD.add(cd);
// }
public void add(Item item) //item多态变量,Item是item的声明类型,一般是静态的
{
listItem.add(item);
}
public void list() //表单中的所有数据
{
// for(CD cd:listCD)
// {
// cd.print();
// }
for(Item item : listItem) //for each循环,变量item只是一个管理者
{
item.print(); //输出各个子类中的对象
System.out.println();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Item item = new Item();
CD cd = new CD("b","h",5, 60,"sdfsefg");
item = (Item)cd; //造型
//CD cc =(CD)item; //强制,但不是类型转换
Database db = new Database();
- Java的对象变量是多态的,他们能保存不止一种类型;
- 他们可以保存的是声明类型的对象,或声明类型的子类的对象;
- 把子类的对象赋给父类的变量的时候,就发生了向上的造型;
向上造型
造型cast:子类对象可以赋值给父类的变量,但注意!Java中不存在对象对对象的赋值!,父类的对象不能赋值给子类的变量!
Vechicle v; 父类
Car c = new Car; 子类
v = c ;可以
c = v ;错误,只能向上造型
可以用造型: c = (Car)v;(只有当v这个变量实际管理的是Car才行)
向上造型,拿一个子类的对象,当作父类的对象来用
向上造型是默认的,不需要运算符,向上造型总是安全的
Java类的继承总结
- 继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
- Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
- 这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如可以先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
类和类之间的继承关系可以用UML符号表示,其中父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。
JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。
构造器
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。
如果父类的构造器带有参数,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用super关键字调用父类构造器,系统会自动调用父类的无参构造器。