zoukankan      html  css  js  c++  java
  • 内部类的定义及使用

    内部类的基本概念

    内部类指的是一个类的内部进行其他类嵌套的操作语法形式。理论上就跟盗墓空间一样,一层层进行类的嵌套形式

    范例:内部类的基本使用

     1 class Outer{//定义一个外部类
     2  private String msg="Hello World!";
     3  //*********************
     4  class Inter{//此时定义了一个内部类
     5   public void print(){//定义一个普通方法
     6    System.out.println(msg);
     7   }
     8  }
     9  //*********************
    10  //在外部类中定义一个方法,这个方法负责产生内部类的对象和调用print();方法
    11  public void fun(){
    12   Inter in=new Inter();//内部类的对象
    13   in.print();//内部类提供的print()方法
    14  }
    15 }
    16 public class Newbegin{
    17  public static void main(String args[]) {
    18   Outer out=new Outer();//外部类对象
    19   out.fun();//外部类方法
    20  }
    21 }

    程序结构有点混乱!虽然内部类破坏了程序结构从整体上来讲不好,但从另一个方面来说

    内部类的优点在于外部类的私有访问

    范例:将以上程序的内部类提取到外部,要求实现同样的功能

     1 class Outer{
     2  private String msg="Hello World!";
     3  public String getMsg(){//通过此方法才可以取得msg的内容
     4   return this.msg;
     5  }
     6  public void fun(){//3.现在由out对象调用了fun()方法
     7   Inter in=new Inter(this); //4.this表示当前对象,
     8   in.print();//7.调用方法
     9  }
    10 }
    11 class Inter{
    12  private Outer outer;
    13  public Inter(Outer outer){//5.Inter.out=main.out;
    14   this.outer=outer; //6.引用传递
    15  }
    16  public void print(){//8.执行此方法
    17   System.out.println(this.out.getMsg());
    18  }
    19 }
    20 public class OuterDemo{
    21  public static void main(String args[]){
    22   Outer out=new Outer();//1.实例化Outer
    23   out.fun();//2.调用Outer类方法
    24  }
    25 }

    对内部类的操作

    1.通过以上代码可以发现,当前的内部类的访问必须通过外部类的方法才可以完成,如果不想通过

    外部类的方法调用,那么就必须按照如下形容进行创建:

    语法:外部类.内部类 内部类对象=new 外部类().new 内部类(); 

    class Outer{//定义一个外部类
     private String msg="Hello World!";
     class Inner{//此时定义了一个内部类
      public void print(){//定义一个普通方法
       System.out.println(msg);
      }
     }
    }
    public class Newbegin{
     public static void main(String args[]) {
      //声明内部类对象
      Outer.Inner in=new Outer().new Inner();
      in.print();
     }
    }

    1.因为外部类中有属性,这些属性只能实例化才能调用,

    2.如果一个内部类只想被外部类使用,即:不希望直接产生内部类的实例化对象,那么可以使用private定义

     1 class Outer{//定义一个外部类
     2  private String msg="Hello World!";
     3  private class Inner{//此时定义了一个内部类
     4   public void print(){//定义一个普通方法
     5    System.out.println(msg);
     6   }
     7  }
     8  public void fun(){
     9   Inner in=new Inner(); 
    10   in.print();
    11  }
    12 }
    13 public class Newbegin{
    14  public static void main(String args[]) {
    15   //声明内部类对象
    16   new Outer().fun(); 
    17  }
    18 }

    3.在进行属性访问时要加上this. 如果想要在内部类明确的使用this

    就要外部类.this.属性表示外部类当前对象的属性

    public void print(){//定义一个普通方法
       System.out.println(Outer.this.msg);
     }

    static定义内部类

     内部类中如果使用了static进行定义,那么就表示其就是一个外部类的形式,

    这个外部类的名称就是“外部类.内部类”。同时该内部类只允许访问外部类中的static 操作, 

    范例:使用static定义内部类

     1 class Outer{//定义一个外部类
     2  private static String msg="Hello World!";
     3  static class Inner{//内部类=“外部类”
     4   public void print(){
     5    //此时只能够使用外部类中的static操作
     6    System.out.println(msg); 
     7   }
     8  }
     9 }
    10 public class Newbegin{
    11  public static void main(String args[]) {
    12   Outer.Inner in=new Outer.Inner();//static来定义内部类
    13   in.print();
    14  }
    15 }

    外部类.内部类 内部类对象=new 外部类.内部类();

    在方法中定义内部类

    理论上内部类可以定义在类中的任意位置,在方法中定义内部类的形式是最多的

    范例:在方法中定义内部类

     1 class Outer{//定义一个外部类
     2     private String msg="Hello World!";
     3     public void fun(final int num){
     4         class Inner{
     5             public void print(){
     6                 System.out.println("num="+num);
     7                 System.out.println("msg="+msg);
     8             }
     9         }
    10         new Inner().print();//产生内部类对象调用方法
    11     }
    12 }
    13 public class Newbegin{
    14     public static void main(String args[]) {
    15         new Outer().fun(100);
    16     }
    17 }
    18 //此方法在JDk1.8是正常的,但是在JDK1.8之前就错误的
    19 //在JDK1.7及之前,内部类要使用方法的参数,那么就必须用final定义

    总结:

    1.破坏了程序的结构;

    2.方便进行私有属性的访问;不受private 限制

     

                                          

  • 相关阅读:
    PHP流程控制之do...while循环的区别
    php流程控制 之循环语句的使用
    PHP流程控制之分支结构switch语句的使用
    PHP流程控制之if语句多种嵌套
    PHP流程控制之嵌套if...else...elseif结构
    PHP基础语法之 三元运算符和其它运算符
    PHP基础语法之 位运算
    php常量和变量之变量引用
    php数据类型之自动转换和强制转换
    php数据类型之查看和判断数据类型
  • 原文地址:https://www.cnblogs.com/Tony98/p/10392990.html
Copyright © 2011-2022 走看看