Android菜鸟成长记2-内部类
Java内部类
内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。
内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。
一、成员内部类
成员内部类也是最普通的内部类,它是外围类的一个成员,所以他是可以无限制的访问外围类的所有 成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。(简单的来说就是定义在一个类里面的另一个类)
在成员内部类中要注意两点
第一:成员内部类中不能存在任何static的变量和方法;
第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。
下面简单的是一个成员内部类的例子:
1 public class Outer { 2 public static void main(String[] args) { 3 Outer outer = new Outer(); 4 Outer.Inner inner = outer.new Inner(); 5 inner.print("Outer.new"); 6 7 inner = outer.getInner(); 8 inner.print("Outer.get"); 9 } 10 11 // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 12 public Inner getInner() { 13 return new Inner(); 14 } 15 16 public class Inner { 17 public void print(String str) { 18 System.out.println(str); 19 } 20 } 21 }
二、成员内部类
成员内部类是指内部类定义在方法和作用域内。
下面是一个简单的列子:
1.首先我们先创建一个方法
1 public class DuanZhanShiChuangZhen { 2 3 public void noProblem () { 4 System.out.println("不小心撞到人了,怎么办,不过好像我爸是李刚"); 5 } 6 }
2.然后创建一个测试类来实现内部类的方法的定义和使用
1 public class Test { 2 3 public void driver () { 4 System.out.println("我正在开车"); 5 //成员内部类 6 class B extends DuanZhanShiChuangZhen { 7 8 } 9 new B().noProblem();//调用内部类中的方法 10 System.out.println("爱死我爹了"); 11 12 } 13 14 public static void main(String[] args) { 15 new Test().driver();//在main方法中调用 16 } 17 }
输出的结果:
三、匿名内部类
匿名内部类,从名字上来看就是没有名字的,就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
夏明是一个简单的匿名内部类的例子:
1.先定义一个QinShou的接口(老师教的案例,只在于理解,请不要过多猜测,本人很纯洁的)
1 package memberinner3; 2 3 public interface QinShou { 4 5 public void workInNight(); 6 }
2.定义一个Doctor 的抽象类来继承Qinshou的借口
1 package memberinner3; 2 3 public abstract class Doctor implements QinShou{ 4 5 public void workInDay () { 6 System.out.println("白天传授理论知识"); 7 } 8 }
3.下面就是同过main方法来实现匿名内部类的
1 package memberinner3; 2 3 public class Test { 4 5 public static void main(String[] args) {14 //匿名内部类 15 //new出一个抽象类或借口 16 //直接加一个{} 17 //在{}里面实现方法 18 Doctor d = new Doctor() { 19 20 @Override 21 public void workInNight() { 22 System.out.println("洗洗睡"); 23 } 24 }; 25 d.workInDay(); 26 d.workInNight(); 27 } 28 29 30 }
输出的结果:
以上就是实现匿名内部类方法。