因为抽象类这个家伙怎么说呢,比较抽象,一般在学习的时候有点无从下手的感觉?
什么是抽象类?有什么用处?一般都用在什么地方?有什么地方不能使用抽象类?能否在抽象类中不定义抽象方法?
一下是个人小小总结,希望对个位有所帮助。
抽象类的特征:
使用 abstract来修饰一个类,那么这个类就是抽象类了。
class abstract A {
}
什么叫再加工,其实就是需要子类来继承!子类把父类中没有完成的方法完成,就是再加工了。这样子类就可以使用了。
半成品不能使用:就是抽象类不能实例化对象!
7 半成品类需要再加工
抽象类需要再加工,哪里是需要再加工的地方呢?就是抽象方法。
8 抽象方法的特征
抽象方法需要使用abstract关键字修饰
抽象方法没有方法体
抽象方法在参数列表后面没有大括号,但有一个分号!
具有一个或多个抽象方法的类必须声明为抽象类!
抽象类的子类,有两条路可以走:
把父类所有抽象方法都实现完成,这样子类就不用再抽象了;
不实现,或者不实现所有抽象方法,那么对子类来说也有未完成的方法,那么子类也需要声明为抽象类。
抽象方法不能是静态的,也不能是private的,更不能是final的。与多态冲突的东西都不行!
9 抽象类是否可以有构造器
抽象类是否可以有构造器:
思考:构造器是用来干什么的?与new使用创建实例对象!
思考:抽象类不能创建实例对象,那么它有构造器有没有用?
答案是有用!什么用:子类是不是需要调用父类构造器?需要,那么也就是说抽象类可以有构造器,而构造器是给子类构造器来用的!
abstract class A {
public A(String s) {}
public abstract void fun();
}
abstract class B extends A {
public B() {
super("hello");
}
public void fun() {
System.out.println("hello");
}
}
10 抽象类是否可以不定义抽象方法
抽象类可以不定义抽象方法,但很少有人这么做。
一个类如果有一到多个抽象方法,那么这个类必须声明为抽象类。
11 abstract关键字与什么关键字冲突
private、static、final
如果你的方法中,存在以上任意一个修饰符,那么这个方法就不能是抽象方法。
12 在什么时候使用抽象类
当你想调用一个方法,而这个方法的参数类型为抽象类类型!
public class Test {
public static void main(String[] args) {
A a = new B();
abc(a);
}
// 该方法的参数类型为A类型
// A类型是抽象类
// 我们无法实例化A类型的对象
// 说明我们需要写一个A类的子类,然后实例化子类的对象,
// 最后使用子类对象来调用abc方法。
public static void abc(A a) {
}
}
abstract class A {
public abstract void fun();
}
class B extends A {
public void fun() {
}
}
当我们想使用abc()方法时,因为abc()方法的参数是A类的,而且A类是抽象类,那么我们就需要创建一个A类的子类类型对象,然后用这个对象来调用abc()方法。
1 创建A类的子类
2 创建子类对象
3 用这个对象来调用abc()方法
在后面学习中,这种情况最为常见!!!即被动使用!
要写一个产品!
可能用户对这个产品不是很满意。当然只是部分不满意!那么我们可能会写一个抽象类,其中部分给用户自己来加工!然后再写一些成品!如果用户对成品满意那就直接使用成品,如果不满意,可以通过我们的抽象类来写自己的成品。
public class Test {
public static void main(String[] args) {
/*
自己来写三个Waiter的子类,用每个子类的对象来调用fun()方法
*/
}
public static void fun(A a) {
a.service();
}
}
abstract class Waiter {
public abstract void fun1();
public abstract void fun2();
public void service() {
fun1();
serv();
fun2();
}
public void serv() {
System.out.println("服务...");
}
}
抽象类
可以有实例属性、静态属性
可以有构造器
可以有实例方法、抽象方法、静态方法
就是什么都可以有,就是不能有实例对象(不能创建对象)!
抽象类一般都会有抽象方法,即没有加工的地方!
|