JAVA平台的抽象类与嵌套类

    JAVA平台的抽象类用来提供更高级的类型抽象,嵌套类提供更紧密的封装特性.

 

1.抽象类:

    如果一个类被声明为abstract,那么称这是一个"抽象类".

    1-1.抽象类的语法:

abstract class 类名称{
    类体
}

    如果一个类有抽象方法,那么这个类也必须被声明为abstract.如下:

public abstract class GraphicObject{
    //声明字段
   //声明非抽象的方法
    abstract void draw();
}

 

    1-2.抽象类的特性如下:

    1).抽象类不能被实例化,不能使用new运算符创建抽象类的实例对象,但是抽象类可以派生子类;

    2).抽象类派生的子类通常提供对其父类中所有抽象方法的实现.如果子类没有实现其父类的所有抽象方法,那么这个子类也必须被声明为abstract.

 

2.抽象方法

    如果一个方法被声明但是没有被实现(即没有花括号、没有方法体、声明后直接就是分号),那么该方法被称为"抽象方法".其实和C中的函数声明无异.语法如下:

abstract <方法返回值类型> 方法名称(参数列表)

如:

abstract void moveTo(double deltaX,double deltaY)

 

3.抽象类实例:

    抽象类其实是一种"高度共性"的提取的一种手段.比如下面一种场景:

    假设在一个使用JAVA绘图程序中,可以绘制圆、矩形、直线、及其他图形.这些对象有很多共同点:有一定的状态(位置、方位、线条颜色等)和行为(如移动、旋转、缩放等).有的状态和行为对所有的绘图对象来说是相同的.其他要求因为具体不同的图形而需要个性地实现.为了减少不必要的代码重复性,这时候需要一种高度提取共性的手段.如:

abstract class GraphiObject{
    int x,y;
    ...
    void moveTo(int newX,int newY){
        ...
    }
    abstract void draw();
    abstract void resize();
}

如上述在抽象类已经实现了其子类有可能用到的同性的行为:moveTo().有两个抽象方法draw()和resize()是因各个不同的子类而有不同的具体行为.因此需要具体实现.如下:

Circle子类:

class Circle extends GraphicObject{
    void draw(){
        ...
    }
    void resize(){
        ...
    }
}

Rectangle子类:

class Rectangle extends GraphicObject{
    void draw(){
        ...
    }
    void resize(){
        ...
    }
}


4.抽象类实现接口

    如果一个类实现了一个接口,那么它必须实现接口中所有的方法.如果这个类是抽象类的时候,就不必实现全部接口方法,可以交付给这个抽象类的子类来实现没有实现的接口的方法.

abstract class X implements Y{
    //实现接口Y中的部分方法
}
class XX extends X{
    //实现接口Y中在抽象类X还没有实现的剩下的方法
}


5.抽象类的类成员

    一个抽象类可以有静态字段和静态方法(static).对静态字段和静态方法的引用和正常类无异.如下:

abstract class AbstractClass{
    static void say(){
        System.out.println("hello");
    }
}

public class Test{
    public static void main(String[] args){
    AbstractClass.say();
    }
}


6.嵌套类

    6-1.嵌套类的基本知识:

    允许在一个类如ClassA中定义另一个类如ClassB,这时ClassB称为"嵌套类",而包含ClassB的类ClassA称为"外部类".如:

class OuterClass{
    ...
    class NestedClass{
        ...
    }
    ...
}

    嵌套类又分为"静态嵌套类"和"非静态嵌套类(即内部类)".

如下:

class OuterClass{
        ...
    //静态嵌套类
    static class StaticNestedClass{
        ...
    }
    //内部类
    class InnerClass{
        ...
    }
}

    [注:]

    内部类可以访问其外部类的其他成员,即使是private成员.静态嵌套类不能访问其外部类的其他成员.

 

    6-2.静态嵌套类

    一个静态类不能直接引用其外部类的实例变量或实例方法,只能通过一个对象引用它们.如:

OuterClass.StaticNestdClass

    创建一个嵌套类对象如下:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();


    6-3.内部类

    一个内部类与包围它的外部类的实例相关联.其特性有:

    1).内部类中不能定义任何静态成员;

    2).要实例化一个内部类,必须先实例化其外部类(皮之不存,毛之焉附?).然后再创建内部对象.如下:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

    3).实例:

public class DataStructure {
    //创建一个数组
    private final static int SIZE = 15;							//声明常量,表示数组大小
    private int[] arrayOfInts = new int[SIZE];					//创建一个int类型的数组
    
    public DataStructure() {
        //使用升序排列的整数值填充数组
        for (int i = 0; i < SIZE; i++) {
            arrayOfInts[i] = i;
        }
    }
    
    public void printEven() {
        //输出数组偶数索引的值
        InnerEvenIterator iterator = this.new InnerEvenIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.getNext() + " ");
        }
    }
    
	//实现Iterator模式的内部类
    private class InnerEvenIterator {
        //从头开始遍历数组
        private int next = 0;
        
        public boolean hasNext() {
            //检查当前元素是否是数组中的最后一个元素
            return (next <= SIZE - 1);
        }
        
        public int getNext() {
            //记录数组的一个偶数索引的值
            int retValue = arrayOfInts[next];
            //获得下一个偶数元素
            next += 2;
            return retValue;
        }
    }
    
    public static void main(String s[]) {
        //使用整数值填充数组并只输出偶数索引处的值
        DataStructure ds = new DataStructure();
        ds.printEven();
    }
}

输出结果:

0 2 4 6 8 10 12 14

简析:

    内部类InnerEvenIterator类直接引用了外部类DataStructure对象的arrayOfInts的实例变量.相当于外部类的一个辅助内部类.

 

6-4.局部内部类和匿名内部类:

    在一个方法的方法体中声明的一个内部类,这样的内部类称为"局部内部类".还可以在一个方法的方法体声明一个没有命名的内部类,这样称为"匿名内部类".

 

6-5.内部类的修饰符:

    凡是可以用于外部类的其他成员的修饰符,都可以用于内部类.如private、public和protected.



   





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值