Android-Java第一课 内部类 (inner Class)

  总所周知,Android系统基于Linux,内核和驱动都是使用C/C++语言做开发,但应用层一般使用 JAVA 语言开发。今天我们就来学习一下java的内部类。

  内部类

    • 是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。
    • 对于一个名为outer的外部类和其内部定义的名为inner的内部类,编译完成后出现outer.class和outer$inner.class两类。
    • 内部类的成员变量/方法名可以和外部类的相同

  java分三大内部类

    • 成员内部类 
    • 方法内部类
    • 匿名内部类

   成员内部类

    顾名思义,成员内部类,是内部类作为外部类的成员属性,可直接使用外部类的所有成员和方法。就如父子,子可以使用父的所有东西,即使是私有(private)的。

    

 1 public class A {
 2     
 3     class B{
 4         public void A(){
 5             System.out.println("我们今晚跟小红红有约,小红红是个男生");
 6         }
 7     }    
 8     
 9     public  void show(){
10         B b = new B();
11         b.A();
12     }
13     
14     public static void main(String[] args) {
15         
16         new A().show();
17     }
18 
19 }

 

   方法内部类

    • 内部类定义在外部类的方法中,内部类只在该方法的内部可见,即只在内部类中使用。
    • 方法内部类使用时,在方法中创建内部类对象,用对象调用其内部类中的方法。           

  

1 public class oldDriver {
2     
3     public void old () {
4 
5         System.out.println ( " ---------老司机上车 " );
6     }
7 }
 1 public class Test {
 2     
 3     public void driver () {
 4         System.out.println ( "---------开车");
 5         
 6         class B extends oldDriver {
 7             
 8         }
 9         new B().old();
10         System.out.println( "---------司机开车" );
11     }
12     public static void main(String[] args) {
13         new Test().driver();
14     }
15 }

  看到这,有的同学就有疑问了:为什么不直接一个外部类 extends oldDriver?

  试想,当外部类继承或者实现一个接口,那么这个类整个类就是一个老司机(oldDriver),但我只是想在我需要的时候表明我是一个有20年驾照的司机。

这就是方法内部类。

 

  匿名内部类

    • 匿名内部类也就是没有名字的内部类
    • 只能使用一次,通常用来简化代码编写  
    • 必须继承一个父类或实现一个接口     

 

1 public interface Qinshou {
2     
3     public void workInNight();
4 }
1 public abstract class Doctor implements Qinshou{
2     //继承Qinshou接口 ---> 没有实现Qinshou里的抽象方法
3     //实现Qinshuo接口 ---> 实现了Qinshou里的抽象方法
4     public void workInDay() {
5         System.out.println("白天传授理论知识。");
6     }
7     
8 }
1 public class Doctor1 extends Doctor{
2   //继承Doctor
3     public void workInNight() {
4 
5         System.out.println("晚上就弹钢琴");
6     }
7 
8 }
1 public class Doctor2 extends Doctor{
2 
3     public void workInNight() {
4         
5         System.out.println("晚上我要看会电影");
6     }
7 
8 }
 1 public class Test {
 2     public static void main(String[] args) {
 3         Doctor1 d1 = new Doctor1();
 4         d1.workInDay();
 5         d1.workInNight();
 6         
 7         Doctor2 d2 = new Doctor2();
 8         d2.workInDay();
 9         d2.workInNight();
10         
11         /**
12          * 匿名内部类 语法三步走:
13          * 1.new 一个抽象类 或者 接口
14          * 2.加上一个花括号
15          * 3.给它添加为实现的方法        
16          */
17         
18         Doctor d3 = new Doctor() {
19 
20             public void workInNight() {
21                 System.out.println("我是doctor3 ,我晚上要睡觉");
22             }
23         };
24         d3.workInDay();
25         d3.workInNight();
26     }
27 }

  匿名内部类

    • 继承一个抽象类 abstract class
    • 实例实现一个接口 new / implements
    • 多线程继承Thread类
    • 多线程继承Runnable接口

 

 1 public class Demo {
 2 
 3     public static void main(String[] args) {
 4 
 5         Runnable r = new Runnable() {
 6             public void run() {
 7                 for (int i = 1; i <= 5; i++) {
 8                     System.out.print(i + " ");
 9                 }
10             }
11         };
12 
13         Thread t = new Thread(r);
14         t.start();
15     }
16 }

运行结果:1 2 3 4 5

 

 最后,希望大家能继续关注我。来一句诗词:百川东到海,何时复西归?

 

posted @ 2016-11-16 14:32  Nausicaä  阅读(577)  评论(0编辑  收藏  举报