abstract:在这小编带给大家讲解一下内部类的基本知识点,在学习Android开发之前我们要对内部类要有所认识,因为在Android的实际开发中内部类的定义我们非常常见,所有小编在这要特意讲解,认识一下内部类的语法定义规则 学习目标: 掌握内部类定义 &n
在这小编带给大家讲解一下内部类的基本知识点,在学习Android开发之前我们要对内部类要有所认识,因为在Android的实际开发中内部类的定义我们非常常见,所有小编在这要特意讲解,认识一下内部类的语法定义规则
学习目标:
掌握内部类定义
掌握内部类的优缺点
掌握内部类的使用格式
掌握static 声明内部类的作用
内部类
定义
在一个类B的内部定义一个类为A,那我们通常叫A类为B类中的内部类,内部类可以声明成public或者private。当内部类声明成public或着private时,对其访问的限制与成员变量和成员方法完全相同,往往定义内部类的作用实现类之间的高内聚,代码不对外开放的,实现一些敏感数据不那么轻易被访问的作用
语法
标识符 class 外部类的名称{ //外部类成员 标识符 class 内部类的名称{ //内部类成员 } }
形式
在内部类的学习中我们最常见的内部类有如下三种形式
成员内部类 、方法内部类、匿名内部类
特点:
成员内部类:在一个外部类的内部且方法外定义的类我们称为外部类 ,该类特点是高度内聚,不对外开放
方法内部类(局部内部类):在一个方法内部定义的类我们通常叫做方法内部类或者局部内部类 该类特点是短暂性的,不对外的
匿名内部类:要满足匿名内部类操作在实现该类操作时必须是一个抽象类或者是一个接口,这样才能使用内部类操作,在实现一个内部类操作时,同时是重写未实现的方法,也是高内聚的特点
2. 掌握内部类的优缺点
在讲解内部类的优缺点时,实现我们编写两个程序简单的对比内部类的优缺点
案例1
package anonymousinner; public class OutClass { //定义一个外部类字符串属性 private String info ="内部类"; //定义一个内部类 class Inner{ //编写一个内部类方法 public void printInfo(){ System.out.println(info); } } //定义一个外部类方法 public void print(){ //执行调用内部类方法操作 new Inner().printInfo() ; } public static void main(String[] args) { new OutClass().print() ; } }
2. 案例2
package anonymousinner.test; class Out{ //定义一个字符串属性 private String info ="内部类"; //将Inner方法内容输出 public void print(){ new Inner(this).printInfo() ; } public String getInfo(){ return this.info ; } } class Inner{ private Out out ; public Inner(Out out){ this.out = out ; } //编写一个内部类方法 public void printInfo(){ System.out.println(out.getInfo()); } } public class OutClassTwo { public static void main(String[] args) { //测试输出 new Out().print() ; } }
结合以上两个案例代码可以看出使用内部类的代码量往往要比不使用内部类案例代码量要多,而复杂度也增加了,使用内部类最大的优点可以方便访问外部类中的私有属性,而使用内部类最大缺点就是在一个正常类操作中,类中只定义了属性或方法。如果再定义一个内部类的话,则破坏了代码的整体结构
刚才上述案例中也是讲解了内部类的一种形式叫做成员内部类
接下来讲解的是方法内部类
package anonymousinner; public class FunClass { private String info ="外部类属性值" ; public static void main(String[] args) { //执行测试 new FunClass().print() ; } public void print(){ class Inner{ //定义一个带有参数内部类方法 public void printInfo(String str){ System.out.println("这是谁的值:"+str); System.out.println("这是谁的值:"+info); } } ; new Inner().printInfo("内部类参数值") ; } }
使用static声明内部类
在使用是static声明一个内部类,声明的内部类就称为外部类了,直接可以在类的外部进行外部调用,如果要访问外部类的属性则必须是static访问权限,否则不可直接调用外部类的属性
package anonymousinner.test; class A{ private static String name ="XiaoMing"; static class B{ public void said(){ System.out.println(name+"可以说话了"); } } } public class StaticInnerClass { public static void main(String[] args) { //执行调用 new A.B().said() ; } }
一旦内部类用static修饰这该内部类可以被外部进行调用,那调用的形式又是怎么呀的呢?我们可以通过以下格式进行调用
外部类.内部类 内部对象 = 外部类实例.new 内部类()
匿名内部类
在实际开发中如果一个类在这个程序中只是使用一次的话,就可以将该类定义为匿名内部类,匿名内部类是在抽象类以及接口的继承上发展而来,往往在实现多态操作中发挥的重要作用,且在Android的学习中匿名内部类是非常常见的程序编程形式,还有众多的java框架中也运用的比较多,我们主要学习掌握匿名内部类的语法定义和使用
package anonymousinner; //定义一个接口 interface IUSB{ public void start() ; } //定义一个类实现该接口 class Conputer implements IUSB{ public void start() { System.out.println("电脑中的USB启动了"); } } public class Test { public static void main(String[] args) { //直接以接口形式实现 new Test().print(new Conputer()); //通过匿名实现 new Test().print2() ; } //第一种直接通过调用 public void print(IUSB usb){ usb.start() ; } public void print2(){ //编写一个匿名内部类 IUSB comput2 = new IUSB(){ public void start() { System.out.println("电脑2USB启动"); } } ; comput2.start() ; } }
在使用匿名内部时,如果电脑这个类只需要使用一次,那我们还要而外声明一个类吗?答案是不用的,所以匿名内部类的好处就体现在这了