zoukankan      html  css  js  c++  java
  • Java中的内部类介绍(1)

    栗子1:

    package campu;
    //外部类
    class Out{
    	private int age =12;
    	//内部类
    	class In{
    		public void print(){
    			System.out.println(age);
    		}
    	}
    }
    public class YoYo {
    public static void main(String[] args) {
    	Out.In in=new Out().new In();
    	in.print();
    	//或
    	/* 
    	Out out=new Out();
    	Out.In in2=out.new In();
    	in.print();
    	*/
    	
    }
    }
    

      内部类:一个类中包含着另外一个类;

    内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点;

    程序编译过后会产生两个.class文件,分别是Out.class和Out$In.class
    
    其中$代表了上面程序中Out.In中的那个 .
    
    Out.In in = new Out().new In()可以用来生成内部类的对象,这种方法存在两个小知识点需要注意
    
      1.开头的Out是为了标明需要生成的内部类对象在哪个外部类当中
    
      2.必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量
    

      栗子2:

    package campu;
    //外部类
    class Out{
    	private int age =12;
    	//内部类
    	class In{
    		private int age=13;
    		public void print(){
    			int age=14;
    			System.out.println("局部变量:"+age);
    			System.out.println("内部类变量:"+this.age);
    			System.out.println("外部类变量:"+Out.this.age);
    		}
    	}
    }
    public class YoYo {
    public static void main(String[] args) {
    	Out.In in=new Out().new In();
    	in.print();
    	//或
    	/* 
    	Out out=new Out();
    	Out.In in2=out.new In();
    	in.print();
    	*/
    	
    }
    }
    

      

    从栗子2中可以发现,内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量,而无需指定Out.this.属性名

    否则,内部类中的局部变量会覆盖外部类的成员变量

    而访问内部类本身的成员变量可用this.属性名,访问外部类的成员变量需要使用Out.this.属性名

    静态内部类:

    栗子:

    package campu;
    //外部类
    class Out{
    	private static int age =12;
    	//内部类
    	static class In{
    		public void print(){
    			System.out.println(age);
    			
    		}
    	}
    }
    public class YoYo {
    public static void main(String[] args) {
    	Out.In in=new Out.In();
    	in.print();
    }
    }
    

      

    可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性

    其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)

    私有内部类:

    栗子:

    package campu;
    //外部类
    class Out{
    	private  int age =12;
    	//内部类
    	 private class In{
    		public void print(){
    			System.out.println(age);
    			
    		}
    	}
    	 public void outPrint(){
    		 new In().print();
    	 }
    }
    public class YoYo {
    public static void main(String[] args) {
    	Out out=new Out();
    	out.outPrint();
    }
    }
    

      

    如果一个内部类只希望被外部类中的方法操作,那么可以使用private声明内部类

    上面的代码中,我们必须在Out类里面生成In类的对象进行操作,而无法再使用Out.In in = new Out().new In() 生成内部类的对象

    也就是说,此时的内部类只有外部类可控制

    如同是,我的心脏只能由我的身体控制,其他人无法直接访问它

    方法内部类:

    栗子:

    package campu;
    //外部类
    class Out{
    	private  int age =12;
    	public void Print(final int x){
    		//内部类
    		  class In{
    			public void print(){
    				System.out.println(x);
    				System.out.println(age);			
    			}
    		}
    		  new In().print();
    	}
    }
    public class YoYo {
    public static void main(String[] args) {
    	Out out=new Out();
    	out.Print(6);
    }
    }
    

      

    在上面的代码中,我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法

    如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义

    至于final在这里并没有特殊含义,只是一种表示形式而已。

  • 相关阅读:
    Mini440之uboot移植之源码分析board_init_f(二)
    Mini440之uboot移植之源码分析uboot重定位(三)
    Mini440之uboot移植之实践DM9000支持(八)
    Mini2440裸机开发之DM9000
    Mini440之uboot移植之源码分析命令解析(五)
    Mini440之uboot移植之实践NOR启动(六)
    Mini440之uboot移植之实践NOR FLASH支持(七)
    mysql调优和SQL优化
    linux man手册使用相关问题
    关于ca以及证书颁发的一些事
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6544453.html
Copyright © 2011-2022 走看看