首页 > 其他 > 详细

(二十)内部类详解(转)

时间:2017-02-14 19:09:28      阅读:223      评论:0      收藏:0      [点我收藏+]

转自:http://www.cnblogs.com/dolphin0520/p/3811445.html

一.内部类基础

Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。

 

  1. 成员内部类

  成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Circle {
    double radius = 0;
     
    public Circle(double radius) {
        this.radius = radius;
    }
     
    class Draw {     //内部类
        public void drawSahpe() {
            System.out.println("drawshape");
        }
    }
}

这样看起来,类Draw像是类Circle的一个成员,Circle称为外部类。成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

  

package 封装类;



public class Outer {
	private String name; //外围类成员属性
	
	Outer(String name){  //构造器
		this.name=name;
	}
	
	public void aaa(){  //外围类成员方法
		System.out.println("im outer method");
	}
	
	public Outer getOuter(){
		System.out.println("getouter()");
		return Outer.this;   //外部类名+“.”+this 相当于外部类的对象引用
	}
	
	class Inner{   //内部类
		Inner(){
			System.out.println(name);  //内部类可以调用外部类的任何权限的成员 包括private
		}
	}
	
	public static void main(String[] args) {
		Outer out=new Outer("xiaoming");
		Outer.Inner in=out.new Inner();   // .new 可以创建内部类的对象 
		out=out.getOuter();
		
	}
}
结果:
xiaoming
getouter()

 

不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

1
2
外部类.this.成员变量
外部类.this.成员方法
public class Outer {
	 String name="zhangsan"; 
	
	 public void aaa(){
		 System.out.println("im outer aaa()");
	 }
	 
	class Inner{   
		String name="lisi";
		
		public void aaa(){
			System.out.println(name);
			System.out.println(Outer.this.name);
		}
	}
	
	public static void main(String[] args) {
		
		Outer out=new Outer();
		Outer.Inner in=out.new Inner();
		in.aaa();
		
	}
}
结果:
lisi
zhangsan

 

  • 虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲了。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问:
public class Outer {
	 String name="zhangsan"; 
	
	 public void aaa(){
		Inner in=new Inner();
		System.out.println(in.name);
		in.aaa();
	 }
	 
	class Inner{    //内部类
		String name="lisi";
		
		public void aaa(){
			System.out.println("im inner method");
		}
	}
	
	public static void main(String[] args) {
		
		Outer out=new Outer();
		out.aaa();
	}
}

 

(二十)内部类详解(转)

原文:http://www.cnblogs.com/shyroke/p/6398884.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!