JAVA基础-内部类

java

  1. 概述把类定义在另一个类的内部,该类就被称为内部类。举例:把类Inner定义在类Outer中,类Inner就被称为内部类。

    class Outer {

    class Inner {

    }

    }

  2. 内部类的访问规则​

    • 可以直接访问外部类的成员,包括私有
    • 外部类要想访问内部类成员,必须创建对象

  3. 内部类的分类​

    • 成员内部类​
    • 局部内部类​
    • 静态内部类​
    • 匿名内部类

  4. 内部类好处:
    每个内部类都能独立的继承一个接口的实现,所以无论外部类是否

    已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得

    多继承的解决方案变得完整。

成员内部类

  • 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括

    private成员和静态成员)

  • 同名属性名方法名时 访问外部类 外部类.this.成员名

  • 成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部

    类的对象,前提是必须存在一个外部类的对象。所以在外部类访问内

    部类的时候

    Outter outter = new Outter();
    Outter.Inner inner = outter.new Inner();

  • 成员内部类可以使用四种权限修饰符进行修饰
  • 成员内部类中不能书写静态变量和方法

//成员内部类

//外部类 只能使用public 和默认值修饰

public class Outer {

static String name;

int age=10;

public static void outerShow() {

}

public void show() {

System.out.println("外部类show");

}

class Inner{//成员内部类 跟外部类成员是同一级别 修饰符:public 默认的 private protected

//static String sex;//成员内部类中 不能使用static关键字修饰

//成员内部类 访问外部类的属性(包含静态)和方法(包含静态)

int age=20;

public void show() {

outerShow();//调用外部类方法

System.out.println(name);//调用外部类的属性

System.out.println(age);

System.out.println("innershow方法");

//当内部类属性与外部类属性名相同时,我想在内部类中访问外部类属性

//格式 外部类名.this.变量名

System.out.println(Outer.this.age);

//访问外部类 方法 同名时

Outer.this.show();

}

}

public static void main(String[] args) {

//成员内部类 创建对象的步骤 他依附于外部类

Outer outer=new Outer();

Outer.Inner inner=outer.new Inner();

inner.show();

}

}

局部内部类

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内

部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

这段代码,主要看调用show方法里面的age是如何调用的:

//局部内部类

public class Outer {

static String password;

public void show() {

int age=0;

String sex="男";

class Inner{//局部内部类 内部不能使用static关键字

//局部内部类 只能使用默认权限修饰符修饰类

//局部内部类 可以访问方法中局部变量

//局部内部类与局部变量使用范围一样 在此方法内部

//创建对象

//局部内部类 可以方法外部类中属性和方法(包含静态)

//访问方法中的局部变量 通过方法参数传递完成

//外部类与内部类重名 使用外部类.this.成员名(方法名())

int age=23;

String name;

public void show(int age) {

System.out.println(age);

System.out.println(sex);

System.out.println(this.age);

System.out.println(password);

}

}

//局部内部类 创建对象 要在方法内部 局部内部类的外部声明

Inner n1=new Inner();

n1.show(age);

}

public static void main(String[] args) {

Outer outer=new Outer();

outer.show();

}

}

静态内部类

  • 静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一

    个关键字static。

  • 静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点

    类似,并且它不能使用外部类的非static成员变量或者方法

  • 静态内部类中即能声明静态成员 也可以声明非静态成员

public class Outer {

static String sex="nan";

static class Inner{//静态内部类 声明四种权限修饰符都可以

//类中可以声明静态方法和非静态方法 以及成员变量和静态变量

//静态内部类中不能访问外部类非静态成员

int age;

static String name;

public void show() {

System.out.println(sex);

}

public static void display() {

System.out.println(sex);

}

}

public static void main(String[] args) {

//静态内部类 不依附外部类对象 直接new对象

Inner i1=new Inner();

i1.show();

Inner.display();

}

}

匿名内部类

匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

new 父类构造器(实参列表)|实现接口(){

//匿名内部类的类体部分

}

interface A{

void show();

}

public class Outer {

String name;

public void callInner(A a) {

a.show();

}

public static void main(String[] args) {

// Outer outer=new Outer();

// outer.callInner(a);

// new Outer().display();

//安卓应用特别广泛

//java 主要是做接口回调 优化

//匿名内部类

new Outer().callInner(new A() {

@Override

public void show() {

// TODO Auto-generated method stub

System.out.println("show");

}

});

//通过实现子类

new Outer().callInner(new AImpl());

//分步通过子类实现

Outer k = new Outer();

k.callInner( new AImpl() );

}

public void display() {

System.out.println("display");

}

}

class AImpl implements A{

@Override

public void show() {

System.out.println("show");

}

}

以上是 JAVA基础-内部类 的全部内容, 来源链接: utcz.com/z/395132.html

回到顶部