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、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

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

  • 相关阅读:
    2015.2.27 UltraEdit中显示XML结构
    2015.1.31 DataGridView自动滚动到某行
    2015.1.15 利用函数实现将一行记录拆分成多行记录 (多年想要的效果)
    2015.1.15 利用Oracle函数返回表结果 重大技术进步!
    2015.1.15 利用Oracle函数插入表结构 Bulk collect into 不用循环,简洁高效
    2015.1.8 Left join 左连接
    2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
    delphi 遍历窗口
    delphi 访问 protected 属性 哈哈
    clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈
  • 原文地址:https://www.cnblogs.com/liangshijie/p/6068683.html
Copyright © 2011-2022 走看看