04. 内部类
1、类的五大成员
属性、构造方法、一般方法、块、内部类
这篇主要描写内部类。
下面代码演示类的结构:
package com.company.project.test.t41;
import java.sql.Struct;
import org.omg.CORBA.PUBLIC_MEMBER;
public class Demo {
//1属性
String name;
//2.构造方法
public Demo() {
}
//3.方法
public void funOuter1() {
System.out.println("外部类方法");
}
//4.块
{
}
//5.内部类
//5.1成员内部类
class Inner{
public void fun1() {
name = "";
funOuter1();
}
}
//5.2静态内部类
static class StaticClass{
}
//5.3匿名内部类
//通过接口创建匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
};
//通过类创建匿名内部类
Thread thread = new Thread() {
public void run() {
}
};
//5.4局部内部类
public void funOuter2() {
//作用范围仅限于所属方法,
class A{
}
A a = new A();
}
}
2、内部类
内部类分为4种:成员内部类、静态内部类、匿名内部类、局部内部类。
特点:可以共享外部类的成员(属性,方法)
2.1 成员内部类
public class Demo {
//1属性
String name;
//3.方法
public void funOuter1() {
System.out.println("外部类方法");
}
//5.内部类
//5.1 成员内部类
class Inner{
public void fun1() {
name = "";
funOuter1();
}
}
}
特点:要使用成员内部类的对象,外部类的对象必须存在。
实例化:
package com.company.project.test.t41;
public class Client {
public static void main(String[] args) {
//内部类的实例化
//5.1成员内部类
Demo.Inner inner = new Demo().new Inner();
}
2.2 静态内部类
public class Demo {
//1属性
String name;
//3.方法
public void funOuter1() {
System.out.println("外部类方法");
}
//5.内部类
//5.2静态内部类
static class StaticClass{
}
}
特点:静态内部类,把外部类当作特殊的包使用,所以实例化时new 后面的Demo不需要小括号(和成员内部类区别)。
实例化:
package com.company.project.test.t41;
public class Client {
public static void main(String[] args) {
//内部类的实例化
//5.2静态内部类的实例化
//静态内部类,把外部类当作特殊的包使用
Demo.StaticClass staticClass = new Demo.StaticClass();
}
}
2.3 匿名内部类
分为两种:通过接口创建和类创建。
特点:简化了一些临时使用的类,小,方便,属于临时变量类。
创建和实例化在一起。
public class Demo {
//1属性
String name;
//3.方法
public void funOuter1() {
System.out.println("外部类方法");
}
//5.内部类
//5.3匿名内部类
//通过接口创建匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
};
//通过类创建匿名内部类
Thread thread = new Thread() {
public void run() {
}
};
}
2.4 局部内部类
特点:可以在方法中定义,并实例化,但使用地方仅局限在此方法中。
public class Demo {
//1属性
String name;
//3.方法
public void funOuter1() {
System.out.println("外部类方法");
}
//5.内部类
//5.4局部内部类
public void funOuter2() {
//作用范围仅限于所属方法,
class A{
}
A a = new A();
}
}