1、交通工具类(vehicle)
成员变量:
类型(vType) String类型 如: 小型车、大型车
载客人数(vNum) int类型 如: 20
构造方法:
构造方法(1),输出“创建了一个交通工具”;
构造方法(2),调用构造方法(1),并通过形参初始化类型(vType)和载客人数(vNum);
普通方法:
设置get和set方法用于获取和设置类中各个变量的值;
重写Equals方法,当且仅当类型(vType)和载客人数(vNum) 均相等时,即为同一交通工具。
重写toString方法,返回类型(vType)和载客人数(vNum)的信息
样式如下:类型:小型车,载客人数:20
2、计费接口(Charge)
成员方法:
billingMethods( ),用于输出不同类型交通工具的不同计费方式,如:
公交车计费方式:
一元/张(不计公里数)
3、公交车类(Bus)
继承vehicle类
实现Charge接口
成员变量:
线路号(bNo) String类型 如:5路、4路
线路(line) String类型 如:科技学院—火车站
构造方法:
先调用父类构造方法(2)初始化类型(vType)和载客人数(vNum),再初始化线路号(bNo)和线路(line)。
普通方法:
重写billingMethods( )方法。
定义showBus()方法,用于输出Bus对象的所有信息(父类和子类)
4、通过main函数测试。
创建两个vehicle对象v1和v2,分别输出v1和v2,并调用其equals方法判断两个对象是否相等;
创建一个Bus对象,调用其showBus()方法和billingMethods( )方法。
1、程序代码:
//*************交通工具类******************** public class Vehicle { private String vType; private int vNum; public Vehicle(){ System.out.println("创建了一个交通工具"); } public Vehicle(String vType,int vNum) { this(); this.vType = vType; this.vNum = vNum; } public String getvType() { return vType; } public void setvType(String vType) { this.vType = vType; } public int getvNum() { return vNum; } public void setvNum(int vNum) { this.vNum = vNum; }
public boolean equals(Object obj) { // 判断当前对象和传递的对象,如果是同一个对象直接通过 if (this == obj) { return true; } // 判断传递进来的对象是否是Vehicle类型,不是的话直接pass if (!(obj instanceof Vehicle)) { return false; } // 将obj向下转型为Vehicle引用,可以访问Vehicle特有内容,否则只能访问共有内容 Vehicle v = (Vehicle) obj; return this.vType == v.vType && this.vNum == v.vNum; } @Override
public String toString() { return "Vehicle{" + "类型:'" + vType + '\'' + ",载客人数:" + vNum + '}'; } } //***************Charge接口***************** interface Charge{ public abstract void billingMethods(); } //*************公交车类********************* class Bus extends Vehicle implements Charge{ private String line; private String bNo; public String getbNo() { return bNo; } public void setbNo(String bNo) { this.bNo = bNo; } public String getLine() { return line; } public void setLine(String line) { this.line = line; } public Bus(String vType,int vNum,String bNo,String line) { super(vType,vNum); this.bNo = bNo; this.line = line; } public void billingMethods(){ System.out.println("一元/张(不计公里数)"); } public void showBus(){ System.out.println("类型:"+this.getvType()); System.out.println("载客人数"+this.getvNum()); System.out.println("线路号:"+this.bNo); System.out.println("线路:"+this.line); } public static void main(String[] args){
//创建两个交通工具对象 Vehicle v1=new Vehicle("火车",1209); Vehicle v2=new Vehicle("客机",235); System.out.println(v1.toString()); System.out.println(v2.toString()); System.out.println("两个对象是否相等:"+v1.equals(v2));
//创建一个公交车类 Bus bus=new Bus("公交车",34,"K5","8848"); bus. showBus(); bus.billingMethods(); } }
测试结果:
2、程序解析:
(1)用到的知识点:
a、类的创建(成员变量与成员方法的创建,构造方法,方法的重写)
b、类的继承(extends)
c、接口的创建与实现(implements)
d、方法的重写(equals()方法和toString()方法)
(2)程序解析:
a、交通工具类:
创建该类的目的是被后面的Bus类所继承。
equals方法是对两个对象的内存地址的比较,无实际意义。因此,需要子类重写equals方法。用于比较两个对象的值是否相等
toString方法如果不重写的话返回对象的内存地址,没有实际意义,因此需要进行重写返回对象的信息。
public class Vehicle { //成员变量用private修饰,不允许外界(Vehicle类外)直接访问,但是此类内部可直接访问,保证了安全性 private String vType; private int vNum; //定义构造方法(一种特殊的方法): //方法名与类名相同 //无返回值,但是不能加void。 public Vehicle(){ System.out.println("创建了一个交通工具"); } public Vehicle(String vType,int vNum) { //调用本类的构造方法用this关键字 this();//调用本类无参的构造方法 this.vType = vType; this.vNum = vNum; } public String getvType() { return vType; }//创建getvType方法目的是提供给外界获取本类的成员变量的值的路径,因为成员变量为Private,但是此方法为Public public void setvType(String vType) { this.vType = vType; }//创建setvType方法目的是提供给外界修改本类的成员变量的值的路径,因为成员变量为Private,但是此方法为Public public int getvNum() { return vNum; } public void setvNum(int vNum) { this.vNum = vNum; } public boolean equals(Object obj) { // 判断当前对象和传递的对象,如果是同一个对象直接通过 if (this == obj) { return true; } // 判断传递进来的对象是否是Vehicle类型,不是的话直接pass if (!(obj instanceof Vehicle)) { return false; } // 将obj向下转型为Vehicle引用,可以访问Vehicle特有内容,否则只能访问共有内容 Vehicle v = (Vehicle) obj; //将比较的结果返回 return this.vType == v.vType && this.vNum == v.vNum; } @Override //返回此对象的信息 public String toString() { return "Vehicle{" + "类型:'" + vType + '\'' + ",载客人数:" + vNum + '}'; } }
b、创建计费接口:
接口:接口是比抽象类更为抽象的类,interface关键字提供了一个完全抽象的类,包含了类要实现的方法。一个接口的实现类必须实现接口所描述的所有方法,否则就必须声明为抽象类。
接口的特点:
成员变量:必须是静态的,且必须要赋初值,改制不能再被修改。默认修饰符为:public static final
成员方法:为抽象的,public abstarct 可以省略,接口中不能有一般方法。
interface Charge{ public abstract void billingMethods(); }
c、公交车类:
class Bus extends Vehicle implements Charge{ private String line; private String bNo; public String getbNo() { return bNo; } public void setbNo(String bNo) { this.bNo = bNo; } public String getLine() { return line; } public void setLine(String line) { this.line = line; } public Bus(String vType,int vNum,String bNo,String line) { //子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句 super(参数列表) 调用父类的构造方法 super(vType,vNum); this.bNo = bNo; this.line = line; } //实现接口中的方法 public void billingMethods(){ System.out.println("一元/张(不计公里数)"); } public void showBus(){ System.out.println("类型:"+this.getvType());//Bus类在交通工具类外,需要用getvType()获取值 System.out.println("载客人数"+this.getvNum()); System.out.println("线路号:"+this.bNo); System.out.println("线路:"+this.line); } public static void main(String[] args){ Vehicle v1=new Vehicle("火车",1209); Vehicle v2=new Vehicle("客机",235); System.out.println(v1.toString()); System.out.println(v2.toString()); System.out.println("两个对象是否相等:"+v1.equals(v2)); Bus bus=new Bus("公交车",34,"K5","8848"); bus.showBus(); bus.billingMethods(); } }