抽象类

将事物的共性抽出来到一个类中,这个类就叫做抽象类。

package org.westos_03_抽象类;
/**
 * 抽象类的概念:
 *          每一个动物的吃和睡的功能不一样,不应该把动物类定义为一个具体类,而是给出一个声明(abstract)
 *          当一个类中如果有抽象功能(抽象方法)的时候,那么这个类一定要定义为抽象类!
 * 
 *      问题:一个抽象类中可以有非抽象方法吗?
 *          一个抽象类中可以抽象,也可以有非抽象的(作为一个判断题记忆!)
 *      
 *      抽象类不能实例化:抽象类不能创建对象
 *      一个抽象类如何进行实例化:
 *              通过抽象类多态形式:父类的引用指向子类对象,通过子类进行初始化!
 *      抽象类的子类的特点:
 * 
 *              1)抽象类的子类是抽象类,那么没有意义!
 *              最终使用的就是通过子类进行对象初始化的,如果子类都被抽象修饰了,那么也不能创建对象,所以没意义
 *      
 *      抽象类多态:
 *              强制子类必须重写当前抽象的父类中所有的抽象方法
 *              还可以提高代码的维护性(里面继承关系保证!)
 *              
 *          
 * 
 * 
 * */
abstract class Animal{

    //抽象方法:没有方法体的一个方法
    public abstract void eat() ;

    public abstract void sleep() ;

    //具体方法
    /*public void eat(){
        System.out.println("eat");
    }*/

    public void show(){
        System.out.println("show Animal....");
    }
}

//抽象的子类
//abstract class Cat extends Animal{
//  
//}
//子类是具体类
class Cat extends Animal{

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void sleep() {
        System.out.println("猫趴着睡觉..");
    }

}

//测试类
public class AbstractDemo {
    public static void main(String[] args) {
        //当前Animal已经被abstract修饰了
//      Animal a = new Animal();//Cannot instantiate the type Animal:抽象类不能实例化:instaceof

        //多态:父类引用指向子类对象
        Animal a = new Cat() ; //Animal是抽象类,---->抽象类多态形式
        a.eat() ;
        a.sleep() ;
    }
}
package org.westos_03_抽象类;
/**
 * 抽象类的成员特点
 *          成员变量:
 *                  可以是变量也可以是自定义常量
 *          构造方法:
 *                  抽象类可以有构造方法:包括有参构造和无参构造
 *                  作用:通过抽象类多态的形式:让子类进行数据的初始化
 *          成员方法:
 *                  可以有抽象方法,也可以有非抽象方法
 *              
 * 抽象类的成员方法特性:
 *          抽象方法:强制子类必须要做到一件事情:方法重写(覆盖)
 *          非抽象方法:由继承保证可以去提高代码的复用性
 * */
abstract class Fu{

    private String name ;
    private int age ;
    //成员变量
    public int num = 100 ;
    public final int num2 = 200 ; //被final修饰:自定义常量

    //无参构造
    public Fu(){

    }

    //有参构造
    public Fu(String name,int age){
        this.name = name ;
        this.age = age ;
    }

    //抽象方法
    public abstract void show();

    //非抽象方法
    public void function(){
        System.out.println("function Fu...");
    }

}

//子类
class Zi extends Fu{

    @Override
    public void show(){
        System.out.println("show Zi....");
    }

}
//测试类
public class AbstractDemo2 {
    public static void main(String[] args) {
        //抽象类多态:
        //抽象类的类名 对象名= new 子类名() ;
        Fu f = new Zi() ;
        f.show() ;
        f.function() ;
    }
}
package org.westos_03_抽象类;
/**
 * 问题:
 *      一个类中如果没有抽象方法,那么这个类可不可以定义为一个抽象类呢?
 *      可以!为什么
 *      不能让其创建对象!
 * 
 * abstract不能和哪些关键字共同使用?
 *  private 和abstract不能共同使用
 *  final和abstract不能共同使用
 *  static和abstract不能共同使用
 * 
 *  实际开发中:public 公共访问权限
 * */
abstract class Fu2{
    //无参构造
//  private Fu2(){
//      
//  }

//  抽象方法
    public abstract void show() ;

    //非法修饰
//  private abstract void function() ;

    //非法修饰:编译不通过
//  public final abstract void function() ;

    //非法修饰
//  public static abstract void function() ;

}

class Zi2 extends Fu2{
    public void show(){
        System.out.println("show Zi2....");
    }
}
//测试类
public class AbstractDemo3 {
        public static void main(String[] args) {
            //抽象类多态...创建对象
        }
}
posted @ 2017-10-25 22:25  快乐的内啡肽呀  阅读(43)  评论(0)    收藏  举报