A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

匿名对象:
普通对象声明:A a  = new A();那么这个时候a就是类A的一个对象,这个对象名字就是a。匿名对象:即没有名字的对象。例如:某一个方法method(A a)需要传一个参数是A类的对象,就有两种方法。方法1:A a =new A();       method (a);方法2:method (new A());方法2中new A()就是一个匿名对象,它没有名字,就是一个匿名对象。内部类
内部类的访问规则:
    a.内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this
    b.外部类要访问内部类,必须建立内部类对象。
访问格式:
    a.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。
    格式:
        外部类名.内部类名  变量名 = 外部类对象.内部类对象;
        Outer.Inner in = new Outer().new Inner();
    b.当内部类在成员位置上,就可以被成员修饰符所修饰。
        比如,private:将内部类在外部类中进行封装。
                static:内部类就具备static的特性。
                当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。
                在外部其他类中,如何直接访问static内部类的非静态成员呢?
                new Outer.Inner().function();

                在外部其他类中,如何直接访问static内部类的静态成员呢?
                Outer.Inner.function();
        注意:当内部类中定义了静态成员,该内部类必须是static的。
当外部类中的静态方法访问内部类时,内部类也必须是static的。

    当描述事物时,事物的内部还有事物,该事物用内部类来描述。
    因为内部事务在使用外部事物的内容。
    class Body
    {
            private class XinZang
            {            }
            public void show()
            {
                    new XinZang().
            }
    }
内部类定义在局部时:
    a.不可以被成员修饰符修饰
    b.可以直接访问外部类中的成员,因为还持有外部类中的引用。但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。
    c.内部类是可以被私有private修饰的。

代码示例:

class Outer
{
        private static  int x = 3;
        static class Inner//静态内部类
        {
                static void function()
                {
                        System.out.println("innner :"+x);
                }
        }
        static class Inner2
        {
                void show()
                {
                        System.out.println("inner2 show");
                }
        }
        public static void method()
        {
                //Inner.function();
                new Inner2().show();
        }
}
class  InnerClassDemo
{
        public static void main(String[] args)
        {
                 Outer.method();
                //Outer.Inner.function();
                //new Outer.Inner().function();
                //直接访问内部类中的成员。
//                Outer.Inner in = new Outer().new Inner();
//                in.function();
        }
}
匿名内部类:
    ①匿名内部类其实就是内部类的简写格式。
    ②定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
    ③匿名内部类的格式:  new 父类或者接口(){定义子类的内容}
    ④其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖,可以理解为带内容的对象。
    ⑤匿名内部类中定义的方法最好不要超过3个。
代码示例:
    abstract class AbsDemo
    {
            abstract void show();
    }
    class Outer
    {
            int x = 3;
            public void function()
            {
                AbsDemo d = new AbsDemo()//该类就是匿名内部类。
                {
                        int num = 9;
                        void show()
                        {
                                System.out.println("num==="+num);
                        }
                        void abc()
                        {
                                System.out.println("haha");
                        }
                };
                d.show();
                //d.abc();//编译失败;
        }
}
class InnerClassDemo4
{
        public static void main(String[] args)
        {
                new Outer().function();
        }
}
内部类还有:成员内部类,方法内部类

成员内部类

class Outer {


            class Inner{}
    }
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。

方法内部类把类放在方法内




class Outer {
public void doSomething(){
        class Inner{
                    public void seeOuter(){}


                }
        }
}
(1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
(2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
下面是完整的例子:
class Outer {
public void doSomething(){
final int a =10;
class Inner{
public void seeOuter(){
System.out.println(a);
}
}
Inner in = new Inner();
in.seeOuter();
}
public static void main(String[] args) {
Outer out = new Outer();
out.doSomething();
}
}
静态内部类:静态内部类中可以定义静态或者非静态的成员。

从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类仅能访问外部类的静态成员和方法。
class Outer{
static class Inner{}
}
class Test {
public static void main(String[] args){
Outer.Inner n = new Outer.Inner();
}
}
在静态方法中定义的内部类也是StaticNested Class,这时候不能在类前面加static关键字,静态方法中的StaticNested Class与普通方法中的内部类的应用方式很相似,它除了可以直接访问外部类中的static的成员变量,还可以访问静态方法中的局部变量,但是,该局部变量前必须加final修饰符。















2 个回复

倒序浏览
来长知识。。
回复 使用道具 举报
学习了,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马