抽象类的定义和使用
- 抽象类的定义:抽象类只是比普通方法多了一些抽象方法而已。
- 抽象方法:只声明而未实现的方法(没有方法体),抽象方法所在的类也一定要使用abstract来定义只声明而未实现的方法不一定为抽象方法,也可能为本地方法(调用c/c++库函数)
抽象类的使用原则
1.所有抽象类必须有子类(final(没有子类)与abstract不能同时出现,矛盾)
2.抽象类的子类必须覆写抽象类的所有抽象方法(private(不允许覆写)与abstract不能同时出现)
3.抽象类无法直接创建实例化对象,需要通过子类向上转型为实例化
举例:
abstract class Person{
private String name;
public String getName(){
return name;
}
public abstract void test();
}
class Student extends Person{
public void test(){
System.out.println("子类覆写抽象方法!");
}
}
public class Test{
public static void main(String[] args) {
Person per=new Student();
per.test();
}
}
抽象类相关规定
-
抽象类一定存在构造方法,子类也一定遵循对象实例化流程。先调用父类构造再调用子类构造
举例:
abstract class Person{
private String name;
//构造方法
public Person(){
System.out.println("**********");
}
public String getName(){
return this.name;
}
//普通方法
public void setName(String name){
this.name=name;
}
//抽象方法
public abstract void getPersonInfo();
}
class Student extends Person{
//构造方法
public Student(){
System.out.println("###########");
}
public void getPersonInfo(){
//空实现
}
}
public class Test{
public static void main(String[] args) {
new Student();
}
}
//打印结果如下
// **********
// ###########
如果父类没有无参构造,那么子类构造必须使用super明确指出使用父类哪个构造方法
范例: ****重要****
abstract class A{
//4.调用父类构造
public A(){
//5.调用被子类覆写的方法
this.print();
}
public abstract void print();
}
class B extends A{
private int num=100;
//2.调用子类实例化对象
public B(int num){
//3.隐含的super语句,实际要先调用父类构造
super();
//8.为类中属性初始化
this.num=num;
}
//6.此时子类对象的属性还没有被初始化
public void print(){
//7.对应其数据类型的默认值
System.out.println(this.num);
}
}
public class Test{
public static void main(String[] args) {
//1.实例化子类对象
new B(30);
new B(30).print();
}
}
//打印结果如下:
//0
// 0
// 30
如果构造方法,那么对象中的属性一定都是其对应数据类型的默认值
对象实例化过程:
进行类加载
进行类对象的空间开辟
进行类对象的属性初始化(构造方法)
- 抽象类可以没有任何抽象方法,但此时仍然不能创建实例化对象
- final与abstract不能同时出现;private与abstract也不能同时出现 具体原因:抽象类一定不能使用final声明,因为使用final声明的类不允许有子类;而抽象类必须有子类;相应的,抽象方 法也不能使用private定义,因为抽象方法必须要被覆写。
关于内部抽象类:子类只需要覆写外部抽象类的直接抽象方法。内部抽象类的抽象方法可不覆写。外部抽象类中不能使用static修饰,但是内部抽象类允许使用static
举例:
abstract class A{
public abstract void printA();
//内部类使用static修饰
static abstract class B{
public abstract void printB();
}
}
class X extends A{
public void printA(){}
}
**** 重点****
模板设计模式
设计模式:精髓解耦,引入第三方解耦(高内聚,低耦合)
开闭原则(OCP):一个软件实体如类。模块或函数应该对扩展开放,对修改关闭。