l将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。
l访问特点:
•内部类可以直接访问外部类中的成员,包括私有成员。
•而外部类要访问内部类中的成员必须要建立内部类的对象。
内部类的位置
l内部类定义在成员位置上
•可以被private static成员修饰符修饰。
•被static修饰的内部类只能访问外部类中的静态成员。
l内部类定义在局部位置上
•也可以直接访问外部类中的成员。
•同时可以访问所在局部中的局部变量,但必须是被final修饰的。
package com.test1;
/*
内部类:
将类定义在另一个类的内部,内部类的就称为内部类。
访问方式:
内部类可以直接访问外部类中的成员。
外部类要访问内部类中的成员,必须要创建内部类中的对象。
*/
class Outer
{
private int num = 3;
static int num2 = 7;
//内部类:定义在成员位置上,它就相当于外部类的成员一样,可以被成员修饰符所修饰。
public class Inner
{
void show()
{
System.out.println("show num="+num);
}
}
static class Inner2
{
void show2()
{
System.out.println("show2 num2="+num2);
}
}
static class Inner3//当内部类中定义了静态成员,该内部类必须被静态修饰。
{
static void show3()
{
System.out.println("show3 num2="+num2);
}
}
void method()
{
Inner in = new Inner();
in.show();
}
}
class InnerDemo
{
public static void main(String[] args)
{
/*
直接访问内部类成员的方式。
*/
//1,对非静态的内部类中的非静态成员访问。
Outer.Inner in = new Outer().new Inner();
in.show();
//2,访问静态内部类中的非静态成员。
// Outer.Inner2 in = new Outer.Inner2();
// in.show2();
//3,访问静态内部类中的静态成员。
// Outer.Inner3.show3();
// Outer out = new Outer();
// out.method();
}
}
package com.test2;
/*
非静态的内部类之所以能直接访问外部类成员的原因是:它持有了一个外部类对象的引用。外部类名.this
*/
class Outer
{
private int num = 2;
class Inner
{
private int num = 3;
void show()
{
int num = 4;
System.out.println("num="+num);
System.out.println("num="+this.num+Inner.this.num);
System.out.println("num="+Outer.this.num);
}
}
void method()
{
new Inner().show();
}
}
class InnerDemo2
{
public static void main(String[] args)
{
new Outer().method();
}
}
class Outer
{
private int num = 3;
void method()
{
final int x = 7;//内部类定义在局部中,只能访问被final修饰的局部变量。
// 不被final修饰的局部变量生命周期随着方法的释放而释放。
class Inner//定义在局部的内部类。
{
void show()
{
System.out.println("x="+x);
// System.out.println("num="+num);
}
}
new Inner().show();
}
}
class InnerDemo3
{
public static void main(String[] args)
{
// new Outer().method();
Outer2 out = new Outer2();
out.method();
System.out.println(out.obj.toString());
}
}
class Outer2
{
private int num = 4;
Object obj ;
public void method()
{
final int x = 4;
class Inner
{
/*
覆盖了Object类中的toString方法。
*/
public String toString()
{
return "hahah"+x;
}
}
this.obj = new Inner();
}
}
class Demo1
{
int num = 4;
class Demo2
{
}
}