Java内部类


常见的3大内部类,其实还有其他内部类,其他更更少用

   成员内部类
     特点:不对外开放,高内聚的 {只能去本类new xx调用内部的功能}
       不需要外部知道我里面的实现(例生活例子:我买药品,不需要药是哪个农户提供给生产厂家的)
       如果是外部强制要调用,也是可以的,不建议
       这个也是可以禁用,把内部类Bb的构造方法设置为private就不可以调用了。
        (new Aa()).new Bb().xxx方法名() ;

  方法内部类
    特点:不对外开放,短暂性的,方法执行完了就是没有的了。
       通常方法内部类是继承某个抽象类,或是类,或是实现接口来体现的方法内部类。


 匿名内部类{经常用的}

    特点:不对外公开,进行实现功能,继承类,继承抽象类,实现某个接口的匿名内部类,实现相应的方法。
      特别注意:匿名内部类,匿名指的是 ,new 关键字右边的那个对象--如继承,或是接口 {忌:一定不是一个具体实际的类}
          IYeYou yy = new IYeYou()

      步骤:
        1:new 一个抽象类或是接口 new Pc() --new 的是不具体的所用说是匿名 【具体的是普通的类了】
        2:加入一个大括号 {}
        3:现在未实现的方法

 --------------------------------------------------------------------------------------------------------------------------------------------------

    下面依依分析代码

成员内部类:

     特点:不对外开放,高内聚性

package com.test.memberinnerclass;

public class MyMemberClass {

    class Aa{
         public void xingQing(){
            
         System.out.println("我的是内部类----功能提供高兴的 心情!");
         }
    }
    
    public void play(){
        
        System.out.println("我在高兴的玩撒!");
        
        new Aa().xingQing() ;
    }

    
}
    

进行调用一下

 1 package com.test.memberinnerclass;
 2 
 3 
 4 public class MemberClassTest {
 5 
 6     /**
 7      * @param args
 8      */
 9     public static void main(String[] args) {
10         
11         MyMemberClass mst = new MyMemberClass() ;
12         mst.play() ;
13         //现在是尝试的调用内部的类,很明显的是调用不了的。
14             //Aa s = new Aa() ;                //报错的
15             //mst.Aa ma = new mst.Aa() ;       //报错
16         
17          //这个就是可以的但是不建议这样用,说好了,内部类,不可以这样调用的
18         //new MyMemberClass().new Aa().xingQing() ;
19         
20               
21     }
22 
23 }

-----------------------------------------------------------------------------------------------------------------------------------------

  方法内部类

         特点:对外不公开,短暂性的,当方法执行完了就没有了的。

  首先我先定义一个外部类做辅助:

                

       定义这个类:

          BanLiDuanZhanJingShengZheng

package com.test.methodinnerclass;
/**
 * 颁发精神病证书类
 * @author Administrator
 *
 */
public class BanLiDuanZhanJingShengZheng {

    public void noProblem(){
        System.out.println("颁发精神病证,我杀人也是没问题的----我背景'有人'");
    }

}

 定义第二个类含义方法内部类的

package com.test.methodinnerclass;

public class MethodInnerClass {
 
      /**
       * 方法内部的特点:不对外开放,短暂性有效的,当方法执行完就是没有校的了,也是符合业务流程功能,
       * 因为我开车的时候,撞到了人,此时我才要颁发那个证书的。
       * 
       * ????
       * 问题来了:疑问,老师为什么要定义一个匿名内部类Cc来呢,然后再次继承一个颁发精神病的类。
       * 我的观点:干脆就是new 一下那个颁发精神病的类进行调用不就可以实现相同的效果功能吗?
       * 老师说:有时那个类是-----抽象类,必须需要继承类或是实现接口才能达到那个实际的
       * 感悟:有道理,没错。
       */
      
      //定义一个方法实现开车
      public void driverCar(){
          System.out.println("我在以150km/h的速度在开车!");
          System.out.println("撞坏了人");
          //此时定义了一个方法内部类为Cc   {内部类可以继承某个类,抽象类,或实现接口}
          class Cc extends BanLiDuanZhanJingShengZheng{
            //须知此时我就时继承了一个颁发精神病的类,方法就是进行了继承过来的了
          }
          new Cc().noProblem() ;
          
          System.out.println("以前事情都是没有问题的了!");
          
          
      }
    
    
    
    
    
    
}

 我们进行测试运行

package com.test.methodinnerclass;

public class MethodTest {

    public static void main(String[] args) {
        
        MethodInnerClass mend= new MethodInnerClass() ;
        
        //此时我调用的饿是开车方法(内部有个匿名内部类)
        mend.driverCar() ;
        
        

    }

}

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 匿名内部类:

           特点:

        不对外公开,进行实现功能,继承类,继承抽象类,实现某个接口的匿名内部类,实现相应的方法。

      特别注意:匿名内部类,匿名指的是 ,new 关键字右边的那个对象--如继承,或是接口 {忌:一定不是一个具体的类}
   
    IYeYou yy = new IYeYou()

          实现步骤:

             1:new 一个抽象类或是接口 new Pc() --new 的是不具体的所用说是匿名 【具体的是普通的类了】

             2:加入一个大括号 {}

             3:现在未实现的方法

package com.test.anonymousinnerclass;

public class AnonymousTest {

    //测试
    public static void main(String[] args) {
        
        //抽象类是不可以来进行创建对象的。
        //Doctor docs = new Doctor() ; //报错
           //这个是普通进行创建的实际类
           DoctorOne done = new DoctorOne() ;
        
            done.workdaycase() ;
            done.workNight() ;
            System.out.println("--------------------------------") ;    
            
            //此时我这里是个匿名的内部类  new 抽象类
            Doctor dess = new Doctor(){

                    public void workNight() {
                        
                        System.out.println("我是个第三个教授3号,我晚上是溜冰玩耍的!");
                    }
            } ;
            
            dess.workdaycase() ;
            dess.workNight() ;
          System.out.println("--------------------------------") ;    
        
            //此时我这里是个匿名的内部类  new 接口
            IYeYou yy = new IYeYou(){

                public void workNight() {
                    System.out.println("");
                    
                }

                    
            } ;
            
            yy.workNight() ;
            
            
    }

}

-----------------------------------------------------------------以上就是常见的3大内部类--------------------------------------------------------------

---------------------------------------------------------------------------
  感悟:
    内部类有有点也是有缺点,其中,匿名内部类是用的最多的,其他的比较少用。


      内部类的也有优点和缺点,但是我们在Android中是经常用的。
        优点:我需要实现一个功能,只需在内部进行创建new就是可以实现了,不需要外部进行的创建。
        缺点:不好管理维护,耦合度很高。

-----------------------------------------------------

感谢你光临!

原文地址:https://www.cnblogs.com/HB135WBH/p/H225325H882.html