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

来源:互联网 发布:数据处理软件origin 编辑:程序博客网 时间:2024/05/17 01:22
 
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);}
0 0
原创粉丝点击