内部类
1. 类的组成:属性、方法、构造器、代码块(普通块、静态块、构造块、同步块)、内部类。
public class TestOuter {
//属性
int age;
//方法
public void a(){
{
System.out.println("普通代码块");
}
}
//代码块
{
System.out.println("构造块");
}
static{
System.out.println("静态代码块");
}
//构造器
public TestOuter(){
}
public TestOuter(int age) {
this.age = age;
}
//内部类
}
2.内部类:成员内部类 局部内部类
内部类:一个类内部的类
局部内部类:方法内、块内、构造器内
//方法
public void a(){
//代码块
{
System.out.println("普通代码块");
//代码块内的内部类
class B{
}
}
//方法内的内部类
class A{
}
}
//构造器
public TestOuter(){
//构造器的内部类
class C{
}
}
成员内部类:静态成员内部类 非静态成员内部类
//成员内部类:
class D{
}
//静态成员内部类
static class E{
}
1.成员内部类
- 成员内部类的组成:属性 、方法、构造器、类(出现套娃)等
- 修饰符:private, default ,protected ,public, static, final,static
- 内部类可以访问外部类的内容
//内部类(成员内部类 局部内部类)
//局部内部类见上
//成员内部类:
class D{
String name;
public void method(){
//内部类可以访问外部类的内容
a();
System.out.println(age);
}
}
- 静态内部类只能访问外部类static修饰的内容
//静态成员内部类
static class E{
//静态内部类只能访问外部类static修饰的内容
}
- 外部类访问内部类:需要创建对象
//外部类访问内部类:需要创建对象
D d = new D();
System.out.println(d.name);
d.method();
- 内部类和外部类属性重名时,如何进行调用:
//属性
int age = 10;
//成员内部类:
class D{
int age = 20;
String name;
public void method(){
/*//内部类可以访问外部类的内容
a();
System.out.println(age);*/
int age = 30;
//内部类和外部类属性重名时,如何进行调用:
System.out.println(age);//30
System.out.println(this.age);//20
System.out.println(TestOuter.this.age);//10
}
}
class Demo{
public static void main(String[] args) {
TestOuter to = new TestOuter();
to.a();
}
}
- 创建对象:
创建外部类对象
TestOuter to = new TestOuter();
to.a();
创建内部类对象(静态、非静态)
//创建内部类对象
//静态成员内部类对象的创建:
TestOuter.E e = new TestOuter.E();
//非静态成员内部类对象的创建
//错误:TestOuter.D d = new TestOuter.D();
TestOuter t = new TestOuter();
TestOuter.D d = t.new D();
public class TestOuter {
//属性
int age = 10;
//方法
public void a(){
//代码块
{
System.out.println("普通代码块");
class B{ //代码块内的内部类
}
}
//方法内的内部类
class A{
}
//外部类访问内部类:需要创建对象
D d = new D();
System.out.println(d.name);
d.method();
}
//代码块
{
System.out.println("构造块");
}
static{
System.out.println("静态代码块");
}
//构造器
public TestOuter(){
//构造器的内部类
class C{
}
}
public TestOuter(int age) {
this.age = age;
}
//内部类(成员内部类 局部内部类)
//局部内部类见上
//成员内部类:
class D{
int age = 20;
String name;
public void method(){
/*//内部类可以访问外部类的内容
a();
System.out.println(age);*/
int age = 30;
//内部类和外部类属性重名时,如何进行调用:
System.out.println(age);//30
System.out.println(this.age);//20
System.out.println(TestOuter.this.age);//10
}
}
//静态成员内部类
static class E{
//静态内部类只能访问外部类static修饰的内容
}
}
class Demo{
public static void main(String[] args) {
//创建外部类对象
TestOuter to = new TestOuter();
to.a();
//创建内部类对象
//静态成员内部类对象的创建:
TestOuter.E e = new TestOuter.E();
//非静态成员内部类对象的创建
//错误:TestOuter.D d = new TestOuter.D();
TestOuter t = new TestOuter();
TestOuter.D d = t.new D();
}
}
2.局部内部类
- 在局部内部类中访问的变量必须是被final修饰
https://www.cnblogs.com/deltadeblog/p/11297717.html - 匿名内部类
相关代码:
public class TestOuter {
public void method(){
final int num = 10;
class A{
public void a(){
// num = 20; 不可以修改
System.out.println(num);
}
}
}
public Comparable method2(){
class B implements Comparable{
@Override
public int compareTo(Object o) {
return 100;
}
}
return new B();
}
public Comparable method3(){
//匿名内部类
return new Comparable() {
@Override
public int compareTo(Object o) {
return 200;
}
};
}
public void test(){
Comparable com = new Comparable() {
@Override
public int compareTo(Object o) {
return 200;
}
};
System.out.println(com.compareTo("abc"));
}
}