前面了解了上帝Object类,接下来我们学习内部类,
1、内部类-概述
定义:
从名字上我们直观分析,就是一个类我们直接定义到另一个类里面,
对里面那个类就称为内部类(内置类,嵌套类)。
好吧,那么我们现在就写一个内部类出来感受一下,
为什么:
内部类不放也可以,但是你放进去有个好处,
你有没有发现如果你放到外面来的话,我想访问访问Outer里面的x变量、method()方法,
我是不是需要在Inner类当中创建Outer对象,才能访问Outer中的资源。
class Outer { int x=3; void method() { System.out.println(x); } } class Inner { Outer out=new Outer(); void function() { System.out.println("inner :"+out.x); } }
放进Outer类,Inner访问x变量是不是可以直接访问。就像孙悟空
要想访问牛魔王的心脏,是不是要先找到牛魔王,再找到其心脏。
是不是牛魔王.get心脏方法。但当孙悟空跑到牛魔王肚子之后,
是不是可以直接访问牛魔王心脏。
这么做:
class Outer { private int x=3; class Inner { void function() { System.out.println("inner :"+x);//无公私有都可以访问 } } void method() { System.out.println(x); } }
这也就是内部类特点。
2、内部类访问规则
内部类的访问规则:
1,内部类可以直接访问外部类中的成员,包括私有。
2,外部类要访问内部类呢,必须建立内部类对象。
class Outer { private int x=3; class Inner { void function() { System.out.println("inner :"+x);//无公私有都可以访问 } } void method() { Inner in=new Inner(); in.function(); } }
我们其他类可不可以直接访问内部类中成员呢?这样,
class InnerClassDemo { public static void main(String[] args) { Outer.Inner in=new Outer().new Inner(); in.function(); } }
一般不这么干,但面试可能会问。
class Outer { private int x=3; class Inner { int x=4; void function() { int x=6; System.out.println("inner :"+x); } } void method() { System.out.println(x); } }
打印出来的是6,内部有就不出去找;如果要得出4,x前面加this;
3呢?Outer.this.x。
原理:内部类之所以可以直接访问外部类成员,是因为持有外部类的引用,格式:外部类名.this。
访问格式:
1,当内部类定义在外部类的成员位置上,而且非私有。
可以在外部其他类中,直接建立内部类对象。
格式:
外部类名.内部类名 变量名=外部类对象.内部类对象;
Outer.Inner in=new Outer().new Inner();
静态内部类
2,当内部类在成员位置上,就可以被成员修饰符所修饰。
比如,private:将内部类在外部类中进行封装。
static:内部类就具备了静态特性。
当内部类被静态修饰后,只能访问外部类中的static成员,
当外部类其他成员都是static时,不涉及特有数据。
但是静态内部类出现不多,因为有访问局限。
在外部其他类中,我们如何访问静态内部类的非静态成员呢?
此时不需对象,类名可直接调用。
new Outer.Inner().function();
在外部其他类中,我们如何访问静态内部类的静态成员呢?
new Outer.Inner().function(); 或 Outer.Inner.function();
注意,当内部类中定义了静态成员,该内部类必须是static的。
当外部类中的静态方法访问内部类时,内部类也必须是static的。