总所周知,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
最后,希望大家能继续关注我。来一句诗词:百川东到海,何时复西归?