java 内部类复习

内部类

  1. 类中定义的类,内部类依赖于外部类而存在。
  2. 创建内部类对象是,会隐式的把其外部类对象的引用传给内部类并保存,这样,内部类对象始终都可以访问外部类对象。
  3. 如果内部类声明为静态类,那么内部类就不能随便访问外部类的成员变量,仍然只能访问外部类的静态成员变量。
  4. 外部类只能使用public和缺省的包访问权限修饰类,而内部类可以使用public,protected,private访问权限来修饰类。

内部类分类

成员内部类,方法内部类,匿名内部类,静态内部类。
成员内部类 :作为外部类的一个成员存在,与外部类的属性,方法并列。

成员内部类,直接定义在类中。就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
class Outer { 
    public static void main(String[] args) { 
        Outer outer = new Outer(); 
        Outer.Inner inner = outer.new Inner(); //创建成员内部类的对象,左边的Outer可以不要
        inner.print("调用内部类的方法");
    } 
    public class Inner { 
        public void print(String str) { 
            System.out.println(str); 
        } 
    } 
} 

局部内部类,是指内部类定义在方法和作用域内。

局部内部类只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。

class Outer { 
	public In play(){
		class Inner extends In{ 
	        public void print(String str) { 
	            System.out.println(str); 
	        } 
	    } 
		return new Inner();
	}
    public static void main(String[] args) { 
        Outer outer = new Outer(); 
        In inner = outer.play(); //创建指向局部内部类的基类对象引用,只有这样才可以在局部内部类的作用于外使用局部内部类
        inner.print("调用内部类的方法");
    } 
    
} 
class In{
	public void print(String str)
	 {
	  
    } 
}
与成员内部类定义的唯一区别是前面加了一个static的修饰符。

静态内部类,不需要内部类对象和外部类对象之间的联系。

class Outer { 
	  static class Inner{ 
		  static class In{
			  
		  }
        public void print(String str) { 
            System.out.println(str); 
        } 
    } 
    public static void main(String[] args) { 
        Outer.Inner inner = new Outer.Inner(); //创建静态内部类的对象
        inner.print("调用内部类的方法");
    } 
    
} 


有时候我为了免去给内部类命名,便倾向于使用匿名内部类,因为它没有名字。

匿名内部类是不能加访问修饰符的。即它的访问权限修饰符只能是friendly(默认的)。

class Outer { 
	public Inner getInner(final int i,int j) { 
        return new Inner(){ 
        	int k;
        	{
        		k=i;//如果是k=j,会报错
        		
        	}
        }; 
    } 
    public static void main(String[] args) { 
        Outer outer = new Outer(); 
        Inner inner = outer.getInner(2014,11); //创建指向匿名内部类的父类对象引用
    } 
    public class Inner { 
        public void print(String str) { 
            System.out.println(str); 
        } 
    } 
} 

发布了289 篇原创文章 · 获赞 112 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/king9666/article/details/103716009
今日推荐