验证中...
开源中国 2018 年度最后一场技术盛会邀你来约~错过就要等明年啦!点此立即预约
Snippet 1 Snippet 2
抽象方法是指没有方法体的方法,使用abstract关键词做修饰,拥有抽象方法的类就是抽象类,也是使用abstract关键词做修饰,另外,抽象类除了包含抽象方法外,还可以包含具体的变量和具体的方法。类即使不包含抽象方法,也可以被声明为抽象类,防止被实例化。
Raw Copy
/* 抽象使用原则:
* 1.抽象方法必须为public或者protected(因为如果是private,则子类无法继承,该方法无法被实现),缺省情况下默认为public;
* 2.抽象方法不能直接实例化(即不能对直接通过new进行实例化),需要依靠子类采用向上转型的方式处理;
* 3.抽象类必须有子类,采用extends继承,一个子类只能继承一个抽象类;
* 4.子类(如果不是抽象类)需要覆盖抽象类中全部的抽象方法,倘若子类没有全部实现,则需要将子类也定义为抽象类;
* 5.抽象类的构造方法,子类实现时,会先执行父类构造方法,而后执行子类构造方法,
* 换句话说,抽象类具有构造函数,这些构造函数总是当具体子类被实例化时才调用;
* 6.抽象类不能声明final(抽象类必须有子类继承,而final定义的类不能有子类),
* 7.构造函数和静态函数以及final修饰的函数不能使用abstract修饰符
* 8.外部抽象类不允许使用static声明,内部抽象类可以使用static声明(继承时使用“外部类名.内部类名”形式表示类名);
* 9.抽象类中可以调用static方法
* 10.抽象类也可以继承实体类,也可以实现接口,没有什么特别的限制*/
public class Test {
public void print(A.B param) {
param.print();
}
public static void main(String[] args) {
// 使用匿名内部类实现(匿名内部类必须继承一个类或者实现一个接口)
new Test().print(new A.B() {
{ // 匿名内部类可以使用代码块代替构造函数
System.out.println("3333");
}
@Override
public void print() {
System.out.println("aaaaaaaaaaaa");
}
});
// 使用子类继承实现
A.B param = new C(); // 向上转型
param.print();
/* 抽象类中可以调用static方法 */
A.printStatic();
A.B.printStatic();
}
}
/* 外部抽象类不允许使用static声明 */
abstract class A{
/* 内部抽象类可以使用static声明 */
static abstract class B {
/* 会先执行父类构造方法 */
public B() {
System.out.println("1111");
}
public abstract void print();
/* 抽象类中可以调用static方法 */
public static void printStatic() {
System.out.println("ddddddddddddd");
}
}
/* 抽象类中可以调用static方法 */
public static void printStatic() {
System.out.println("ccccccccccccc");
}
}
/* 继承时使用“外部类名.内部类名”形式表示类名 */
class C extends A.B {
/* 而后执行子类构造方法 */
public C() {
System.out.println("2222");
}
@Override
public void print() {
System.out.println("bbbbbbbbbbbb");
}
}
/* 抽象类也可以继承实体类,也可以实现接口 */
abstract class D extends C {
public abstract void print();
}
有时候由于抽象类中只需要一个特定的系统子类操作,所以可以忽略掉外部子类,这样的设计在系统类库中会比较常见,目的是对用户隐藏不需要知道的子类
Raw Copy
public class Test {
public static void main(String[] args) {
// 此时取得抽象类对象的时候完全不需要知道B类这个子类的存在
A a = A.getInstance();
a.print();
}
}
abstract class A{
public abstract void print();
private static class B extends A {// 内部抽象类子类(静态内部类)
public void print() {// 覆写抽象类的方法
System.out.println("111111111111");
}
}
// static 这个方法不受实例化对象控制
public static A getInstance() {
return new B();
}
}
class C extends A{ // 继承类也不受任何印象
@Override
public void print() {
System.out.println("22222222");
}
}

Comment list( 2 )

1472330_seale6
Seale 2018-03-14 17:23

学习了!!!!!!!!!!!!!!!!!!!!

You need to Sign in for post a comment

Help Search