zoukankan      html  css  js  c++  java
  • Java提高内部类

    内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。
    *内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。
     
    注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

    一、成员内部类

       成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
          要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。
          在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象;
          而需要创建内部类对象,可以使用outer.inner  obj = outerobj.new inner();
     1 public class Outer { 
     2     public static void main(String[] args) { 
     3         Outer outer = new Outer(); 
     4         //第一种调用方法,new 实例化
     5         Outer.Inner inner = outer.new Inner(); 
     6         inner.print("Outer.new"); 
     7         //第二种方法:getter()方法
     8         inner = outer.getInner(); 
     9         inner.print("Outer.get"); 
    10     } 
    11  
    12     // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 
    13     public Inner getInner() { 
    14         return new Inner(); 
    15     } 
    16  
    17     public class Inner { 
    18         public void print(String str) { 
    19             System.out.println(str); 
    20         } 
    21     } 
    22 }      

    二、方法内部类(局部内部类)

      方法内部类,是指内部类定义在方法和作用域内。

      *方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。

      *方法内部类使用时,在方法中创建内部类对象,用对象调用其内部类中的方法。

      注:由于方法内部类不能在外部类的方法以外的地方使用呢,因此方法内部类不能使用访问控制符合 static 修饰符

      Test类:

     1 package methodinner;
     2 
     3 public class Test {
     4     //定义在方法里面
     5     public void driver(){
     6         System.out.println("我在开车");
     7         
     8         class B extends DuanZanShiChangZheng {}//定义方法内部类,继承DuanZanShiChangZheng(),ps不一定要继承父类类
     9         new B().noProblem();//调用方法内部类的noProblem方法
    10 //        System.out.println("撞到人了");//变成没事
    11         System.out.println("一切恢复正常");
    12     }
    13     
    14     public void show(){
    15         
    16     }
    17     
    18     public static void main(String[] args) {
    19         new Test().driver();
    20     }
    21 }

      DuanZanShiChangZheng类:

      

    1 package methodinner;
    2 
    3 public class DuanZanShiChangZheng {
    4     public void noProblem(){
    5         System.out.println("我有短暂精神病,杀人也没事");//变成没事
    6     }
    7 }

    运行结果:

      

     

     方法内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。

    三、匿名内部类

    匿名内部类也就是没有名字的内部类

    正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

    但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

    匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的

    我们可以通过下面这个栗子,能够明白。

    QinShou接口:
    1 package memberinner2;
    2 
    3 public interface QinShou {
    4     
    5     public abstract void workInght();
    6 }
    
    

    Doctor类:

    1 package memberinner2;
    2 
    3 public abstract class Doctor implements QinShou{
    4     
    5     public void workInDay() {
    6         System.out.println("白天教授理论知识");
    7     }
    8     
    9 }

     Test类:

     1 package memberinner2;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         Doctor d1 = new Doctor1() ;
     6         d1.workInDay();
     7         d1.workInght();
     8         Doctor d2 = new Doctor2() ;
     9         d2.workInDay();
    10         d2.workInght();
    11         //匿名内部类
    12         //new 一个抽象类或者接口
    13         //后加{},实现里面的方法
    14         Doctor d3 = new Doctor() {
    15             
    16             public void workInght() {
    17                 System.out.println("嗨起来");
    18                 
    19             }
    20         };
    21         d3.workInDay();
    22         d3.workInght();
    23         
    24     }
    25 }

     运行结果:

    在使用匿名内部类的过程中,我们需要注意如下几点:

          1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

          2、匿名内部类中是不能定义构造函数的。

          3、匿名内部类中不能存在任何的静态成员变量和静态方法。

          4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

          5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

    以上就是我对内部类的理解和例子。。。

  • 相关阅读:
    centos 给终端设快捷键
    centos 给鼠标右击添加 “打开终端” 菜单项
    centos 6.X 安装输入法
    centos U盘安装
    js的构造函数
    onresize的定义方式
    两个时间对比
    AMD和CMD的区别
    spring加载配置文件
    cglib代理
  • 原文地址:https://www.cnblogs.com/liangshijie/p/6068683.html
Copyright © 2011-2022 走看看