JAVA平台的抽象类与嵌套类
2013-07-11 19:15
120 查看
JAVA平台的抽象类用来提供更高级的类型抽象,嵌套类提供更紧密的封装特性.
1.抽象类:
如果一个类被声明为abstract,那么称这是一个"抽象类".
1-1.抽象类的语法:
如果一个类有抽象方法,那么这个类也必须被声明为abstract.如下:
1-2.抽象类的特性如下:
1).抽象类不能被实例化,不能使用new运算符创建抽象类的实例对象,但是抽象类可以派生子类;
2).抽象类派生的子类通常提供对其父类中所有抽象方法的实现.如果子类没有实现其父类的所有抽象方法,那么这个子类也必须被声明为abstract.
2.抽象方法
如果一个方法被声明但是没有被实现(即没有花括号、没有方法体、声明后直接就是分号),那么该方法被称为"抽象方法".其实和C中的函数声明无异.语法如下:
如:
3.抽象类实例:
抽象类其实是一种"高度共性"的提取的一种手段.比如下面一种场景:
假设在一个使用JAVA绘图程序中,可以绘制圆、矩形、直线、及其他图形.这些对象有很多共同点:有一定的状态(位置、方位、线条颜色等)和行为(如移动、旋转、缩放等).有的状态和行为对所有的绘图对象来说是相同的.其他要求因为具体不同的图形而需要个性地实现.为了减少不必要的代码重复性,这时候需要一种高度提取共性的手段.如:
如上述在抽象类已经实现了其子类有可能用到的同性的行为:moveTo().有两个抽象方法draw()和resize()是因各个不同的子类而有不同的具体行为.因此需要具体实现.如下:
Circle子类:
Rectangle子类:
4.抽象类实现接口
如果一个类实现了一个接口,那么它必须实现接口中所有的方法.如果这个类是抽象类的时候,就不必实现全部接口方法,可以交付给这个抽象类的子类来实现没有实现的接口的方法.
5.抽象类的类成员
一个抽象类可以有静态字段和静态方法(static).对静态字段和静态方法的引用和正常类无异.如下:
6.嵌套类
6-1.嵌套类的基本知识:
允许在一个类如ClassA中定义另一个类如ClassB,这时ClassB称为"嵌套类",而包含ClassB的类ClassA称为"外部类".如:
嵌套类又分为"静态嵌套类"和"非静态嵌套类(即内部类)".
如下:
[注:]
内部类可以访问其外部类的其他成员,即使是private成员.静态嵌套类不能访问其外部类的其他成员.
6-2.静态嵌套类
一个静态类不能直接引用其外部类的实例变量或实例方法,只能通过一个对象引用它们.如:
创建一个嵌套类对象如下:
6-3.内部类
一个内部类与包围它的外部类的实例相关联.其特性有:
1).内部类中不能定义任何静态成员;
2).要实例化一个内部类,必须先实例化其外部类(皮之不存,毛之焉附?).然后再创建内部对象.如下:
3).实例:
输出结果:
简析:
内部类InnerEvenIterator类直接引用了外部类DataStructure对象的arrayOfInts的实例变量.相当于外部类的一个辅助内部类.
6-4.局部内部类和匿名内部类:
在一个方法的方法体中声明的一个内部类,这样的内部类称为"局部内部类".还可以在一个方法的方法体声明一个没有命名的内部类,这样称为"匿名内部类".
6-5.内部类的修饰符:
凡是可以用于外部类的其他成员的修饰符,都可以用于内部类.如private、public和protected.
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.
相关文章推荐
- JAVA中的类-普通类,嵌套类,抽象类,接口
- 关于.NET VS JavaEE平台争论的沉思录
- 云平台下Java程序打包成.jar文件
- java环境变量配置——windows 平台上
- Java 接口和抽象类的异同点
- JAVA 学习第四天(1)抽象类
- Java进阶(四)理解抽象类与接口
- java面向对象_抽象类和接口
- Java平台
- 详细解析Java中抽象类和接口的区别
- java + ffmped + mencoder搭建视频处理平台
- java 接口与抽象类的区别
- Java的接口和抽象类
- Java平台中的四个核心思想
- JAVA 平台及Java EE、Java SE、Java ME之区别
- java 分页基本查询抽象类与大家分享一下
- 详解java中的抽象类和接口的区别
- <Java/Hbase + C>多层框架(大数据)云平台的架构设计_答问集 推荐
- 详细解析Java中抽象类和接口的区别
- 方正快速开发平台ES2007.net和java版本之间切换附件分离问题解决