共六个类:Vehicle.java(车类), Car.java(轿车类), Bus.java(公共汽车类), Engine.java(发动机), VehicleFactory.java(汽车工厂) 和 VehicleTest.java(测试类),具体代码分别如下:
***************************************************************
abstract class Vehicle {
Engine engine;
double speed;
double mileage;
public Vehicle() {
}
public Vehicle(Engine engine) {
this.engine = engine;
}
public Vehicle(Engine engine, double mileage) {
this.engine = engine;
this.mileage = mileage;
}
public Vehicle(Engine engine, double speed, double mileage) {
this.engine = engine;
this.speed = speed;
this.mileage = mileage;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public double getSpeed() {
return speed;
}
public void setSpeed(double speed) {
this.speed = speed;
}
public double getMileage() {
return mileage;
}
public void setMileage(double mileage) {
this.mileage = mileage;
}
public double drive() {
this.setMileage(speed * (Math.round(Math.random() * 6)) + mileage);
return mileage;
}
public abstract double calGC();
public String toString() {
return "Type: " + this.getClass().getName() + ", Horsepower: "
+ engine.horsepower + ", Speed: " + speed + ", Mileage: "
+ mileage + ", Gas consumed: " + calGC();
}
}
***************************************************************
public class Car extends Vehicle {
public Car() {
}
public Car(Engine engine) {
this.engine = engine;
}
public Car(Engine engine, double mileage) {
this.engine = engine;
this.mileage = mileage;
}
public Car(Engine engine, double speed, double mileage) {
this.engine = engine;
this.speed = speed;
this.mileage = mileage;
}
public double calGC() {
return mileage * 2;
}
}
***************************************************************
public class Bus extends Vehicle {
public Bus() {
}
public Bus(Engine engine) {
this.engine = engine;
}
public Bus(Engine engine, double mileage) {
this.engine = engine;
this.mileage = mileage;
}
public Bus(Engine engine, double speed, double mileage) {
this.engine = engine;
this.speed = speed;
this.mileage = mileage;
}
public double calGC() {
return mileage * 3 + 20;
}
}
***************************************************************
public class Engine {
double horsepower;
public Engine() {
this.horsepower = 1;
}
public Engine(double horsepower) {
this.horsepower = horsepower;
}
public double getHorsepower() {
return horsepower;
}
public void setHorsepower(double horsepower) {
this.horsepower = horsepower;
}
}
***************************************************************
public class VehicleFactory {
public static Vehicle makeVehicle(Engine e) {
if ((1 <= e.getHorsepower()) && e.getHorsepower() <= 50) {
return new Car(e, 0);
} else if ((50 < e.getHorsepower()) && e.getHorsepower() <= 100) {
return new Bus(e, 0);
}
return null;
}
}
***************************************************************
public class VehicleTest {
public static void main(String[] args) {
// 新建一辆马力28, 速度50的车
Engine e1 = new Engine(28);
Vehicle v1 = VehicleFactory.makeVehicle(e1);
v1.setSpeed(50);
v1.drive();
v1.drive();
System.out.println("第一辆车:");
System.out.println(v1);
// 新建一辆马力88, 速度88的车
Engine e2 = new Engine(88);
Vehicle v2 = VehicleFactory.makeVehicle(e2);
v2.setSpeed(88);
v2.drive();
v2.drive();
System.out.println("第二辆车:");
System.out.println(v2);
}
}
***************************************************************
运行结果如下:
第一辆车:
Type: Car, Horsepower: 28.0, Speed: 50.0, Mileage: 200.0, Gas consumed: 400.0
第二辆车:
Type: Bus, Horsepower: 88.0, Speed: 88.0, Mileage: 616.0, Gas consumed: 1868.0
***************************************************************
⑵ JAVA中什么是继承
继承在本职上是特殊一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的 一些属性或方法。
1.Java继承的语法格式:
Java继承的关键字是:extends
public class 子类名 extends 父类名{...}
如: public class UNStudent extends Student {...} 注:1.子类又称超类,拓展类 ;父类又称基类。
2.Java中类的继承只能是单继承(单根继承),即一个类只能继承一个父类,但是一个类可以由多个类来继承它。
3.Java会给每一个没有设置父类的类,自动添加一个父类就是Object 。
(2)java的继承和组合扩展阅读:
一、子类继承父类的结果
1.子类继承父类后,继承到了父类所有的属性和方法。注:是所有。
2.子类可调用的方法也要看情况而定:
子类和父类在同一个包下时 “子类和子类的对象”可以调用父类的默认的,受保护的,公有的属性以及方法。
子类和父类在不同的包下时,在子类中可以调用受保护的,公有的属性以及方法,而子类的对象可以调用受保护的,公有的属性以及方法。
二、方法的重写
1.当子类和父类都有某种方法,而子类的方法更加要求细致,或者实现功能不同,就需要方法的重写。
2.重写条件
①必须要存在继承关系;只有继承之间的关系才能有方法的重写
②方法的返回值类型,方法名,参数个数,参数类型,参数顺序,必须要完全一致;
如:父类中方法 public void play (int n ; String s){方法体1...}
重写后的子类方法public void play(int n ; String s){方法体2...}
3.子类重写方法时的访问修饰符可以大于或者等于父类方法的访问修饰符。
4.重写后的方法会被优先调用。
三、自动转型
自动转型的实现要求有继承关系
格式如下:父类名 对象名 = new 子类构造方法;
如:Student stu = new UNStudent;
而强制转型格式如下:子类名 对象名 = (子类名)父类对象名
如:UNStudent un = (Student)stu;
自动转型可以拓宽方法的作用访问域
在使用自动转型后,子类自己定义的方法是不能在自动转型后执行;
原因是因为Java的编译机制,它会优先判断父类中是否存在该方法,如果存在则通过编译,如果不存在则报错。
第二种自动转型:转型后只需要不同类的不同对象调用想吐的方法,很方便!
/**访问修饰符 返回值数据类型 方法名(父类类型 参数名,...){
调用方法。
}
父类名 对象名 = new 子类名;
子类名 对象名 = new 子类名;
方法名(对象名);
*/
比如拿到驾驶证为A2的人,可以驾驶重型货车,当然也可以驾驶大型货车,中型货车,小型货车,小客车,小轿车,摩托车... 可以选择第二种自动转型的方法,便于调用同一个方法。
自动转型好处:1.减少冗余代码;2.在方法设置参数时,扩大访问范围。
四、多态
多态是由方法重载,继承,方法重写,自动转型等技术的组合。
五、为什么需要继承?
1.提高代码的重用性。
2.提高程序的扩展性。
JAVA继承总结
⑶ java 中的继承的 优点和缺点 主要是缺点
java 中的继承的 优点和缺点如下:
优点:1.可以使用父类的所有非私有方法;而且单继承可由接口来弥补。
2.可以继承父类中定义的成员方法以及成员变量,使得子类可以减少代码的书写。还可以重写父类的方法以增加子类的功能。
缺点:1.耦合性太大
2.就是破坏了类的封装性,其实继承一般多用于抽象方法的继承和接口的实现
⑷ java 为什么说多用组合,少用继承
java组合我没听收过,但是继承通常都会和实现放在一起说:
在java中,通常一个类只能继承一个类,但一个类却可以实现多个接口,所以采用实现的方式写代码会更加灵活
⑸ Java编程:组合,继承和代理的区别
组合的话,是在类中new一个对象,然后就只能调用这个对象的方法了,是死的
而你用代理的话,代理不仅要new那个对象,还要把你想调用这个对象的方法也写出来,方法实现是通过这个new的对象来实现的,当然你也可以在方法中添加你自己想实现的功能,这样做又有了继承中重写的感觉,所以说代理是继承和组合的中庸之道,lz可以看看thinking in java7.3章 7.4章 还有网页链接这篇博客,写的很详细
⑹ JAVA中继承的层次是不是越多越好
不是的
这要具体情况具体分析
一般情况下,能用组合的情况下尽量用组合
组合比继承好
⑺ 谁能给我讲讲java语言继承
继承是用来描述“是一种”关系的概念,也就是用来描述“一般到特殊”的过程。 比如说:苹果和水果之间就是“是一种”关系(苹果是一种水果),继承就是用来描述这种关系的。
在java语言中继承就是指子类在父类的基础上建立,由此子类获得了父类的行为和属性,并且子类可以通过添加新的行为来扩展父类。
继承使得我们可以在一个地方(父类)描述不同概念(不同的派生类)之间的相似部分,从而减少系统的冗余性。 如果没有继承,我们就必须在不同的派生类中重复定义相同的部分。
什么时候使用继承? 什么时候使用组合、聚合?
继承使用来描述不同类之间相似性的概念,当两个类之间存在“是一种”关系时,才可以使用继承。 组合和聚合是用来描述“整体、部分”关系,当两个类之间存在这种关系时,使用组合、聚合。
⑻ java中继承的好处是什么,在组合和继承中该如何取舍
1,继承提高了代码的重复利用性;
2,继承是面向对象的,一类事物可以独立存在,解藕了类与类之间的斗联系。
3,继承更利于程序的设计。
5,在组合中,一定要把同一类事物放在一起,和现实生活中一样,每一类事物都是有自己的共性和自己的特性,按毛主席的矛盾论说是:矛盾的普遍性与特殊性,普遍性就是继承来的。
6,在写代码之前,分析和设计是关键的一步,这一步解决的就是哪些类是同类的,哪些东西是公共的。