抽象类概述 比如,我们要描述“动物”,它具有年龄、体积,会叫,能跑。但是又缺乏足够的特性(相较于阿猫,阿狗,它们都是动物,却有自己的特性),我们没有唯一的一种能够代表动物的东西(当然,这是相对于猫、狗来说的,在生物学上,动物还是有办法来定义的),这时我们可以用抽象类来描述它。当我们用某个类来具体描述“猫”时,这个类就可以继承“动物”这个抽象类,然后加以具体描述。抽象类的子类在类中必须实现抽象类中的抽象方法,比如说动物类中的跑和叫,在子类中(猫类,狗类)必须实现其是如何跑,怎么叫。抽象方法没有方法体,且用abstract修饰。
下面我们来系统的介绍一下抽象类: 特点a. 抽象方法和抽象类用关键字abstract表示。
b. 抽象类不能被实例化
c. 有抽象方法的类一定是抽象类(或者接口);抽象类中不一定有抽象方法。
d. 如果一个类继承抽象类,那么这个类要么本身也是抽象类,要么这个类重写父类的所有抽象方法。 用途强制要求子类必须完成某些功能。 成员特点A. 成员变量 -- 可以有成员变量,也可以有常量
B. 构造方法 -- 有构造方法,用于子类访问父类之前,对父类数据进行初始化。
C. 成员方法 -- 可以有抽象方法,也可以有关非抽象方法。
i. 抽象方法是为了要求子类做某些事情。
ii. 非抽象方法时为了提高代码复用性,被子类继承。
注意:
不能与final、private、static 共存。 抽象类(abstract class)的定义方式如下: [java] view plain copy
print?
public abstract class AbstractClass //里面至少有一个抽象方法
{
public int a; //普通数据成员
public abstract void method1(); //抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法
public abstract void method2();
public void method3(); //非抽象方法
publicvoid method3(){
…… //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现
}
}
public abstract class AbstractClass //里面至少有一个抽象方法{ public int a; //普通数据成员 public abstract void method1(); //抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法 public abstract void method2(); public void method3(); //非抽象方法 publicvoid method3(){ …… //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现 } }
接口定义 是一种特殊的抽象类。比抽象类更抽象,因为它里面的方法都是抽象的。 格式 Class 类名 implements 接口名
{
} 特点A. 接口不能实例化。
B. 接口中的方法:
a) 要么被子类重写
b) 要么子类也是抽象类。 成员特点 成员变量 -- 接口中只有常量。
因为接口的成员变量有默认修饰符。推荐:永远自己给出修饰符,public static final
构造方法 -- 接口中没有构造方法。
任何类如果没有继承父类,那么这个类就继承Object类
成员方法 -- 接口中的方法都是抽象的。
因为接口中的 成员方法有默认修饰符。推荐:永远自己给出修饰符,public abstract 思想特点:1. 对外暴露的规则。
2. 程序的功能扩展
3. 降低耦合性
4. 用来多实现。
接口(interface)的定义方式如下:
[java] view plain copy
print?
interface Interface
{
public static final int i; //接口中不能有普通数据成员,只能够有静态的不能被修改的数据成员,static表示全局,final表示不可修改,可以不用static final 修饰,会隐式的声明为static和final,但是建议永远自己给出修饰符public static final
public abstract void method1(); //接口中的方法一定是抽象方法,所以可以不用abstract修饰,但是建议永远自己给出修饰符public abstract
public void method2(); //接口中不能赋予方法的默认行为,即不能有方法的具体实现。(注意,此处及省略了abstract.)
}
class zi implements Interface
{
publicvoid method1()
{
…… //把接口中的抽象方法重写
}
public void method2()
{
…… //注意,是把抽象方法全部重写(接口里的方法全部是抽象方法)
}
}
//另一种情况,子类也是抽象类,此时可以不重写接口中的方法
/*
abstract class zi implements Interface
{
public abstract void method1(); //没有重写
public void method2() //重写了method2()
{
System.out.println("重写了method2()");
}
}
*/
interface Interface{ public static final int i; //接口中不能有普通数据成员,只能够有静态的不能被修改的数据成员,static表示全局,final表示不可修改,可以不用static final 修饰,会隐式的声明为static和final,但是建议永远自己给出修饰符public static final public abstract void method1(); //接口中的方法一定是抽象方法,所以可以不用abstract修饰,但是建议永远自己给出修饰符public abstract public void method2(); //接口中不能赋予方法的默认行为,即不能有方法的具体实现。(注意,此处及省略了abstract.)}class zi implements Interface{ publicvoid method1() { …… //把接口中的抽象方法重写 } public void method2() { …… //注意,是把抽象方法全部重写(接口里的方法全部是抽象方法) }} //另一种情况,子类也是抽象类,此时可以不重写接口中的方法/*abstract class zi implements Interface{ public abstract void method1(); //没有重写 public void method2() //重写了method2() { System.out.println("重写了method2()"); }}*/