java内部类
总所周知,java内部类可以包括静态内部类,局部内部类,等等。从大的角度来说,一般分为普通内部类和局部内部类。
一般内部类是指直接在内部类中再编写一个类;局部内部类是指在一个类中的方法中编写的类的叫法。
package com.beyondTest1;
public class NestClassTest{
public static void main(String[] args) {
OuterClass.NestClass nc=new OuterClass().new NestClass();
nc.test();
new OuterClass().test1();
// OuterClass ocClass=new OuterClass();
// ocClass.test1();
}
}
class OuterClass {
int a=10;
private int c=20;
public void test(){
System.out.println(“外部的”);
}
class NestClass{
public void test(){
System.out.println(“普通内部类”);
}
}
public void test1(){
class NestClass1{
public void test() {
System.out.println(“局部内部类”);
}
}
}
}
由上可以看出一般内部类和局部内部类的使用区别,一个在作为类的普通成员变量,一个作为类方法内部的成员。
在使用上,普通内部类可以直接调用类内部的任意修饰符修饰的方法或变量,是平级关系;
可以看出,即使是变量的修饰符是private的,内部类依然可以直接调用并且输出。
内部类的作用是为所属的外部类服务。
一般内部类的修饰符是private,偶尔是static。当修饰符是private时,其他类(非内部类的外部类)要使用这个内部类只能使用特定的方式:
外部类名称.内部类名称 内部类对象名称= new 外部类名称().new 内部类名称();
在外部类的非静态方法中访问内部类:Inner in = new Inner();
在外部类的静态方法中访问内部类:Outer.Inner in = new Outer().new Inner();
在外部其他类中访问内部类:Outer.Inner in = new Outer().new Inner();
当内部类被static修饰后,就只能访问外部类中的static成员,出现访问局限
class Outer {
private int x = 1;
static class Inner {
public void seeOuter() {
System.out.println(x); //error
}
}
}
这是因为static在类创建的时候就被初始化,因而不能够访问非静态的属性;有种说法叫,static不能访问非static,非static既可以访问非static,也可以访问static,这是由它在类中的生命周期决定的。
方法内部类的修饰符
与成员内部类不同,方法内部类更像一个局部变量
可以用于修饰方法内部类的只有final和abstract
静态方法内的方法内部类
静态方法是没有this引用的,因此在静态方法内的内部类遭受同样的待遇,即:只能访问外部类的静态成员
匿名内部类就是内部类的简写格式
定义匿名内部类的前提:内部类必须继承一个类或实现接口
匿名内部类就是一个匿名子类对象
格式:new 父类或者接口(){定义子类的内容}
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
匿名内部类
如果不使用匿名内部类的话,一般可以使用多态的向上转型来访问。
说到这里内部类的意义到底是什么呢,通过对内部类的使用可以看出我们一般在内部类中访问外部类的成员变量和方法,然后在其他类中访问这些属性和方法,因此内部类的意义就是方便我们能够方便地使用这些类中的属性而不用通过再创建实现类,减轻了内存的压力。
搜索了一下内部类的好处,得到的回答是:
1.一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。因为当接口中
最重要的我认为是:可以内部类定义在外部类不可访问的属性。这样就在外部类中实现了比外部类private还要小的访问权限。