java中内部类详解

什么是内部类

顾名思义,内部类就是在类内部定义的类,也就是说在类的内部进行了其他类结构的嵌套操作
内部类的优点:
1.内部类可以和外部类很方便的进行访问对方私有域,和private的方法、属性的操作。
2.内部类时另一种封装,体现了保护性,内部类对于其他的外部类来说时隐藏的。
3.内部类实现弥补java的单继承局限。
缺点:
就像贵的东西除了贵没有缺点一样。内部类的缺点就是复杂。

内部类和外部类的关系

  1. 非静态的内部类时依赖于外部类对象实例对象的,没有外部类实例无法创建内部类。
    静态内部类无需依赖外部类对象实例,通过外部类类名即可创建。
  2. 内部类是独立于外部类的个体,与外部类不存在is-a关系。
  3. 内部类可以直接访问(外部类.this.成员(外部类.this可以省略))外部类成员,而外部类需要通过new 内部类,也就是内部类引用间接访问内部类成员。
class Outer{
    	private int a;
        	public class Inner{
        		        public void func(){
        		        	           		Outer.this.a =1;
        		        	            	         a =1;            
        		        	            	         System.out.println(a);
        		        	            	          }
        		        	           }	
	void func(){
	 	       new Inner().func();
	 	         }
}
public class Test{
	    public static void main(String[] args){ 
	    	       Outer outer = new Outer();
	    	       outer.func(); 
	    	       Outer.Inner inner = new Outer().new Inner();        //外部创建非静态内部类对象
	    	       inner.func();    
	    	     }
}

内部类的创建方法

在内部类定义所在的外部类中定义内部类对象,就和一般定义外部类一样new就好了。
在其他外部类中定义另外的一个外部类的内部类对象。
静态: 外部类.内部类 内部类引用 = new 外部类.内部类();
非静态:外部类.内部类 内部类引用 = new 外部类().内部类();
区别就在于静态直接通过类名定义,外非静态必须先创建外部类对象才可以创建内部类对象

内部类的分类

  1. 成员内部类 –类比普通方法
    成员内部类内部不能存在任何static变量或者方法,因为内部类以为外部类对象,而静态是不依赖对对象的。这一点矛盾导致内部类不可以有自己的静态成员,但是可以访问外部类中的静态成员。
  2. 静态内部类
    静态内部类是不依赖外部类对象,所以静态内部类是可以有自己的静态成员的。但是因为静态内部类不依赖于外部类对象,而外部类中的普通成员是依赖与外部类对象,所有内部类不可以访问,但是内部类因为可以创建自己的内部类对象,所以可以有自己的普通成员。
    注意注意:静态内部类就不类比静态成员方法类,因为方法无论是否静态都不能有自己的静态变量。
  3. 方法内部类
    方法内部类是局部内部类,这个类在方法内部不允许有自己权限修饰符。
    方法内部类对本方法外全部完全隐藏,除了创建这个类的方法外其他任何地方都不能访问
    这个方法中的内部类如果想要使用这个方法传过来的形参,形参必须定义为final。JDK8 隐式添加了final修饰符给形参。
class Outer{  
  	void fun(final int a){      
  		class Inner{           
     			private int b;
            		public int func(){       
                     		b = a;          
                          	return b;       
                          	}     
                 		}     
                System.out.println(new Inner().func());
                 }
}
public class Test{    
                            public static void main(String[] args){     
   	                                       Outer outer = new Outer(); 
                                                outer.fun(2);   
                                                  }
                            }
  1. 匿名内部类
    匿名内部类就是没有名字的方法内部类,特点和方法内部类基本一样。但是匿名内部类因为没有名字,也就没有构造方法,匿名内部类必须继承一个抽象类或者实现一个接口。
interface Inner {    
	void func();
	}
class Outer {    
	void fun(final int a) {        
		new Inner() {            
			private int b;
			public void func() {                
			b = a;                
			System.out.println(b);            
			}        
			}.func();    
		}
}
public class Test {    
public static void main(String[] args) {        
	Outer outer = new Outer();        
	outer.fun(2);    
	}
}
    原文作者:菜菜也逆袭
    原文地址: https://blog.csdn.net/weixin_40921797/article/details/83448601
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞