您的位置:首页 > 其它

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

2014-02-11 09:21 465 查看
 

Java基础笔记 – 内部类 静态内部类 成员内部类 局部内部类 匿名内部类
本文由包小卷发表于2年前 |Java基础
|评论关闭 |  被围观 2,995 views+

内部类:
使用内部类减少了命名冲突。
 

内部类

 在类内部的类

 1.解决多继承

 2.解决继承和实现接口时候方法名冲突情况

 3.实现数据隐藏

 

 只有内部类可以拥有4种访问修饰符

 当内部类为private的时候,有外部类提供方法来访问内部类

 

常规内部类

 1.不能有静态属性和方法

 2.内部类可以使用外部类的所有属性和方法

 3.外部类不能直接使用内部类的属性和方法,使用前必须先实例化

 

如果内部类的属性和方法屏蔽了外部类方法

  外部类.this.属性/方法

来调用外部类的属性和方法

 

静态内部类

 可以包含静态方法和属性

 不需要再实例化外部类

 StaticOutter.StaticInner in =

    new StaticOutter.StaticInner();

 

局部内部类

 在方法内部的内部类

 1.不能有访问修饰符   

 2.可以访问方法中的局部变量和类中的所有属性、方法

 3.如果出现局部内部类屏蔽方法内部局部变量,在局部内部类内部不能在访问到该局部变量

 

匿名内部类

 回调方法,没有类名的内部类

 1.子类中只有一个无参构造器

 2.必须马上实例化

==================================================================================
一个内部类可以定义在一个类中,一个方法中甚至一个表达式中。
内部类分为四种:
静态内部类(static inner classes)

成员内部类(member inner classes)

局部内部类(local inner classes)

匿名内部类(anonymous inner classes)
1、静态内部类(static inner classes)
最简单的内部类。
只能访问外部类的静态成员变量与静态方法。
生成静态内部类对象的方法:

OuterClass.InnerClass inner = new OuterClass.InnerClass();


1.1、相关使用例子:
静态内部类:

class StaticInner{
private static int a = 1;

/**
   * 静态内部类
  * 生成的类名:StaticInner$InnerClass
  */
public static class InnerClass{
//静态内部类可以声明静态的成员变量,其他的内部类不可以
private static int b = 1;
public void execute(){
//静态内部类只能访问静态程序
System.out.println(a + b);
}
}
}


main方法中使用:

public static void main(String[] args) {
//创建静态内部类
StaticInner.InnerClass innerClass = new StaticInner.InnerClass();
innerClass.execute();
}


2、成员内部类(member inner classes):
成员内部类可以访问外部类的静态与非静态的方法和成员变量。
生成成员内部类对象的方法:

OuterClass.InnerClass inner = new OuterClass().new InnerClass();


在局部内部类中访问外部类的成员变量的方法:

OuterClass.this.a;


2.1、相关使用例子:
成员内部类:

class MemberInner{
private int a = 1;

public void execute(){
//在外部类中创建成员内部类
InnerClass innerClass = this.new InnerClass();
}

/**
* 成员内部类
*/
public class InnerClass{

//内部类可以创建与外部类同名的成员变量
private int a = 2;

public void execute(){
//this引用的是内部类
System.out.println(this.a);
//在内部了中使用外部类的成员变量的方法
System.out.println(MemberInner.this.a);
}
}
}


在main方法中使用:

public static void main(String[] args) {
//创建成员内部类
MemberInner.InnerClass innerClass = new MemberInner().new InnerClass();
innerClass.execute();
}


3、局部内部类(local inner classes):
类似于局部变量,不能定义为public,protected,private或者static类型。
定义方法中,只能方法中声明为final类型的变量。
3.1、相关使用例子:
局部内部类:

class LocalInner{

public void execute(){
final int a = 1;
/**
* 创建局部内部类
*/
class InnerClass{
public void execute(){
System.out.println("LocalInner Class");

//局部内部类只能访问final类型的变量
System.out.println(a);
}
}
//只能在所在方法区域创建
new InnerClass().execute();
}
}


在main方法中使用:

public static void main(String[] args) {
//外部不能直接创建局部内部类
LocalInner localInner = new LocalInner();
localInner.execute();
}


4、匿名内部类(anonymous inner classes):
匿名内部类没有类名,没有class关键字也没有extends和implements等关键字修饰。
匿名内部类会隐式地继承一个父类或实现一个接口。
4.1、相关使用例子:

public static void main(String[] args) {
AnonymousInnerClassTest test = new AnonymousInnerClassTest();

/**
* 创建匿名内部类
* 生成的类名:AnonymousInnerClassTest$1
*/
test.print(new Date(){
//重写toString()方法
@Override
public String toString() {
return "Hello world.";
}
});

JButton button = new JButton();

/**
* 创建匿名内部类
* 该匿名内部类实现ActionListener接口
* 生成的类名:AnonymousInnerClassTest$1
*/
button.addActionListener(new ActionListener(){
//实现接口中的方法
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("使用匿名内部类实现ActionListener接口");
}
});
}

public void print(Date date){
System.out.println(date);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐