java夯实基础系列:内部类

  对于初学者来说内部类实在是使用的不多,鄙人菜鸟一个同样没有怎么使用过,但是随着编程能力的提高,我们会领悟到它的魅力所在,它可以使用能够更加优雅的设计我们的程序结构。在使用内部类之间我们需要明白为什么要使用内部类,内部类能够为我们带来什么样的好处。

定义

将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。

访问规则:
内部类可以直接访问外部类中的成员,包括私有成员(原因是内部类持有一个外部类的引用,该引用的写法是Outer.this)
外部类要访问内部类中的成员必须要建立内部类的对象

内部类属于外部类的一个成员,就相当于一个成员内部类,把它跟成员变量平级去看待。

外部类如何访问内部类,即内部类的访问格式

访问格式:
1. 当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中,可以直接建立内部类对象。

格式:
外部类名.内部类名 变量名 = 外部类对象.内部类对象
Outer.Inner in = new Outer().new Inner()

2.当内部类在成员位置上,就可以被成员修饰符所修饰。比如,private,static

什么情况下使用内部类?

当描述事物时,事物的内部还有事物,该事物用内部类来描述。因为内部事物在使用外部事物的内容。比如你要访问心脏,必须先有身体。如果心脏想访问人体中的其他东西,首先就要先有身体。

写完以后,争取把内部类封装,不对外暴露
然后提供对外的访问方法来访问内部的事物,这样的封装是比较方便的。这一般都用于程序设计上,我把描述的都隐藏起来了

内部类分类

成员内部类

成员内部类也是最普通的内部类,它是外围类的一个成员,所以他是可以无限制的访问外围类的所有 成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。

在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

public class OuterClass {
    private String str;

    public void outerDisplay() {
        System.out.println("outerclass...");
    }


    public class InnerClass {
        public void innerDisplay() {
            str = "内部类内部类";
            System.out.println(str);
            outerDisplay();
        }
    }


    public InnerClass getInnerClass() {
        return new InnerClass();
    }


    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.getInnerClass();
        innerClass.innerDisplay();
    }
}
内部类内部类
outerclass...

推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 。

静态内部类

上一篇文章已经讲到

局部内部类(知道即可,用的少)

有这样一种内部类,它是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。

内部类在局部时:
1.不可以被成员修饰符修饰
2.可以直接访问外部类中的成员,因为还持有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量。

public class Outer {
    int x = 3;
    void method() {
        final int y = 4;
        class Inner {
            void function() {
                System.out.println(y + x);
            }
        }

        new Inner().function();
    }
}
public class InnerClassDemo3 {
    public static void main(String[] args) {
        new Outer().method();
    }
}
7

匿名内部类

匿名内部类在android中用的比较多,比如设置点击事件,设置网络回调等等

匿名内部类其实即使内部类的简写形式
定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
匿名内部类的格式:new 父类或者接口(){定义子类的内容}
其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖。可以理解为带内容的对象
匿名内部类中定义的方法最好不要超过3个。

参考资料

java提高篇(八)—-详解内部类
http://www.cnblogs.com/chenssy/p/3388487.html

你可能感兴趣的:(java提高)