Java内部类分为 静态内部类 和非静态内部类,局部内部类,匿名内部类。这里只分析前三种。
非静态内部类:
1.在内部类中,访问自己定义的属性,可以直接访问,也可以通过this.属性名访问:
public class Outer{
class Inner{
private String name="张三";
public void showtName(){
system.out.println(name);
system.out.println(this.name);
}
}
}
2.内部类,可以访问外部类的所有成员,包含private修饰的属性成员
public class Outer{
private String name="李四";
class Inner{
public void getOuterName(){
system.out.println(name);
}
}
}
3.外部成员属性,和内部成员属性 定义的一样时,可以用 外部类名.this.属性名 来访问外部成员, 用this.属性名 访问内部成员;
public class Outer{
private int age=18;
class Inner{
private int age =28;
public void dispalyAge(){
system.out.println(this.age);//---------28
system.out.println(Outer.this.age)//-------18
}
}
}
4.外部类的方法里,调用内部类,需要在该方法里先实例化内部类,获得内部类对象,对象.方法;
public class Outer{
private String name="张三";
public void getInnerMoth(){
Inner in=new Inner();
in.showName();
}
class Inner{
public void showName(){
system.out.println(name);
}
}
}
5.通过外部的静态main方法 实例化内部类,实例化内部类 必须先实例化外部类;
public class Outer{
private String name="张三";
class Inner{
public void showName(){
system.out.println(name);
}
}
public static void main(String args[]){
Outer ou=new Outer();
Outer.Inner in=ou.new Inner();
// Outer.Inner in= new Outer().new Inner();
in.showName();
}
}
局部内部类:
1.声明 的方式
public class Outer{
private String name="张三";
public void getInnerMoth(){
class Inner{ }
}
}
}
2.当局部类的成员属性,方法里的参数,外部类的成员属性 同名。参数可直接访问,局部类成员属性用this.属性名,外部类成员属性用 外部类名.this.成员属性;public class Outer{
private String name="张三";
public void getInnerMoth(){
class Inner{
private String name="李四";
public void getNames(String name){
system.out.println(name);//参数 name
system.out.println(this.name);//李四
system.out.println(Outer.this.name);//张三
}
}
}
}
}
3.局部内部类 访问他所在的外部方法的参数时(局部变量),此参数必须用final修饰,否侧不能访问;public class Outer{
public void getInnerMoth(final int age){
int ages;
class Inner{
public void getNames(){
system.out.println(age);//能访问
system.out.println(ages);//报错
}
}
}
}
}
4.局部内部类中不能定义静态属性 即 属性不能用static修饰;
5. 和非静态内部类一样,内部类的实例化 必须先实例化 外部类
public class Outer{
public void getInnerMoth(final int age){
int ages;
class Inner{
Inner(int age){
getNames();
}
public void getNames(){
system.out.println(age); //10
}
}
new Inner(age);
}
public static void main (String args[]){
Outer o=new Outer();
o.getInnerMoth(10);
}
}
静态内部类
1.用 static 修饰的内部类叫做 静态内部类,如果一个静态内部类用static修饰,这个类就相当于是从外部定义的类, 因此 static内部类 可以声明 staic 成员和非static 成员。
public class Outer{
static class Inne{
static int age=20;
int age=10;
}
public static void main(String args[]){
Outer.Inner in=new Outer.Inner();
Inner n=new Inner();
//static内部类 实例化 不需要外部类创建
}
}
2.静态内部类 只能访问 外部类的静态属性 或静态方法 ,可以访问 内部类的静态成员和非静态成员, 因为默认 静态内部类的内部都是静态的。