概述
6.1抽象类
在继承的层次结构体系中,子类会变得越来越明确和具体,父类会变得更通用、更加明确。类的设计通常确保父类包含子类的共同特征,以至于没有任何实例,这样的类称为抽象类。
有些方法不能在父类中实现,因为实现方法取决于子类的类型,这样的方法称为抽象方法(abstract method)。
抽象类不能使用new操作符创建它的实例。抽象方法由子类实现,一个包含抽象方法的类必须声明为抽象类。抽象类的构造方法由protected 修饰,因为他只被子类实现。看了很多书本上的关于抽象方法的例子,抽象方法也是为了更好的实现多态,也是在为多态服务。
抽象类总结:
1. 有抽象方法的一定是抽象类,但是抽象类不一定包含抽象方法。子类如果不实现父类所有抽象方法,子类也必须是抽象的。父类是具体的,子类也可以是抽象的。子类还可以覆盖父类的方法,并把它定义为抽象的,这种很少见,但是当父类的实现在子类中变得不合法时是很有用的。
2. 抽象方法是非静态的。
3. 抽象类是不能用new操作符来初始化,但是可以定义他的构造方法,这个构造方法在他的子类的构造方法中调用。不能用new操作符创建对象,但是抽象类可以用作一种数据类型(这句话有点懵)。如下例:
GeometricObject[]objects = new GeometricObject[10];
objects[0] = newCircle();
感受下抽象类的好处吧:
public class TestGeometricObject {
public static void main(String[] args) {
GeometricObject geoObject1 = new Circle(5);
GeometricObject geoObject2 = new Rectangle(5,3);
System.out.println("The two objects have the same area? " +
equalArea(geoObject1, geoObject2));
displayGeometricObject(geoObject1);
displayGeometricObject(geoObject2);
}
/** A method for comparing the areas of twogeometric objects */
public static boolean equalArea(GeometricObject object1,
GeometricObject object2) {
return object1.getArea() == object2.getArea();
}
/** A method for displaying a geometricobject */
public static void displayGeometricObject(GeometricObjectobject) {
System.out.println();
System.out.println("The area is " + object.getArea());
System.out.println("The perimeter is " + object.getPerimeter());
}
}
6.2接口
接口(interface)是一种与类相似的结构,只包含常量和抽象方法。接口在很多地方是与抽象类相似的,但是它的目的是指明多个对象的共同行为。
在Java中,接口或多或少被看作是一种特殊的类。与抽象类相似,不能使用new操作符创建实例,但是大多数情况下,使用接口或多或少都有点像使用抽象类。当一个类实现接口时,该类实现了定义在接口中的所有带确切签名和返回类型的方法。
由于接口中所有数据域都是publicfinal static , 所有方法都是public abstract,所以可以忽略这些修饰符。接口内定义的常量可以使用“接口名.常量名”来访问。
判断一下对错:
Interface A {
voidprint() {};
}
Interface A {
Voidprint();
}
第二个例子是正确的。
6.3接口和抽象类的区别
| 变量 | 构造方法 | 方法 |
抽象类 | 无限制 | 子类通过构造方法链来调用构造方法 | 无限制 |
接口 | 变量必须是public static final,即常量 |
没有构造方法 | 必须是public abstract |
另外接口可以实现多重继承。所有的类共享根类Object,但是接口没有共同的根。
抽象类和接口都是用来明确多个对象的共同特征。强是关系(is-a relationship)用抽象类建模。弱是(weak is-a relationship)它表明对象拥有某种属性,弱是关系用接口来建模。推荐使用接口,因为接口可以定义不相关类共有的父类型,接口更加灵活。
6.4基本类型和包装类型之间的自动转换
Java中允许基本类型和包装类型之间进行自动转换。将基本类型转换为包装类对象的过程称为装箱(boxing),相反的过程称为开箱(unboxing)。如果一个基本数值类型出现在需要对象的环境中,编译器会将基本类型自动进行装箱;如果一个对象出现在需要基本数值类型的环境中,编译器将对对象自动开箱。
Interger[] intArray = {1,2,3}; boxing
System.out.println(intArray[0] +intArray[1]); unboxing
既可以用基本类型值也可以用表示数值的字符串来构造包装类。包装类没有无参构造方法。所有包装类的实例都是不可变的,这意味这一旦创建对象,它的内容就不能在改变。
数值包装类有个有用的静态方法valueOf(String s)。该方法创建一个新对象,并把它初始化为指定字符串表示的值。例如:Double d = Double.valueOf(“12.4”);
Interger类中的parseInt方法将一个数值字符串转变成一个double值。比如:
Interger.parseInt(“11”,2) return 3;
每个数值包装类都会实现在Number类中定义的抽象方法doubleValue()、intValue()等,从而返回包装对象的值。
例一:
Interger i = Interger.parseInt(“23”,8)
int i =(Double.valueOf("23.4")).intValue();
第一句话是错的,第二句话是对的。
例二:
Number n = new Interger(0);
Double d = (Double)n;
这两行代码可以编译,但会导致运行错误,因为在运行时,JVM会尝试把n 转换成Double object, 但是n 是Integer实例。
例三:
Number x = 3; 正确
Double x = 3; 错误,3相当于newInteger(3)
Double x = 3.0; 正确
Int x = new Integer(3); 正确
最后
以上就是柔弱毛衣为你收集整理的抽象类和接口的全部内容,希望文章能够帮你解决抽象类和接口所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复