Java 抽象类 
 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
百度给出的解释是:从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。
这句话概括了抽象的概念,而在Java中,你可以只给出方法的定义不去实现方法的具体事物,由子类去根据具体需求来具体实现。
这种只给出方法定义而不具体实现的方法被称为抽象方法,抽象方法是没有方法体的,在代码的表达上就是没有“{}”。
包含一个或多个抽象方法的类也必须被声明为抽象类。
使用abstract修饰符来表示抽象方法以及抽象类。
//有抽象方法的类也必须被声明为abstract
public abstract class Test1 {
//抽象方法,不能有“{}”
public abstract void f();
}
抽象类除了包含抽象方法外,还可以包含具体的变量和具体的方法。类即使不包含抽象方法,也可以被声明为抽象类,防止被实例化。
抽象类不能被实例化,也就是不能使用new关键字来得到一个抽象类的实例,抽象方法必须在子类中被实现。
//有抽象方法的类也必须被声明为abstract
public class Test1 {
public static void main(String[] args) {
Teacher teacher=new Teacher("教师");
teacher.work();
Driver driver=new Driver("驾驶员");
driver.work();
}
}
//一个抽象类
abstract class People{
//抽象方法
public abstract void work();
}
class Teacher extends People{
private String work;
public Teacher(String work) {br/>this.work=work;
}
@Override
public void work() {
System.out.println("我的职业是"+this.work);
}
}
class Driver extends People{
private String work;
public Driver(String work) {
br/>this.work=work;
}
@Override
public void work() {
System.out.println("我的职业是"+this.work);
}
}
运行结果:
我的职业是教师
我的职业是驾驶员
几点说明:
抽象类不能直接使用,需要子类去实现抽象类,然后使用其子类的实例。然而可以创建一个变量,其类型也是一个抽象类,并让他指向具体子类的一个实例,也就是可以使用抽象类来充当形参,实际实现类为实参,也就是多态的应用。
People people=new Teacher("教师");
people.work();
不能有抽象构造方法或抽象静态方法。
如果非要使用new关键在来创建一个抽象类的实例的话,可以这样:
People people=new People() {
br/>@Override
public void work() {
    //实现这个方法的具体功能
}
};
个人不推荐这种方法,代码读起来有点累。
在下列情况下,一个类将成为抽象类:
当一个类的一个或多个方法是抽象方法时。
当类是一个抽象类的子类,并且不能实现父类的所有抽象方法时。
当一个类实现一个接口,并且不能实现接口的所有抽象方法时。
注意:
上面说的是这些情况下一个类将称为抽象类,没有说抽象类就一定会是这些情况。
抽象类可以不包含抽象方法,包含抽象方法的类就一定是抽象类。
事实上,抽象类可以是一个完全正常实现的类。
1、Java抽象类存在的意义,为什么要使用抽象类?
利于代码的维护和复用。把相同的方法或者属性抽象出来放在一个抽象类中,让类去继承,则实现了复用。
2、什么是抽象类?
加上abstract关键字的类即为抽象类。
3、抽象类可以实例化吗?也就是说可以new吗?
抽象类是不可以进行new的。所以想要使用抽象类,必须要用类来继承它,然后可以用子类对象进行实例化。(抽象类自身不能创建对象,但是它的子类可以创建对象。)
4、抽象类中可以有什么?需要注意什么?
抽象类中可以定义属性和方法,
5、抽象类中可以不定义抽象方法吗?不定义会怎么样?
(1)抽象类中可以定义普通方法,定义普通方法要有方法体,子类中可以重写也可以不重写。如果不重写,调用的则是父类的方法。
(2)抽象类中也可以定义抽象方法,定义抽象方法不能有方法体(因为是抽象出来的方法,所以不能有方法体,方法体是子类去重写即体现出多态),且子类中必须实现。
注:抽象方法只能存在抽象类中
6、当实现一个接口不想重写所有的方法应该怎么做?
抽象类来实现接口,则不必重写接口的方法。可以全部不重写或只重写一部分方法。然后由抽象类的子类来重写。
抽象方法
如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
抽象方法没有定义,XM返佣www.kaifx.cn/broker/xm.html方法名后面直接跟一个分号,而不是花括号。
声明抽象方法会造成以下两个结果:
如果一个类包含抽象方法,那么该类必须是抽象类。
任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
public abstract class Animal {
//父类没有实现,子类必须实现,抽象类中可以有非抽象方法
abstract public void shout();
public void run() {
}
}
class Dog extends Animal {
br/>@Override
public void run() {
super.run();
System.out.println("");
}
}