zoukankan      html  css  js  c++  java
  • java内部类

    成员内部类

    定义在类里面的类

    • 成员内部类可以访问外部类的所有成员,包括private成员和静态成员
    • 当内部类和外部类成员重名的情况下,默认访问的是内部类的成员;访问外部成员方法为:外部类.this.外部成员
    • 创建内部类必须先存在外部类:new Out().new Inner()
    • 字节码文件名:外部类名$内部类名.class
    package com.zrun;
    
    import com.zrun.Outer1.Inner1;
    
    public class App1 {
    
    	public static void main(String[] args) {
    		// 创建成员内部类的方法1
    		Outer1 out = new Outer1("ych", 29);
    		Inner1 inn = out.new Inner1("hll");
    		inn.testField();
    		// 创建成员内部类的方法2
    		Inner1 inn2 = out.getInnerInst();
    		inn2.testField();
    	}
    
    }
    
    class Outer1 {
    	private String name;
    	private int age;
    
    	public Outer1(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    
    	private Inner1 inner;
    
    	/**
    	 * 获取内部类实例
    	 * 
    	 * @return
    	 */
    	public Inner1 getInnerInst() {
    		if (inner == null)
    			inner = new Inner1("hll");
    		return inner;
    	}
    
    	class Inner1 {
    		private String name;
    
    		public Inner1(String name) {
    			this.name = name;
    		}
    
    		/**
    		 * 内部类引用外部类成员
    		 */
    		public void testField() {
    			System.out.println("内部类使用外部类的变量age:" + age);
    			System.out.println("内部类和外部类变量重名,默认使用内部类name:" + name);
    			System.out.println("内部类和外部类变量重名,使用内部类name:" + this.name);
    			System.out.println("内部类和外部类变量重名,使用外部类name:" + Outer1.this.name);
    		}
    	}
    }
    

    局部内部类

    定义在方法或作用域里面的类,访问权限只在该方法或作用域中(实际开发中很少使用,因为作用域太小)

    • 局部内部类类似于方法局部变量,不能有public、protect、private、static修饰符
    • 字节码文件名:外部类名$1内部类名.class
    package com.zrun;
    
    public class App2 {
    	public static void main(String[] args) {
    		// new Inner2().printName();
    		String name = "ych";
    		class Inner2 {
    			public void printName() {
    				System.out.println(name);
    			}
    		}
    		new Inner2().printName();
    	}
    
    }
    

    匿名内部类

    • 常用于写事件监听
    • 字节码文件名:App3$1.class
    package com.zrun;
    
    public class App3 {
    
    	public static void main(String[] args) {
    		Button btn = new Button();
    		btn.click(new ButtonClickListener() {
    
    			@Override
    			public void click() {
    				System.out.println("按钮被点击了"); 
    			}
    
    			@Override
    			public void doubleClick() {
    				System.out.println("按钮被双击了");
    			}
    		});
    	}
    }
    
    interface ButtonClickListener {
    	public void click();
    
    	public void doubleClick();
    }
    
    class Button {
    	public void click(ButtonClickListener clickListener) {
    		clickListener.click();
    		clickListener.doubleClick();
    	}
    }
    

    静态内部类

    定义在类中的类,前面有static关键字修饰

    • 创建静态内部类不需要依赖外部类
    • 静态内部类相当于外部类的静态成员,不可以使用外部类的非静态成员
    • 字节码文件名:外部类名$内部类名.class
    package com.zrun;
    
    public class App4 {
    
    	public static void main(String[] args) {
    		Outer4.Inner4 inner4 = new Outer4.Inner4(); 
    		inner4.print();
    	}
    
    }
    
    class Outer4 {
    	private String name;
    	static Integer age = 29;
    
    	static class Inner4 {
    		public void print() {
    			// System.out.println(name);
    			System.out.println(age);
    		}
    	}
    }
    
    
    
  • 相关阅读:
    scala中的注解
    scala中的表达式
    scala中枚举
    spark sql建表的异常
    hive和sequoiadb对接的问题
    java IO的总结
    Spark的序列化
    pentaho和spark-sql对接
    英语口语练习系列-C28-海滨-辨别身份-悬崖边的树
    2018-12-4-今日总结
  • 原文地址:https://www.cnblogs.com/yinchh/p/10468275.html
Copyright © 2011-2022 走看看