JAVA基础-内部类
Posted 不愿透露姓名的王建森
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA基础-内部类相关的知识,希望对你有一定的参考价值。
-
概述把类定义在另一个类的内部,该类就被称为内部类。举例:把类Inner定义在类Outer中,类Inner就被称为内部类。
class Outer { class Inner { } }
-
内部类的访问规则?
- 可以直接访问外部类的成员,包括私有
- 外部类要想访问内部类成员,必须创建对象
-
内部类的分类?
- 成员内部类?
- 局部内部类?
- 静态内部类?
- 匿名内部类
-
内部类好处:
每个内部类都能独立的继承一个接口的实现,所以无论外部类是否
已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得
多继承的解决方案变得完整。
成员内部类
- 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括
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基础-内部类的主要内容,如果未能解决你的问题,请参考以下文章