• Java面向对象_内部类


    概念:内部类就是类的内部定义的类

    成员内部类格式如下:class Outer{

                                      class Inner{}

                                }

    编译上述代码会产生两个文件:Outer.class和Outer$Inner.class

    在外部创建内部类对象

    内部类除了可以在外部类中产生实例化对象,也可以在外部类的外部来实例化。所以内部类的访问:通过"外部类.内部类"的形式表示

    Outer out=new Outer();//产生外部类实例

    Outer.Inner in=null;//声明内部类对象

    in=out.new Inner();//实例化内部类对象

    public class Practice14 {
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Outer o=new Outer();
            o.print();
            
            //直接在外部使用内部类,不推荐使用
            Outer.Inner in=o.new Inner("在外部使用内部类");
            in.print();
        }
    }
    
    
    class Outer{
        public void print(){
            //在外部类实例化内部类,并调用方法
            Inner i=new Inner("成员内部类");
            i.print();
        }
        class Inner{
            private String name;
            public Inner(String name){
                this.name=name;
            }
            public void print(){
                System.out.println(name);
            }
        }
    }

    方法内部类格式如下:class Outer{

                 public void doSomething(){

                    class Inner{

                      public void seeOuter(){}

                   }

                  }

                 }

          注意:1.方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化

          2.方法内部类对象不能使用该内部类所在方法的非final局部变量

     1 public class Practice14 {
     2     
     3     public static void main(String[] args) {
     4         // TODO Auto-generated method stub
     5         Outer o=new Outer(); 
     6         o.print1();
     7        
     8     }
     9 }
    10 
    11 
    12 class Outer{
    13     
    14     public void print1(){
    15         final int x=10;//方法内部类对象不能使用该内部类所在方法的非final局部变量
    16         //在方法内创建内部类
    17         class Inner1{
    18             public void print(){
    19                 System.out.println("我是方法内部类"+x);
    20             }
    21         }
    22         Inner1 i=new Inner1();//只能在定义该内部类的方法内实例化
    23         i.print();
    24     }
    25     
    26 }

    静态内部类:在一个类内部定义一个静态内部类:静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类仅能访问外部类的静态成员和方法。

          class Outer{

            static class Inner{}

          class Test{

            public static void main(String[] args){

              Outer.Inner n=new Outer.Inner();

          }

          }

     1 public class Practice14 {
     2     
     3     public static void main(String[] args) {
     4         // TODO Auto-generated method stub
     5        //在外部直接使用静态内部类(创建静态内部类对象不需要依赖外部类的对象)
     6         //静态内部类在之后的安卓编程中经常使用(重点)
     7        Outer.Inner o=new Outer.Inner();
     8        o.print();
     9     }
    10 }
    11 
    12 
    13 class Outer{
    14     static class Inner{
    15         public void print(){
    16             System.out.println("静态");
    17         }
    18     }    
    19     
    20 }

    匿名内部类:匿名内部类就是没有名字的内部类。有三种情况:继承式的匿名内部类;接口市的匿名内部类;参数式的匿名内部类;

    在使用匿名内部类时,记住以下原则:

    1.不能有构造方法,只能有一个实例

    2.不能定义任何静态成员、静态方法

    3.不能是public,protected,private,static

    4.一定是在new的后面,用其隐含实现一个接口或实现一个类

    5.匿名内部类为局部的,所以局部内部类的所有限制都对其生效

     1 public class Practice14 {
     2     
     3     public static void main(String[] args) {
     4         // TODO Auto-generated method stub
     5        Boy b=new Boy();
     6        b.print();
     7        
     8        b.print2(new Child(){
     9           public void desc(){
    10               System.out.println("参数式的匿名内部类");
    11           }
    12        });
    13     }
    14 }
    15 
    16 interface Child{
    17     public void desc();
    18 }
    19 
    20 class Boy{
    21     public void print(){
    22         Child C=new Child(){
    23             public void desc(){
    24                 System.out.println("接口市的匿名内部类");
    25             }
    26         };
    27         C.desc();
    28     }
    29     public void print2(Child ch){
    30         ch.desc();
    31     }
    32 }

    定义内部类时优先考虑静态内部类,可以防止内存溢出。

  • 相关阅读:
    Jzoj4889 最长公共回文子序列
    Jzoj4889 最长公共回文子序列
    Jzoj4888 最近公共祖先
    Jzoj4888 最近公共祖先
    Jzoj5441【NOIP2017提高A组冲刺11.1】序列
    Jzoj5441【NOIP2017提高A组冲刺11.1】序列
    hdu1269 迷宫城堡
    洛谷P1991 无线通讯网
    左神算法进阶班1_2判断两个树的结构是否相同
    判断两条链表是否相交(公共部分)并找出相交处
  • 原文地址:https://www.cnblogs.com/shenhainixin/p/5072671.html
Copyright © 2020-2023  润新知