java学习笔记(六)-- (抽象类与接口上)(抽象类&模板设计模式)

抽象类的定义和使用

  • 抽象类的定义:抽象类只是比普通方法多了一些抽象方法而已。
  • 抽象方法:只声明而未实现的方法(没有方法体),抽象方法所在的类也一定要使用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):一个软件实体如类。模块或函数应该对扩展开放,对修改关闭。

 

猜你喜欢

转载自blog.csdn.net/ds19980228/article/details/83244177