package InnerClass;
/**
* 定义变量和方法:自内至外的就近约束
* 访问变量和方法:由外至内的就近约束
* BaseStudent1:内部类变量或方法与外部类变量或方法重名时,默认会使用内部类的变量或方法。如果想用外部类的变量或方法则需要用BaseStudent.this.变量名
*/
public class BaseStudent {
private String name1;
private static String name2;
public void getStudent1() {
new BaseStudent1();//在实例方法中,实例成员内部类可以直接new用
new BaseStudent.BaseStudent2();//静态成员内部类直接new
}
public static void getStudent2() {
new BaseStudent().new BaseStudent1();//在类方法中,实例成员内部类得先new外部内,然后new内部成员非static类
new BaseStudent2();//在类方法中,类成员内部类直接new用
}
/**
* 一.成员非static内部类
*实例变量:可以被实例访问
*定义:只可以定义实例变量和方法
*访问:可以访问实例和类对应的变量和方法
*/
public class BaseStudent1{
public final static int age1 = 20;//定义字面常量除外,因为是在编译时处理
public Integer age2;
final Integer age3 = 20;
private String name1;
public void getStudent() {
System.out.println(age1+age2+BaseStudent.this.name1+name2);
BaseStudent.this.getStudent1();
}
public void getStudent1() {}
}
/**
* 二.成员static内部类
*类变量:可以被类和实例访问
*定义:可以定义类和实例变量以及方法
*/
public static class BaseStudent2{
public final static int age1 = 20;//定义字面常量除外,因为是在编译时处理
public static int age2;
public int age3;
/**访问:
* 1.对该类的变量和方法,受到声明此方法约束
* 2.对外部类的变量和方法,受到声明此类的约束
*/
public void getStudent1() {
System.out.println(age2+age3+name2);
}
public static void getStudent2() {
System.out.println(age2+name2);
}
}
public void getStudent3() {
String tel1;//jdk8则没有final约束
final String tel2;//jdk7必须这样声明才可以访问
/**
*三.局部内部类
*1.局部变量:
*2.定义:内部类的定义受到局部变量的约束,内部类中的成员变量和方法的定义则受内部类的约束
*3.访问: 外部类成员变量和方法的访问受到getStudent()的约束,对getStudent()局部变量访问在jdk7中得声明为final,jdk8则没有这个约束
*/
class BaseStudent3{
protected final static int age1 = 20;//定义字面常量除外,因为是在编译时处理
public int age2;
private final int age3 = 20;
public void getStudent() {
System.out.println(age1+age2+name1+name2);
}
}
}
}
inner总结
最新推荐文章于 2019-11-25 13:26:13 发布