黑马程序员技术交流社区

标题: 请问下内部类相对外部类有哪些局限性呢? [打印本页]

作者: dzr19850306    时间: 2013-2-14 07:43
标题: 请问下内部类相对外部类有哪些局限性呢?
1,内部类的工作,是否可以通过其他的方法完成?
比如


语句块1:
class A
{
    class B{}
}


语句块2:


class B;
class A
{
    B  b;
}

对于内部类来说,其于其对应外部类来说,特殊的 功能就是可以访问其外部类的私有成员。这是否说,只要提供了一个访问类A的私有成员的机制,那么通过定义一个类成员就完全可以实现内部类的功能呢?


2,内部类和外部类有一些什么样的区别?是否存在一些因为是内部类而具有的一些局限性呢?内部类能够继承自自己的外部类么?


作者: 罗海云    时间: 2013-2-14 09:41
内部类是相对于外部类来说的,顾名思义就是在类的内部在建立一个类。

使用内部类的好处:1可以将多个有关系的内部类联系在一起分组处理,2可以隐藏内部类的方法和过程的实现

内部类又分静态和非静态

静态内部类:不能指向外部类的引用而非静态类可以

非静态内部类:在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类,不过静态内部类中却可以拥有这一切

Java内部类也可以是局部的,它可以定义在一个方法甚至一个代码块之内。



为什么需要内部类?
java内部类有什么好处?为什么需要内部类?
首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。
不过你可能要质疑,更改一下方法的不就行了吗?
的确,以此作为设计内部类的理由,实在没有说服力。
真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题 没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。

作者: 李洪因    时间: 2013-2-14 10:00
定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。static的内部类行为上象一个独立的类,非static在行为上类似类的属性或方法且禁止声明static的方法。内部类可以访问外部类的所有方法与属性,但static的内部类只能访问外部类的静态属性与方法。

外部类按常规的类访问方式使用内部类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性。如:
      pinner p = new pinner();
        p.index = 20;
        p.Print();
        ---- 这种方式适合外部类的非static方法;

        pouter po = new pouter();
        pinner pi = po.new pinner();
        pi.index = 40;
        pi.Print();
        ---- 这种方式适合外部类的static方法;

内部类类似外部类的属性,因此访问内部类对象时总是需要一个创建好的外部类对象。内部类对象通过‘外部类名.this.xxx’的形式访问外部类的属性与方法。如:
            System.out.println("Print in inner Outer.index=" + pouter.this.index);
            System.out.println("Print in inner Inner.index=" + this.index);

如果需要在其他类中访问内部类,可以使用:
(1)外部类提供创建内部类的方法供其他类使用。如:
        // 外部类
        pinner getInner()
        {
            return new pinner();
        }

        // 其他类
        pouter.pinner pi = po.getInner();
        pi.Print();

(2)直接创建内部类的对象。如:
        pouter po = new pouter();
        pouter.pinner pi = po.new pinner();
        pi.Print();

内部类可以声明在外部类的方法中或语句块中。如果内部类需要访问包含它的外部类方法或语句块的局部变量或参数,则该局部变量或参数必须是final的。外部类的其他方法、其他类无法访问声明在方法内部或块内部的内部类。

如果一个类继承内部类,则创建该类的对象时需提供一个外部类的对象作为构造方法的参数。如:
class Car
{
    class Wheel
    {

    }
}

class SuperWheel extends Car.Wheel
{
    SuperWheel(Car car)
    {
        car.super();
    }

    public static void main(String [] args)
    {
        Car car = new Car();
        SuperWheel wl = new SuperWheel(car);
    }
}

如果创建命名的内部类没有多少实际意义时,可以创建匿名的内部类。比如使用内部类实现接口的功能(如事件处理器、适配器等),而功能的差异较大,需要根据实际的情况创建相应的内部类时,可以使用匿名内部类。简单的示例如下:
interface WebView
{
    void doGet();
}

class A
{
    WebView ShowName()
    {
        return new WebView()
        {
            void doGet()
            {
                System.out.println("Name");
            }   
        };
    }

    WebView ShowCode()
    {
        return new WebView()
        {
            void doGet()
            {
                System.out.println("Code");
            }   
        };
    }
}

最后,JAVA 内部类还有一个作用,那就是实现JAVA的多继承。JAVA本身是不允许多继承的,如果我们想一个类继承多个基类,就可以使用内部类。通过内部类分别继承一个基类,外部类创建内部类的对象,并使用内部类的方法,变相地实现了多继承。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2