一.抽象类
1>.了解抽象类
1.抽象类不能创建对象。抽象类可以包含抽象方法,这些方法将在具体的子类中实现。
2.在继承的层次结构中,每个新的子类都使类更加明确和具体。如果从一个子类向父类追溯,类就会变得更不通用并且不明确。类的设计应该确保父类包含其子类的共同特征。有的时候呢,父类会设计的十分抽象,以至于不能用于创建任何具体的实例;这样的类就称为抽象类。
2>. abstract(在类的头部使用abstract修饰符表示该类是抽象类
public abstract class GeometricObject{ //父类,abstract表示该类为抽象类
private String color = "write"; //私有数据域color 和 filled 不能被除了父类本身之外的其他任何类访问
private boolean filled; //读取和改变color与filled的唯一方法就是通过它们的获取方法和设置方法
private java.util.Date dateCreated; //对象创建的日期
public GeometricObject(){ //创建一个GeometricObject
dateCreated = new java.util.Date();
}
public GeometricObject(String color,boolean filled){ //创建一个带特殊颜色和填充物的GeometricObject
dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}
public String getColor(){
return color; //返回颜色
}
public void setColor(String color){
this.color = color; //设置新的颜色
}
public boolean isFilled(){
return filled; //返回filled的属性(false or true)
}
public void setFilled(boolean filled){
this.filled = filled; //设置filled新的属性
}
public java.util.Date getDateCreated(){
return dateCreated; //返回dateCreated
}
public String toString(){ //返回这个对象的字符串表述
return "created on " + dateCreated + "\ncolor: " + color + "and filled: " + filled;
}
}
public abstract double getArea(); //抽象方法
public abstract double getPerimeter();
可以对比上一篇博客中的代码看更容易观察抽象类的特点*~*
1.抽象类和常规类十分相似,但是不能使用new操作符创建它的实例;抽象方法的定义没有给出实现,其实现由子类实现哦;
一个包含抽象方法的类必须声明为抽象类。
2.抽象类的构造方法定义为protected,因为它只被子类使用;
创建一个具体子类的实例时,其父类的构造方法被调用以初始化父类中定义的数据域。
3>抽象类的注意点
1.抽象方法不能包含在非抽象类中。
如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的;
也就是,在继承自抽象类的非抽象子类中,必须实现所有的抽象方法。(抽象方法是非静态的)
2.抽象类不能使用new操作符来初始化。
但是可以定义它的构造方法,这个构造方法在其子类的构造方法中调用。
3.包含抽象方法的类必须是抽象的。
但是呢,可以定义一个不包含抽象方法的抽象类,这个抽象用来定义新子类的基类。
4.子类可以重写父类的方法并且把它定义为抽象的;
这个呢见的比较少,但是当父类的方法实现在子类中变得无效时十分有用(子类必须定义为抽象的)
5.子类可以是抽象的,即使父类是具体类;
eg:Object类是具体类,但是它的子类GeometricObject可以是抽象的。
6.不能使用new操作符从一个抽象类创建一个实例;
但是抽象类可以作为一种数据类型。
eg:
①创建元素为GeometricObject类型的数组
GeometricObject[ ] objects =new GeometricObject[10];
②创建一个GeometricObject的实例,并且将它的引用赋值给数组元素
object [0] = new Circle();
二.接口(interface)
1>了解接口
1.接口是一种与类相似的构造,用于为对象定义共同的操作。
2.接口的目的是指明相关或者不相关类的对象的共同行为;
eg:使用适当的接口可以指明这些对象是可比较的或者可克隆的等等。
2>定义接口的语法
modifier interface InterfaceName{
}
eg:
public interface Edible{
//code
public abstract String howToEat( );
}
3>接口继承
类和接口之间的关系称为接口继承。
public class TestEdible {
public static void main(String[] args){
Object[] objects = {new Tiger(),new Chicken(),new Apple()};
for(int i =0;i<objects.length;i++){
if(objects[i] instanceof Edible)
System.out.println(((Edible)objects[i]).howToEat());
if(objects[i] instanceof Animal){
System.out.println(((Animal)objects[i]).sound());
}
}
}
}
interface Edible{ //Edible接口定义了可食用对象的共同行为
public abstract String howToEat();
}
abstract class Animal {
private double weight;
private double getWeight(){
return weight;
}
public void setWeight(double weight){
this.weight = weight;
}
public abstract String sound();//定义一个sound方法,sound方法是一个抽象方法;被具体的animal类实现
}
//chicken类实现了Edible接口,表明小鸡是可以食用的
class Chicken extends Animal implements Edible{
@Override
public String howToEat(){ //当一个类实现接口的时候,该类实现了定义在接口中的所有方法
return "Chicken: cock-a-doodle-doo";
}
@Override
public String sound(){
return "Chicken: cock-a-doodle-doo";
}
}
class Tiger extends Animal{
@Override
public String sound(){
return "Tiger: RROOAARR";
}
}
//fruit类实现了Edible
abstract class Fruit implements Edible{//因为fruit类没有实现howtoeat方法,所以fruit必须被定义为abstract
//fruit的子类必须实现howtoeat方法
}
class Apple extends Fruit{
@Override
public String howToEat(){
return "Apple: Make apple cider";
}
}
class Orange extends Fruit {
@Override
public String howToEat(){
return "Orange: Make orange juice";
}
}
4>Comparable接口
1.Comparable接口中定义了compareTo方法,用于比较对象。
2.接口定义:
public interface Comparable<E> {
public int compareTo(E o);
}