目录
1)在实例内部类方法中访问同名的成员时,优先访问自己的(就近原则)
1.1.4 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象
1.1.5 实例内部类也受public、private等访问限定符的约束
1.2.4 外部类中,不能直接访问静态内部类中的成员,如果要访问必须先要创建内部类的对象
1.2.5 实例内部类也受public、private等访问限定符的约束
final定义常量
final - 定义常量
常量是在程序编译的时候确定的,一旦初始化,就不能进行修改了,只能初始化一次。
一般定义常量使用 static final ,static 表示只有一份,final表示是常量,不能被修改。
1. 内部类
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服 务,那么整个内部的完整结构最好使用内部类。内部类也是封装的一种体现。
分类:
- 实例内部类(又叫构造内部类、非静态内部类)
- 静态内部类
- 局部内部类
- 匿名内部类
1.1 实例内部类
1.1.1 如何获取实例内部类的对象
先对外部类进行实例化,再对实例内部类进行实例化
1.1.2 实例内部类中不能有静态的成员变量
非要定义,只能是被 static final 修饰的常量。
(1)因为静态成员变量在外部类(OuterClass)加载时就会被执行,而InnerClass实例化需要外部类对象的引用(outerClass),要先有外部类对象。静态成员会先于InnerClass执行,所以静态的成员变量不能在实例内部类中。
(2)在static后加上final并且赋值了,就不报错可以运行了。因为加上final再赋值,此代码就相当于一个常量,常量在编译时就确定了它的值
1.1.3 实例内部类方法中可以直接访问外部类中的任何成员
1)在实例内部类方法中访问同名的成员时,优先访问自己的(就近原则)
2)如果非要访问外部类同名的成员,该怎么办呢?
法一:在实例内部类方法中实例化外部类对象,用 外部类对象的引用.同名成员 来访问
法二:在实例内部类方法中,拿到外部类的this(外部类对象的引用)用 外部类名称.this.同名成员 来访问
1.1.4 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象
1.1.5 实例内部类也受public、private等访问限定符的约束
1.1.6 代码
//实例内部类
class OuterClass{
public int data1 = 1;
int data2 = 2;
public static int data3 = 3;
public void test(){
System.out.println("OutClass:test()");
// System.out.println(data4); error
InnerClass innerClass = new InnerClass();
System.out.println(innerClass.data4);
}
class InnerClass{
public int data1 = 111;
public int data4 = 4;
int data5 = 5;
public static final int data6 = 6;
public void func(){
System.out.println("InnerClass:func()");
System.out.println(data1);
System.out.println(OuterClass.this.data1);
/* OuterClass outerClass = new OuterClass();
System.out.println(outerClass.data1);*/ //也可以
System.out.println(data2);
System.out.println(data3);
System.out.println(data4);
System.out.println(data5);
System.out.println(data6);
}
}
}
public class Test {
public static void main(String[] args) {
//OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass(); 也可以
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.func();
}
}
1.2 静态内部类
1.2.1 如何获取静态内部类的对象
不需要先创建外部类对象,就能获取静态内部类对象(静态的,是属于类的)
1.2.2 静态内部类中可以有静态的成员变量和成员方法
静态的是属于类的,在外部类加载时都会被执行。
1.2.3 静态内部类方法中不能访问外部类中的非静态成员
因为外部类中的非静态成员需要先实例化外部类对象,通过外部类对象的引用才能访问
1.2.4 外部类中,不能直接访问静态内部类中的成员,如果要访问必须先要创建内部类的对象
1.2.5 实例内部类也受public、private等访问限定符的约束
1.2.6 代码
//静态内部类
class OuterClass2{
public int data1 = 1;
int data2 = 2;
public static int data3 = 3;
public void test(){
System.out.println("OuterClass2:test()");
InnerClass2 innerClass2 = new InnerClass2();
System.out.println(innerClass2.data4);
}
static class InnerClass2{
public int data4 = 4;
int data5 = 5;
public static int data6 = 6;
public void func(){
System.out.println("InnerClass2:func()");
OuterClass2 outerClass2 = new OuterClass2();
System.out.println(outerClass2.data1);
System.out.println(outerClass2.data2);
System.out.println(data3);
System.out.println(data4);
System.out.println(data5);
System.out.println(data6);
}
}
}
public class Test2 {
public static void main(String[] args) {
OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();
innerClass2.func();
}
}
1.3 局部内部类
定义在外部类的方法体中,只能在其定义的位置使用。几乎不被使用
1.3.1 局部内部类只能在所定义的方法体内部使用
1.3.2 不能被public、static等修饰符修饰
1.3.3 代码
//局部内部类
public class Test3 {
public void test(){
class Inner{
public void func(){
System.out.println("Inner:func");
}
}
Inner inner = new Inner();
inner.func();
}
public static void main(String[] args) {
}
}
1.4 匿名内部类
new Test2(); —— 匿名对象 new Test2(){}; —— 匿名内部类
创建一个匿名内部类对象,并调用重写的func方法:
用引用接收了一下匿名内部类对象,引用调用了func方法。
2. 对象的打印
重写toString
为啥要重写toString?重写toString为什么就能实现打印了呢?
我的以下博客中有详细介绍:
JavaSE - 调用和重写Object类中的toString方法、equals方法以及理解Arrays类中的toString方法
@Override - 注解,帮你检查 你重新写的 对不对