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

    1、一个类放到另一个类的内部来定义,称为内部类

    2、包含内部类的类,称为外部类

    3、内部类实现了更好的封装,可以把内部类隐藏在外部类内部,不允许其他类访问该类

    4、内部类被当成外部类的成员,因此可以直接访问外部类的私有数据,但外部类不可以访问内部类的实现细节,例如内部类的成员变量

    5、匿名内部类适合创建仅使用一次的的类

    6、内部类比外部类可以多使用单个修饰符:private 、protected、static,外部类不可以使用这三种修饰符

    7、非静态内部类不可以定义静态成员

    8、定义内部类只需要把类定义在另一个类的任意外置,包括方法内(定义在方法内的内部类称为局部内部类)

    9、大部分时候,内部类被作为成员内部类来定义,而不是局部内部类

    10、成员内部类是与成员变量、方法、构造器、初始化块相似的类成员

    11、局部内部类、匿名类不是类成员

    12、成员内部类分两种:静态内部类、非静态内部类

    13、内部类作为外部类的成员,可以使用任意访问修饰符

    14、外部类的上一级程序单元是包,所以它只有两个作用域:本包内和任何位置,即省略修饰符和 public 修饰符

    15、内部类的上一级程序单元是外部类,因此具有四个作用域:同一个类(private),同一个包(省略),父子类(protected),任何位置(public),因此可以使用这四种访问控制权限

    16、内部类编译之后的文件命名样式:外部类名$内部类名.class

    定义一个内部类,代码示例:

    public class Person{
    	private double weight;
    	public Person(double weight){
    		this.weight=weight;
    	}
    	
    	private class PersonData{
    		private String name;
    		private String gender;
    		public 	PersonData(String name,String gender){
    			this.name=name;
    			this.gender=gender;
    		}
    
    		public void info(){
    			System.out.println("这个人名字是:"+name);
    			System.out.println("这个人性别是:"+gender);
    			//-访问外部类的变量
    			System.out.println("这个人体重是:"+weight);
    		}
    	}
    
    	private void test(){
    		//-获取内部类的实例对象
    		PersonData pd=new PersonData("张三","男");
    		//-调用内部类方法
    		pd.info();
    	}
    
    	public static void main(String[] args){
    		Person p=new Person(75.5);
    		p.test();
    	}
    }
    

    编译生成的文件:

    运行效果:

    17、如果外部类与内部类成员变量同名,或与内部类局部变量同名,通过this. 、外部类名.this.来区分,代码示例:

    public class Person{
    	private String str="外部类成员变量str";
    	
    	private class PersonData{
    		private String str="内部类成员变量str";
    		public void info(){
    			String str="局部变量str";
    			//-访问局部变量
    			System.out.println(str);
    			//-访问内部类成员变量
    			System.out.println(this.str);
    			//-访问外部类成员变量
    			System.out.println(Person.this.str);
    		}
    	}
    
    	private void test(){
    		PersonData pd=new PersonData();
    		pd.info();
    	}
    
    	public static void main(String[] args){
    		Person p=new Person();
    		p.test();
    	}
    }
    

     运行结果:

    18、外部类不能访问非静态类内部成员,若要访问,需要通过获取非静态内部类实例对象来获取内部类成员,因为创建外部类对象时,非静态内部类、非静态内部类成员可能还不存在,所以获取内部类成员必须先获取内部类实例对象

    19、外部类静态方法、静态初始化块不能访问非静态内部类

    20、Java不允许在非静态内部类中定义静态成员,但可以包括非静态初始化块,与外部类规则相同

  • 相关阅读:
    IIS是如何处理ASP.NET请求的
    数据库访问性能优化
    通信交互总结
    数据库集群技术漫谈
    VS2010中出现无法嵌入互操作类型
    正则表达式-更新版
    IIS部署SSL证书后提示不可信的解决方案
    CSS水平居中和垂直居中解决方案
    jQuery get/post区别及contentType取值
    配置Tomcat使用https协议
  • 原文地址:https://www.cnblogs.com/baby-zhude/p/8279038.html
Copyright © 2011-2022 走看看