//外部类
public class Outter {
//1、成员内部类
class A{}
//2、静态内部类
static class B{}
public void method(){
//3、局部内部类
class C{}
}
}
public interface I1 {
//4、接口内部类
class D{}
}
1)成员内部类
知识点:成员内部类
特点:
1.创建成员内部类对象之前,必须先创建外部类对象
2.成员内部类可以调用外部类所有的属性
//创建成员内部类的对象
Inner inner = new Outter().new Inner();//1.创建成员内部类对象之前,必须先创建外部类对象new Outter()
inner.innerMethod();
//外部类
public class Outter {
private String attr1 = "属性1";
String attr2 = "属性2";//默认
protected String attr3 = "属性3";
public String attr4 = "属性4";
final String attr5 = "属性5";
static String attr6 = "属性6";
static final String attr7 = "属性7";
//成员内部类
class Inner{
String attr1 = "成员内部类属性";
public void innerMethod(){
System.out.println("成员内部类的方法");
System.out.println(attr1);//就近原则,调用的是成员内部类的属性:attr1 = "成员内部类属性"
System.out.println(Outter.this.attr1);//避开就近原则,调用的是外部类的属性:attr1 = "属性1"
System.out.println(attr2);//Outter.this.attr2
System.out.println(attr3);//Outter.this.attr3
System.out.println(attr4);//Outter.this.attr4
System.out.println(attr5);//Outter.this.attr5
System.out.println(attr6);//Outter.attr6,静态属性用类名调用
System.out.println(attr7);//Outter.attr7
}
}
2)静态内部类
知识点:静态内部类
特点:
1.创建静态内部类对象之前,不用创建外部类对象
//创建静态内部类的对象 Inner inner = new Outter.Inner();
2.静态内部类只能调用外部类的静态属性,
//外部类
public class Outter {
static String attr1 = "属性1";
static final String attr2 = "属性2";
//静态内部类
static class Inner{
public void innerMethod(){
System.out.println("静态内部类的方法");
System.out.println(attr1);//Outter.attr1
System.out.println(attr2);//Outter.attr2
}
}
3)接口内部类
知识点:接口内部类
特点:
1.接口内部类类似于静态内部类 -- 创建对象的方式是一样的
//创建接口内部类的对象 Inner inner = new Outter.Inner();
2.接口内部类,系统默认使用public static修饰(接口内部类不能用private修饰了,而静态内部类可以用private修饰)
public interface Outter {
//默认使用public static修饰
class Inner{
public void innerMethod(){
System.out.println("接口内部类");
}
}
4)局部内部类
知识点:局部内部类
特点:
1.方法以外不访问该类:局部内部类类似于方法里面局部变量,作用域在这个方法里面。所以局部内部类的特点是外界方法以外不能访问该类。所以外面不能创建对象
2.局部内部类使用到外部类的局部变量时,JDK1.8开始该变量会自动变成常量,JDK1.8之前需要手动加上final
public class Outter {
public void outterMethod(){
//局部内部类
class Inner{
public void innerMethod(){
System.out.println("局部内部类");
}
}
//创建局部内部类对象
Inner inner = new Inner();
inner.innerMethod();
}
public class Outter {
public Object outterMethod(){
//num在Inner里使用到,该变量会自动变成常量,因为Java会考虑到该变量会在其他地方使用到,如果变量不变成常量,方法结束后会被回收
int num = 100; //num是局部变量,因为是外部类的outterMethod()方法里面的变量
//局部内部类(在方法里面)
class Inner{
@Override
public String toString() {
return "局部内部类:" + num;
}
}
//创建局部内部类对象
Inner inner = new Inner();
return inner;
}
5)匿名内部类
1、匿名内部类——类 步骤:
1.底层创建匿名子类,继承A类,重写method方法
2.创建匿名子类的对象
3.把匿名子类的对象地址 赋值给父类的引用(多态)
A a = new A() {
@Override
public void method() {
// TODO Auto-generated method stub
}
};
2、匿名内部类——接口 步骤:
1.底层创建匿名类,实现I1接口,重写method方法
2.创建匿名类的对象
3.把匿名类的对象地址赋 值给接口的引用(多态)
I1 i1 = new I1() {
@Override
public void method() {
// TODO Auto-generated method stub
}
};
标签:内部,System,接口,匿名,Inner,println,Outter,public From: https://blog.csdn.net/m0_70135515/article/details/137222006