内部类的定义:
内部类就是定义在另一个类里面的类。反之,包含内部类的类称为外部类。
我们为什么要使用内部类呢?
1.外部类能给内部类提供更好的封装,把内部类隐藏在外部类之内,不允许同一个包中的其他类去访问。
2.内部类能直接访问外部类的所有数据,包括私有数据。
3.内部类实现的功能,外部类也能使用。
内部类分为:
1.成员内部类
2.静态内部类
3.方法内部类
4.匿名内部类
下面在下就详细说说这个4中内部类:
1.成员内部类:
在其外部类中被定义,与成员变量,方法并列。
package org.member.innerclass;
public class Big {
//定义一个整形变量
private int i = 10;
//定义一个整形变量
private int k = 20;
//定义一个静态整形变量
private static int j = 30;
//定义一个方法
public void method1() {
System.out.println( "method1..." );
}
//定义一个静态方法
public static void method2() {
System.out.println( "method2..." );
}
//定义成员内部类
class Small {
//内部类和外部类的成员变量能够共存的
//定义一个整形变量
private int i = 11;
//定义内部的方法
public void innerMethod() {
//输出内部整形变量i的值
System.out.println( "内部类i的值 = " + i );
//这里指定的是内部类的整形变量i
System.out.println( "内部类i的值 = " + this.i );
//输出外部类整形变量i
System.out.println( "外部类i的值 = " + Big.this.i );
//直接输出外部类的静态整形变量
System.out.println( "静态变量j = " + j );
//内部类和外部类没有同名的变量,则直接用变量名访问外部类变量
System.out.println("外部类k的值 = " + k );
//内部类访问外部类的方法
method1();
//内部类访问外部类的静态方法
method2();
}
}//在方法内访问内部类
public void method3() {
//实例化一个内部类
Small small = new Small();
//调用其方法
small.innerMethod();
}
//外部类的静态方法访问内部类
//与外部类访问内部类一样
public static void method4() {
//首先得实例化一个外部类
Big big = new Big();
//然后实例化内部类
Small small = big.new Small();
//调用内部类的方法
small.innerMethod();
}
public static void main(String[] args) {
//想要创建内部类,就必须使用一个外部类来引用创建
Big big = new Big();
Big.Small small = big.new Small();
small.innerMethod();
//通过外部类的方法来创建内部类
big.method3();
}
}
2.静态内部类
静态内部类跟成员内部类不同,它没有隐含的保存一个引用,指向创建它的外部类,它不需要与外部类有联系,它只是嵌套在外部类中,所以我们也称它为”嵌套类“。
”嵌套类“意味着:
1.并不需要外部类来创建嵌套类对象。
2.不能从嵌套类对象中访问非静态的外部类。
package org.static1.innerclass;
public class Big {
//定义一个静态整形变量
private static int i = 10;
//定义一个整形变量
private int j = 20;
//外部类的静态方法
public static void method1() {
System.out.println( "静态method1方法" );
}
//外部类的方法
public void method2() {
System.out.println( "method2方法" );
}
//静态内部类
static class Small2 {
//定义一个静态整形变量
private static int inner_i = 30;
//定义一个整形变量
private int inner_j = 40;
//静态内部类的静态方法只能调用静态变量和静态方法
//静态内部类的静态方法
public static void innerMethod() {
//静态内部类的静态方法只能输出静态变量
System.out.println( "静态整形变量inner_i = " + inner_i );
//输出外部类的静态变量
System.out.println( "外部类的静态变量i = " + i );
//调用外部类的静态方法
method1();
}
//静态内部类的方法
public void innerMethod2() {
//内部类的非静态方法输出非静态变量
System.out.println( inner_j );
//静态内部类不能调用外部类的非静态方法和非静态变量
// method2();
// System.out.println( j );
}
}
//外部类的方法
public static void method3() {
//外部类访问静态内部类的的静态变量
System.out.println( "inner_i = " + Small2.inner_i );
//外部类访问静态内部类的的静态方法
Small2.innerMethod();
//外部类访问内部类的非静态变量
//先得实例化一个内部类对象
Small2 small2 = new Small2();
System.out.println( "inner_j = " + small2.inner_j );
//外部类访问内部类的非静态方法
small2.innerMethod2();
}
//main方法
public static void main(String[] args) {
Small2.innerMethod();
//静态内部类是不需要外部类的引用来创建对象的
Small2 small2 = new Small2();
small2.innerMethod2();
}
}
3.局部内部类
在方法中定义的类,我们称为局部内部类。与局部变量类似,局部内部类不能有访问修饰符,但是它可以访问当前代码块内的常量,和此外部类所有的成员。
package org.local.innerclass;
public class Big {
//定义整形变量
private int i = 10;
//整形变量
private int out_j = 20;
//定义一个方法
public void method() {
//定义局部整形常量
final int i = 15;
//定义局部整形变量
int j = 25;
//局部内部类
class Small {
//可以定义与外部类一样的变量名
int i = 100;
//不能定义静态变量
// static int m = 10;
private void method() {
//如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
System.out.println( "out_j = " + out_j );
//输出局部内部类的成员变量
System.out.println( "i = " + i );
//输出外部类的成员变量
System.out.println( "Big.this.i = " + Big.this.i );
//该内部类可以访问局部变量
System.out.println( "j = " + j );
}
}
new Small().method();
}
public static void main(String[] args) {
Big big = new Big();
big.method();
}
}
4.匿名内部类
顾名思义,匿名内部类就是没有名字的内部类。
在一下情况使用匿名内部类比较合适:
.只用到类的一个实例。
.类在定义后马上能用到。
.类非常小。
.给类命名不会导致你的代码更容易被理解。
在使用匿名内部类,要记住一下几个原则:
.匿名内部类不能有构造方法。
.匿名内部类不能定义任何静态成员、方法、类。
.匿名内部类不能是public,protected,private,static。
.只能创建匿名内部类的一个实例.
.一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
.因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
package org.anonymous.innerclass;
public abstract class Doctor {
//定义方法
public void workInDay() {
System.out.println( "在医院上班" );
}
//定义抽象方法
public abstract void workInNight();
//main方法
public static void main(String[] args) {
//实例化Doctor类,而且必须重写workInNight抽象方法
Doctor doctor = new Doctor() {
//重写该方法
@Override
public void workInNight() {
System.out.println( "睡觉" );
}
};
//调用其方法
doctor.workInDay();
doctor.workInNight();
}
}
-----------------------
来源:https://www.cnblogs.com/hmake/p/6071369.html