java–内部类
这部分内容至关重要,初次学的时候可能会觉得晦涩
一、成员内部类
定义
1、成员内部类和外部类
成员内部类是一个类包含的另一个类,在成员内部类中,可以访问外部类的所有成员,包括成员变量和成员方法;在外部类中,同样可以访问成员内部类的变量和方法,但是需要创建成员内部类的对象
2、成员内部类与成员内部类
但是,两个存在于同个外部类中的内部类是不能互相访问内部成员的,成员变量和成员方法都不可以
注意
创建内部类对象的做法:
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
主要原理:new 外部类名()得出一个对象,在对这个对象给个".new 内部类名()",使之得出这个外部类对象的内部类对象。所以同理,假如之前就已经创建了一个外部类对象了,你可以直接
外部类名.内部类名 变量名 = 外部类变量名.new 内部类名();
示例
package com.itheima.example18;
//定义外部类Outer
class Outer {
int m = 0; // 定义外部类的成员变量
// 定义外部类成员方法
void test1() {
System.out.println("外部类成员方法");
}
// 定义成员内部类Inner
class Inner {
int n = 1;
// 1、定义内部类方法,访问外部类成员变量和方法
void show1() {
System.out.println("外部类成员变量m="+m);
test1();
}
void show2(){
System.out.println("内部类成员方法");
}
}
class Inner2 {
int s = 2;
void sout1{
System.out.println("Inner中的n="+n);//无法访问另个内部类的成员,会报错
show1();//无法访问另个内部类的成员,会报错
System.out.println("外部类成员变量m="+m);
}
}
// 2、定义外部类方法,访问内部类变量和方法
void test2() {
Inner inner = new Inner();
System.out.println("内部类成员变量n="+inner.n);
inner.show2();
}
}
//定义测试类
public class Example18 {
public static void main(String[] args) {
Outer outer = new Outer(); // 创建外部类对象
Outer.Inner inner = outer.new Inner(); // 创建内部类对象
inner.show1(); // 测试在成员内部类中访问外部类成员变量和方法
outer.test2(); // 测试在外部类中访问内部类成员变量和方法
}
}
二、局部内部类
定义
1、局部内部类也叫方法内部类,就是定义在某个局部方法中的类
2、它只能在方法中定义,有效范围也仅仅在定义它的那个方法中,局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中的变量和方法却只能在创建该局部内部类的方法中进行访问。
3、不要试图以为在局部代码块中定义的类也是局部内部类,不能在局部代码块中定义类,因为代码块不像方法有调用的入口,如test2()
注意
想使用局部内部类中的内容的时候只用创建这个局部内部类的外部类对象就行了,如:
Outer outer = new Outer()
outer.test2();
示例
//定义外部类Outer
class Outer {
int m = 0;
void test1(){
System.out.println("外部类成员方法");
}
void test2() {
// 1、定义局部内部类Inner,在局部内部类中访问外部类变量和方法
class Inner {
int n = 1;
void show() {
System.out.println("外部类变量m="+m);
test1();
}
}
// 2、在创建局部内部类的方法中,调用局部内部类变量和方法
Inner inner = new Inner();
System.out.println("局部内部类变量n="+inner.n);
inner.show();
}
}
//定义测试类
public class Example19 {
public static void main(String[] args) {
Outer outer= new Outer();
outer.test2(); // 通过外部类对象调用创建了局部内部类的方法
}
}
三、静态内部类
定义
- 静态内部类形态上只比成员内部类类名前加了个static
- 静态内部类只能访问外部类的静态成员,也就是带static修饰的变量和方法
- 外部类访问可以静态内部类的成员,记得要先定义静态内部类的对象才能使用
注意
1、静态内部类可以直接通过外部类创建,通过new 外部类.Inner()的方法创建Inner对象
Outer.Inner inner = new Outer.Inner();
inner.show();
2、也可以通过创建Outer对象来调用静态类的静态方法来使用静态内部类的内容
Outer.Inner.show();
示例
//定义外部类Outer
class Outer {
static int m = 0; // 定义外部类静态变量m
static class Inner {
int n = 0;
static void show() {
// 静态内部类访问外部类静态成员
System.out.println("外部类静态变量m="+m);
}
}
void sout(){
Inner inner1 = new Inner();
System.out.println("静态内部类的n="+inner1.n);
}
}
//定义测试类
public class Example20 {
public static void main(String[] args) {
// 静态内部类可以直接通过外部类创建
//通过new 外部类.Inner()的方法创建Inner对象
Outer.Inner inner = new Outer.Inner();
inner.show();
//通过Outer对象来调用静态类的静态方法
Outer outer = new Outer();
Outer.Inner.show();
outer.sout();
}
}
四、匿名内部类
定义
在java中调用某个方法时,如果该方法的参数是一个接口类型,除了可以传入一个参数接口的实现类,还可以用匿名内部类实现接口作为该方法的参数。通常这么做是为了简化代码。
注意
创建匿名内部类的格式如下
new 父接口(){
//匿名内部类实现接口的部分
}
示例
//定义外部类Outer
class Outer {
static int m = 0; // 定义外部类静态变量m
static class Inner {
int n = 0;
static void show() {
// 静态内部类访问外部类静态成员
System.out.println("外部类静态变量m="+m);
}
}
void sout(){
Inner inner1 = new Inner();
System.out.println("静态内部类的n="+inner1.n);
}
}
//定义测试类
public class Example20 {
public static void main(String[] args) {
// 静态内部类可以直接通过外部类创建
//通过new 外部类.Inner()的方法创建Inner对象
Outer.Inner inner = new Outer.Inner();
inner.show();
//通过Outer对象来调用静态类的静态方法
Outer outer = new Outer();
Outer.Inner.show();
outer.sout();
}
}