zoukankan      html  css  js  c++  java
  • java核心技术-内部类

    高级类特性-(类的成员之一:内部类)

    内的成员之一:内部类(属性、方法、构造器、代码块) 可以有四种权限访问修饰符

    注意:外部类 只有两种 public 和 default

    定义:可以将一个类的定义放在另一个类定义的内部,这就是内部类

    用法:如果一个类,仅跟本类关系密切的话,对于其他类希望隐藏,就可以使用内部类,例ArrayList中的 Itr

    1. 成员内部类

    成员内部类也是最普通的内部类,它是外围类的一个成员。

    在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

    public class TestInnerClass {
    	public static void main(String[] args) {
    		//创建非静态内部类的对象
    		Person p = new Person();
    		Person.Computer pc = p.new Computer();
    		pc.setName("IBM");
    		//System.out.println(pc.getName());
    	}
    }
     class Person {
    	private String name = "张三";
    	private int age;
    	
    	public Person() {
    		super();
    	}
    
    	public Person(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    	
        public class Computer{
    		private String name = "lenovo";
    
    		public String getName() {
    			return name;
    		}
    
    		public void setName(String name) {
    			System.out.println("setName 方法局部变量name: " + name);
    			System.out.println("Computer 的属性name:" + this.name);
    			System.out.println("外部内Person 属性的name:" + Person.this.name);
    			this.name = name;
    		}
    		
    	}
        
    }
    

    2. 局部内部类

    有这样一种内部类,它是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。(做Java后端 用法极少见 本人三年开发 从没见过有人用过)

    public class TestInnerClass2 {
    	
    	//局部内部类:如下方式使用非常的少
    	private void show(){
    		
    		class Inner{
    			
    		}
    	}
    
    	//如果一个类仅适用于当前方法时,可以声明如下方式
    	public static Comparator getComparator(){
    		
    		class MyComparator implements Comparator{
    
    			@Override
    			public int compare(Object o1, Object o2) {
    				return 0;
    			}
    			
    		}
    		return new MyComparator();
    	}
    
    	
    	public static void main(String[] args) {
    		Comparator comparator = TestInnerClass2.getComparator();
    	}
    }
    

    3. 匿名内部类

    注意:

    • 1.匿名内部类是没有访问修饰符的
    • 2.想使用外部的一个变量 该变量要用final修饰 -java8开始不需要
    public class TestInnerClass2 {
    	
    	public static Comparator getComparator1(){
    		
    		Comparator com = new Comparator(){ //匿名内部类实现的Comparator接口,new的是匿名内部类的构造器
    
    			@Override
    			public int compare(Object o1, Object o2) {
    				// TODO Auto-generated method stub
    				return 0;
    			}
    			
    		};
    		
    		return com;
    	}
    	
    	public static void main(String[] args) {
    		Comparator comparator = TestInnerClass2.getComparator1();
    		/*	comparator.compare(o1, o2);*/
    	}
    }
    

    4. 静态内部类

    大家都知道static可以修饰成员变量、方法、代码块,其实它还可以修饰内部类,使用static修饰的内部类我们称之为静态内部类,不过我们更喜欢称之为嵌套内部类。静态内部类与非静态内部类之间存在一个最大的区别,它是属于类本身,而不是某个对象

    public class TestInnerClass {
    	public static void main(String[] args) {
    		//创建静态内部类的实例
    		Person.Mobile pm = new Person.Mobile();
    		pm.show();
    	
    	}
    }
    
    class Person {
        
        //静态内部类
        static class Mobile{
        	public void show(){
        		System.out.println("这是静态内部类的方法");
        	}
        }
    	
    }
    

    五.内部类标识符

    由于每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息。您可能猜到了,内部类也必须生成一个.class文件以包含它们的Class对象信息。这些类文件的命名有严格的规则:外围类的名字,加上$,再加上内部类的名字。
    如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。

  • 相关阅读:
    C#基于Socket的简单聊天室实践
    进程及进程间通信
    一次千万级别的SQL查询简单优化体验
    Attribute和Property
    解析Resources.arsc
    数据挖掘十大算法之决策树详解(2)
    数据挖掘十大算法之决策树详解(1)
    线性回归浅谈(Linear Regression)
    贝叶斯推断及其互联网应用(三):拼写检查
    贝叶斯推断及其互联网应用(二):过滤垃圾邮件
  • 原文地址:https://www.cnblogs.com/dwlovelife/p/9919253.html
Copyright © 2011-2022 走看看