标题:java内部类
内部类:
在JAVA中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、静态内部类、局部内部类、匿名内部类。
——————————————————————————————————————
1.成员内部类:
- 成员内部类中不能存在static关键字,不能申明静态属性、方法、代码块等;
- 在成员内部类中访问外部类的成员属性和方法,要使用“外部类名.this.成员属性”和”外部类名.this.成员方法“;
- 创建成员内部类的实例使用”外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法“的形式(在创建内部类实例之前先创建外部类的实例对象。)举例:Outer class1 = new Outer(); Outer.Inner class2 = class1.new Inner();
- 成员内部类可以被public 、protected、private、default、static、final、abstract修饰,被static修饰是静态内部类;
- 外部类无法直接访问成员内部类的属性和方法,只能通过”内部类实例名.方法名/属性“的形式访问内部类的属性或方法;
代码展示:
/**
* 成员内部类
* @author hecc
*/
public class OuterClass {
private String name="aaa";//外部类属性
public void TestOuter(){
System.out.println("这是我的外部类方法");
}
class InnerClass{
private String name1 = "bbb";
public void TestInner(){
System.out.println("这是我的内部类方法");
OuterClass.this.TestOuter();
}
}
public void checkInnerClass(){
//通过外部类的对象创建成员内部类的对象
OuterClass class1 = new OuterClass();
//使用"外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法"
OuterClass.InnerClass class2 = class1.new InnerClass();
System.out.println("内部类name:"+class2.name1);
class2.TestInner();
}
public static void main(String[] args) {
OuterClass class1 = new OuterClass();
class1.checkInnerClass();
}
}
运行结果
:
——————————————————————————————————————
2.静态内部类:被static修饰的成员内部类叫静态内部类
- 静态内部类跟外部类没有任何关系,只是在生成类名和类定义时有影响。静态内部类可以看做与外部类平级的类;使用方式与外部类平级的类完全相同。
- 静态内部类不能直接访问外部类的非静态的属性和方法;外部类可以访问静态成员内部类中的属性和方法 不受static访问修饰符的影响(包括静态属性、方法和非静态属性、方法)。
- 静态内部类创建实例的形式:外部类名.内部类名 实例名 = new 外部类名.内部类名();
代码展示:
/**
* 静态内部类
* @author hecc
*/
public class StaticInnerClass {
private String name="AAA";
public void test(){
System.out.println("这是外部类的方法");
}
static class StaticClass{
private String name1 = "BBB";
public void test1(){
//静态成员内部类不能访问外部类的非静态成员属性和方法
//System.out.println(name);
System.out.println("这是内部类的方法");
}
}
public void test2(){
//外部类名.内部类型 内部类对象名=new 外部类名.内部类名();
StaticInnerClass.StaticClass staticClass
= new StaticInnerClass.StaticClass();
System.out.println(staticClass.name1);
}
public static void main(String[] args) {
StaticInnerClass class1= new StaticInnerClass();
//外部类可以访问静态成员内部类中的属性和方法 不受static访问修饰符的影响
System.out.println(class1.name);
class1.test2();
}
}
运行结果:
——————————————————————————————————————
3.匿名内部类:
- 匿名内部类定义和实例化形式:
new 父类构造方法(){
注:该方法名必须子啊父类中已经存在
修饰符 返回值类型 方法名(参数列表){
}
}
- 匿名内部类只能与new 连用,用于创建一个实例。匿名内部类只能使用一次,类定义后立即消失;
- 匿名内部类必须继承一个类(抽象的、非抽象的都可以)或者一个接口。如果父类或父接口是抽象的,则匿名内部类必须实现其所有抽象方法;
- 匿名内部类不是抽象类,因为匿名内部类在定义后,会立即创建一个实例;
- 匿名内部类不能定义构造方法,匿名内部类没有类名,无法定义构造方法,但匿名内部类用于与父类相同的所有的构造方法;
- 匿名内部类中可以定义代码块,用于实例的初始化,但不能定义静态代码块;
- 匿名内部类中可以定义新的方法和属性(不能使用static修饰);
- 匿名内部类访问外部类的局部变量,则局部变量需要用final声明;匿名内部类中访问外部类的成员属性和方法使用”外部类名.this.方法名(参数)或属性;
- 匿名内部类不能重写父类的静态方法。
代码展示:
/**
* 匿名内部类
* @author hecc
*
*/
public class ExtendInnerClass {
//定义匿名内部类,实例化
Student student = new Student() {
public String Myname = "hecc";
@Override
public void learning() {
System.out.println("这是匿名抽象类");
}
public void TestSelf(){
System.out.println("这是自定义的方法!");
}
};
public void testOuter(){
student.learning();
//外部类不能访问匿名内部类中的私有属性和方法
//student.name;
//外部类可以访问匿名内部类中的共有、受保护、默认属性和方法
System.out.println(student.age);
//外部类只能访问抽象类或者接口中定义的方法和属性
//student.TestSelf();
//System.out.println(student.MyName);
}
public static void main(String[] args) {
ExtendInnerClass extendInnerClass = new ExtendInnerClass();
extendInnerClass.testOuter();
}
}
//抽象类
abstract class Student{
private String name;
public int age = 18;
//抽象方法
public abstract void learning();
}
运行结果:
——————————————————————————————————————
4.局部内部类:
定义在代码块、方法体中、作用域(使用花括号{}括起来的一段代码)内的类叫局部内部类。
- 局部内部类只能在代码块、方法体、作用域中使用(创建对象和使用类对象);
- 局部内部类访问外部类的属性和方法使用“外部类名.this.属性名或方法”的形式;
- 局部内部类访问作用域内的局部变量,该局部变量要使用final修饰;
- 局部内部类的定义可以使用abstract修饰,声明抽象类;
代码展示:
/**
* 局部内部类
* @author hecc
*
*/
public class PartInnerClass {
private String name ="hecc";
public int age =10;
public void doSOnmeThing(){
System.out.println("这是外部类的方法");
}
/**
* 外部类不能访问局部内部类
* 局部内部类的访问作用域在方法体内,或者在对应的代码块内
* 局部内部类可以访问外部类中所有的属性和方法
* 局部内部类中不能访问所在方法中的的非final类型的变量
*/
public void test(){
//局部内部类的访问作用域在方法体内,或者在对应的代码块
final String name1 = "jack";
class Dog{
public void dogTest(){
//局部内部类可以访问外部类中所有的属性和方法
System.out.println("这是局部内部类的方法");
System.out.println(name);
System.out.println(age);
//局部内部类中不能访问所在方法中的非final类型的变量
doSOnmeThing();
}
}
//在局部内部类的作用域范围内创建局部内部类的对象,对象的使用与普通类一样
Dog dog = new Dog();
dog.dogTest();
}
public static void main(String[] args) {
PartInnerClass partInnerClass = new PartInnerClass();
partInnerClass.test();
}
}
运行结果: