java内部类
在java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类,匿名内部类和静态内部类。
一、成员内部类
成员内部类是最普通的内部类,它的定义为位于另一个类的内部。形如下面的形式。
class Circle{
double radius=0;
public Circle(double radius){
this.radius=radius;
}
class Draw(){
public void drawShape(){ //内部类
System.out.println("drawshape");
}
}
}
这样看起来,类Draw像是Circle的一个成员,Circle称为外部类。成员内部类可以无条件的访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
class Circle(){
private double radius=0;
public static int count=1;
public Circle(double radius){
this.radius=radius;
}
class Draw(){
public void drawShape(){
System.out.println(radius); //外部类的private成员
System.out.println(count); //外部类的静态成员
}
}
}
不过注意的是,当成员内部类拥有和外部类同名的成员变量或者方法的时候,会发生隐藏现象,即莫i人情况下访问的成员内部类的成员。如果访问外部类的同名成员,需要以下面的形式进行访问。
外部类。this.成员变量
外部类.this.成员方法
虽然成员内部类可以无条件的访问外部类成员,而外部类想访问成员内部类的成员却不是随心所欲的。在外部类中如果想要访问成员内部类的成员,必须先创建一个成员内部类的对象,在通过指向这个对象的引用来访问。
public class Test{
public static void main(String[]args){
//第一种方式
Outter outter=new Outter();
Outter.Inner inner1=outter.new Inner(); //必须通过Outter对象来创建
//第二种方式:
Outter.Inner inner2=outter.getInnerInstance();//该方式是在外部类中实现一个创建内部类对象的方法。然后返回。
}
class Outter(){
private Inner inner=null;
public Outter(){
}
public Inner getInnerInstance(){
if(inner=null){
inner=new Inner();
}
return inner;
}
class Inner(){
public Inner(){
}
}
}
}
内部类可以拥有private访问权限,protected访问权限,public访问权限。如果成员内部类Inner用private修饰,则只能在外部类的内部访问。则只能使用第二种方式访问内部类。如果成员内部类Inner是public修饰,则任何地方都可以访问。如果用protected修饰。则只能在同一个包下胡哦这继承外部类的情况下访问。
二、局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问权限仅限于方法内或者该作用域内。
public class test4{
class Peole(){
public People(){}
}
class Man(){
public Man(){}
}
//在外部类的方法中声明一个内部类。
public People getWoman(){
class Woman extends People{ //局部内部类
int age=0;
}
return new Woman();
}
}
注意:局部内部类就像是方法里面的一个局部变量一样,是不能有public、private、protected的以及static修饰符的。
三、匿名内部类
匿名内部类应该是平时我们编写代码使用最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。
匿名类就是利用父类的构造函数和自身类体构造成一个类。
格式:new 父类(){子类内容};“父类”是子类需要继承或者实现外部的类或者接口。
- 匿名类可以继承父类的方法,也可以重写父类的方法。
- 匿名类可以访问外部类的成员变量和方法,匿名类的类体不可以声明成static成员变量和static方法。
- 匿名类由于是一个new的结果,所以其实可以赋值给一个父类对象。
class Outer{
void show() {
System.out.println("run in Outer");
}
}
public class Demo {
public static void main(String args[]) {
Outer ot=new Outer(){
void show() {
System.out.println("run in Inner");
}
};
ot.show();//run in Inner
}
}
四、静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需依赖于外部类的,这点和静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
public class Test{
public static void main(String[] args){
Outter.Inner.inner=new Outter.Inner();
}
class Outter{
public Outter(){}
}
static class Inner{
public Inner(){}
}
}