No2_5.类的高级特性_Java学习笔记_抽象类和成员内部类

一、抽象类
1.所谓抽象类,只声明方法的存在而不去实现它的类;
2.抽象类不能被实例化,即不能实现其对象;
3.abstract class 类名{ 类体 }
4.包含一个或多个抽象方法的类必须声明成抽象类;
5.abstract <方法返回值类型> 方法名(参数列表)

二、内部类
1.如果在一个类中再定义一个类,就将在类中定义的那个类称为内部类;
2.内部类分为成员内部类,局部内部类以及匿名内部类;
3.成员内部类:
  a.可以在内部类中直接存取其所在类的私有成员变量;
  b.外部类不可以直接访问内部类成员变量;
  c.public class OuterClass{
  private class InnerClass{
  }
  }
  d.内部类中可以随意使用外部类的成员方法及成员变量,尽管变量修饰为private。
  e.内部类的实例一定要绑定在外部类的实例上,如果在外部类初始人一个内部类对象,那么内部类对象就会绑定在外部类对象上。
  f.如果在外部类和非静态方法之外实例化内部类对象,需要使用“外部类.内部类”的形式指定该对象的类型;
  g.在实例化内部类对象时,不能在new操作符之前使用外部类名称那种形式实例化内部类对象,而是应该使用外部类的对象来创建内部对象;
  h.内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象;

4.使用this关键字获取内部类与外部类的引用
  a.如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字;
  b.例如在内部类中使用this.变量,可以调用内部类的成员变量x;类名.this.变量,指定类的一个引用。

 

  

  1 /*** 
  2  * @author: liu_y
  3  * @Date: 2016年7月24日
  4  * @Title:抽象类 、成员内部类、使用this关键字获取内部类与外部类的引用
  5  */
  6 /******************
  7  * 抽象类 
  8  */
  9 abstract class Fruit {
 10     public String color;
 11 
 12     // 定义构造方法
 13     public Fruit() {
 14         color = "green";
 15     }
 16 
 17     // 定义抽象方法
 18     public abstract void harvest();
 19 }
 20 // 继承抽象类Fruit
 21 class Apple extends Fruit {
 22     @Override
 23     public void harvest() {
 24         System.out.println("苹果已经收获!");
 25     }
 26 }
 27 // 继承抽象类Fruit
 28 class Orange extends Fruit {
 29     @Override
 30     public void harvest() {
 31         System.out.println("橘子已经收获!");
 32     }
 33 }
 34 /******************
 35  * 成员内部类学习
 36  */
 37 class OuterClass {
 38     private String season = "Summer";
 39 
 40     class InnerClass {
 41         InnerClass() { // 内部类构造方法
 42         }
 43         public void inf() { // 内部类成员方法
 44             System.out.println("这是内部类成员方法!");
 45         }
 46 
 47         public int y;
 48     }
 49 
 50     InnerClass in = new InnerClass(); // 外部类实例化内部类对象
 51 
 52     public void ouf() { // 在外部类中调用内部类方法
 53         in.inf();
 54         System.out.println("外部类中调用内部类方法!");
 55     }
 56 
 57     public InnerClass doit() {
 58         // y=5; //外部类不可以直接访问内部类成员变量
 59         in.y = 7;
 60         season = "Autumn"; // 内部类可以直接访问其所在类的私有成员变量
 61         System.out.println(season);
 62         return new InnerClass();
 63     }
 64 }
 65 
 66 /***
 67  * 使用this关键字获取内部类与外部类的引用
 68  */
 69 class China {
 70     private int age = 2016; // 外部类变量
 71     // 内部类
 72 
 73     class Beijing {
 74         private int age = 1988; // 内部类变量
 75 
 76         public void doit(int age) {
 77             age++;
 78             System.out.println("这是内部类方法中变量" + age);
 79             System.out.println("这是内部类变量" + this.age);
 80             System.out.println("这是外部类变量" + China.this.age);
 81         }
 82     }
 83 }
 84 
 85 public class Hello5Abstract {
 86 
 87     public static void main(String[] args) {
 88         // TODO Auto-generated method stub
 89         /**
 90          * 抽象类使用
 91          */
 92         System.out.println("抽象类:");
 93         System.out.println("调用 Apple类的harvest()方法的结果:");
 94         Apple apple = new Apple();
 95         apple.harvest();
 96         System.out.println("调用 Orange类的harvest()方法的结果:");
 97         Orange orange = new Orange();
 98         orange.harvest();
 99 
100         /****
101          * 内部类----成员内部类
102          */
103         System.out.println("\n内部类:");
104         // 实例化内部类
105         OuterClass out = new OuterClass();
106         out.ouf();
107                 
108         System.out.println("\n调用外部类方法时返回一个内部类实例:");
109         OuterClass.InnerClass in1 = out.doit(); // 直接new一个内部类实例
110         in1.inf();
111         
112         System.out.println("\n直接new一个内部类实例:");
113         // OuterClass.InnerClass in2=new OuterClass.InnerClass(); //额不可以这样用。。
114         // 应该使用外部类的对象来创建内部对象,内部类对象会依赖于外部类对象
115         OuterClass.InnerClass in2 = out.new InnerClass();
116         in2.inf();
117 
118         /***
119          * 使用this关键字获取内部类与外部类的引用
120          */
121         System.out.println("\n使用this关键字获取内部类与外部类的引用:");
122         China china = new China();
123         China.Beijing bj = china.new Beijing();
124         bj.doit(26);
125     }
126 
127 }

输出结果:

 1 抽象类:
 2 调用 Apple类的harvest()方法的结果:
 3 苹果已经收获!
 4 调用 Orange类的harvest()方法的结果:
 5 橘子已经收获!
 6 
 7 内部类:
 8 这是内部类成员方法!
 9 外部类中调用内部类方法!
10 
11 调用外部类方法时返回一个内部类实例:
12 Autumn
13 这是内部类成员方法!
14 
15 直接new一个内部类实例:
16 这是内部类成员方法!
17 
18 使用this关键字获取内部类与外部类的引用:
19 这是内部类方法中变量27
20 这是内部类变量1988
21 这是外部类变量2016

 

posted @ 2016-07-24 08:25  sunshine-habit  阅读(158)  评论(0编辑  收藏  举报