什么是内部类:
Java支持在一个类中定义另一个类,这样的类称作内部类,而包含内部类的外部类称为内部类的外嵌类。这样做的目的是为了增强封装!!!!
内部类与外部类的联系:
- 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。
- 内部类的类体中不可以声明类的变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。
- 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象。
1、普通内部类
普通内部类,又称为成员内部类,在内部类类体中可以声明内部类的成员变量、构造方法、、实例方法。
public class Test
{
String name="李四";
//普通内部类
class inner{ //内部类开始
String name;
public inner(){
name="张三";
}
public void demo(){
System.out.println("这是普通内部类");
System.out.println("内部类变量=="+this.name);
//内部类调用外嵌类变量
System.out.println("外嵌类变量=="+Test.this.name);
}
} //内部类结束
public static void main(String[] args)
{
//创建外嵌类变量
Test m=new Test();
System.out.println("外部类变量=>"+m.name);
//创建内部类对象
inner i=m.new inner();
System.out.println("内部类变量=>"+i.name);
i.demo();
}
}
但是内部类类体中不能有staitc修饰的块、变量和方法!
2、静态内部类
静态内部类的类体中可以有成员变量、构造方法、实例方法、Static变量、Static块、Static方法。
public class Test
{
static String name="李四";
//静态内部类
static class inner{ static //内部类开始
String name;
static int age;
static {
age=4;
}
public inner(){
name="张三";
}
public void demo(){
System.out.println("这是普通内部普通方法");
System.out.println("内部类变量姓名=="+this.name);
System.out.println("内部类变量年龄=="+this.age);
/*
* 普通内部类调用外嵌类变量
System.out.println("外嵌类变量=="+Test.this.name);
*/
//静态内部类调用外嵌类变量
System.out.println("外嵌类变量=="+Test.name);
}
public static void demo2() {
System.out.println("这是普通内部类静态方法");
System.out.println("外嵌类变量姓名=="+Test.name);
System.out.println("内部类变量姓名2=="+name);
System.out.println("内部类变量年龄2=="+age);
}
} //内部类结束
public static void main(String[] args)
{
//创建外嵌类变量
Test m=new Test();
System.out.println("外部类变量=>"+m.name);
/*
* 静态内部类创建对象
inner i=m.new inner()
*/
//静态内部类创建对象
inner i=new inner();
System.out.println("内部类变量=>"+i.name);
i.demo2();
}
}
通过代码运行,得出以下结果:
- 在静态内部类的非静态方法中,调用内部类的变量,不需要static修饰(但是用static修饰了,内部类的非静态方法也可以调用);调用外嵌类的变量时,外嵌类的变量必须要用Static修饰,否则会报错。
- 在静态类的静态方法中,无论时调用内部类变量,还是外嵌类变量都要用Static修饰。
3、局部内部类
局域内部类是指定义在方法中的内部类。不能用Static修饰。
public class Test1
{
String name="张三";
int age=5;
public void demo(){
System.out.println("----外嵌类实例方法---------");
int heigh=18;
String name="李四";
class inner{ //内部类开始
String city="西红市";
String ph="123456";
public inner() {
System.out.println("这是局部内部类的构造函数");
System.out.println("外嵌类方法中的变量=="+heigh);
System.out.println("局部内部类变量=="+city);
System.out.println("外嵌类变量=="+name);
System.out.println("与内部类同名的外嵌类变量"+Test1.this.name);
}
public void indemo() {
System.out.println("这是局部内部类的实例方法");
System.out.println("外嵌类方法中的变量=="+heigh);
}
} //内部类结束
inner i=new inner();
i.indemo();
}
public static void main(String[] args)
{
Test1 t=new Test1();
t.demo();
}
}
通过代码运行,得出以下结果:
- 在局部内部类中直接可以访问外部类的所有成员。
- 局部内部类中不能定义 static 成员
- 局部内部类只在当前方法中有效,只能在实例方法中实例化。
4、匿名构造类
匿名构造类主要用对接口方法的重写。可以有效的减少代码量,提高效率。
interface Stu{
void speak();
}
class StuAaction{
public void turnOn(Stu stu)
{
stu.speak();
}
}
public class Test2
{
public static void main(String[] args)
{
StuAaction action=new StuAaction();
action.turnOn(new Stu() //和接口有关的匿名构造类
{ //匿名构造类开始
@Override
public void speak()
{
System.out.println("努力学习");
}
}); //匿名构造类结束
}
}