zoukankan      html  css  js  c++  java
  • Java基础——内部类

    内部类

    定义

    内部类是定义在类内部的类,它可以访问外部类的成员。

    为什么需要内部类

    1. 增强封装,把内部类隐藏在外部类中,不允许其他类访问这个内部类
    2. 增加了代码的维护性

    内部类分类

    • 实例内部类
      直接定义在类当中的一个类,在类前面没有任何一个修饰符
    • 静态内部类
      在内部类前面加上一个static
    • 局部内部类
      定义在方法中的内部类
    • 匿名内部类
      属于局部内部的一种特殊情况

    实例内部类

    class Outter{
    	String name = "Outername";
    	
    	class Inner{
    		
    		int age = 10;
    		String name = "inname";
    		
    		void test() {
    			String name = "testname";
    			System.out.println(name);
    			
    			System.out.println(this.name);
    			
    			System.out.println(Outter.this.name);
    		}
    	}
    }
    public class Test {
    	public static void main(String[] args) {
    		
    		Outter out = new Outter();
    		//System.out.println(out.name);
    		//创建实例内部类
    		//创建内部类对象当中,会有一个外部类的引用 
    		Outter.Inner in = out.new Inner();
    		in.test();
    	}
    }
    
    • 要使用实例内部类,必须先创建外部类对象
    • 实例内部类可以访问外部类的成员
    • 实例内部类中不能有静态成员
    • 外部类不能直接访问实例内部类中的成员

    静态内部类

    class Outter{
    	static String name = "myxq";
    	int age = 10;
    	static class Inner{
    		static String color = "black";
    		int width = 30;
    		void test() {
    			System.out.println(name);
    			System.out.println(new Outter().age);
    		}
    	}
    }
    
    public class Test {
    
    	public static void main(String[] args) {
    		//创建静态内部类
    		Outter.Inner in =	new Outter.Inner();
    		in.test();
    		
    		//System.out.println(in.width);
    		
    		//访问静态类当中的静态成员
    		//System.out.println(Outter.Inner.color);
    	}
    }
    
    • 不需要创建外部类对象
      Outter.Inner in = new Outter.Inner();
    • 静态内部类中没有外部类的引用(不能用:外部类名.this.外部类成员)
    • 静态内部类不能直接访问外部类普通成员,但是可以直接访问外部类的静态成员
    • 静态内部类中可以定义静态成员,也可以定义非静态成员

    局部内部类

    class Outter{
    	
    	void myxq() {
    		
    		final String name = "myxq";
    		class Inner{
    			void test() {
    				System.out.println(name);
    			}
    		}
    		Inner in = new Inner();
    		in.test();
    		
    	}
    	
    }
    
    
    public class Test {
    	
    	public static void main(String[] args) {
    		
    		new Outter().myxq();
    	}
    }
    
    • 不能使用一些修饰 public private ...
    • 局部内部类只能在定义的方法当中使用
    • 局部内部类当中不能包含静态变量
    • 局部内部类当中可以包含局部变量,使用的局部变量的本质是final常量

    匿名内部类

    interface IUSB{
    	void swapData();
    }
    
    class MotherBoard{
    	void pluginIn(IUSB u) {
    		u.swapData();
    	}
    }
    
    class Printer implements IUSB{
    	public void swapData() {
    		System.out.println("打印工作");
    	}
    }
    
    class KeyBoard implements IUSB{
    	public void swapData() {
    		System.out.println("打字");
    	}
    }
    
    class Mouse  implements IUSB {
    	public void swapData() {
    		System.out.println("鼠标移动");
    	}
    }
    
    public class Test {
    	public static void main(String[] args) {
    		
    		IUSB m = new Mouse();
    		IUSB k = new KeyBoard();
    		
    		MotherBoard b = new MotherBoard();
    		b.pluginIn(m);
    		b.pluginIn(k);
    		
    		//b.pluginIn(p);
    		
    		b.pluginIn(new IUSB() {
    			public void swapData() {
    				System.out.println("打印工作");
    			}
    		});
    		
    	}
    }
    
    • 匿名内部类就是一个没有名字的局部内部类
    • 只使用一次的时候,才去使用匿名内部类
    • 格式
      new 父类的构造器 或 接口(){
      内部写的代码(在new时候就会自动执行)
    • 匿名内部类必须得要有父类才或者是实现了接口

    作者:lykxbg —— 来一块小饼干

    出处:http://www.cnblogs.com/lykxbg/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    计算机中的进制和编码
    操作系统简史
    电脑结构和CPU、内存、硬盘三者之间的关系
    电脑简史
    使用开源my-deploy工具实现开发环境的代码自动化部署
    使用Let’s Encrypt创建nginx免费SSL证书
    VM ESXI 服务器虚拟化资料积累
    python mysql连接函数
    python日期格式转换小记
    Python模块学习
  • 原文地址:https://www.cnblogs.com/lykxbg/p/15218150.html
Copyright © 2011-2022 走看看