Java类与C++类的区别

4
我刚开始学习Android开发,我的背景是C++。我发现Java不支持多重继承,但我们真的需要为每个新Activity创建一个单独的.java文件吗?
我有一个TabActivity,其中包含3个更多的活动,它们组成选项卡。我想在其中一个选项卡上创建一个列表视图,但我开始感到困惑了。我是否需要创建另一个扩展ListActivity的.java文件?如果我需要为每个activity创建一个单独的.java文件,即使是相对较小的应用程序,也可能变得非常庞大。
附注:
如果我想将ListView添加到其中一个选项卡中,我该怎么做?到目前为止,我找到的所有内容都没有提到如何将新活动添加到其他活动中。

http://www.behestee.com/blog/?p=48 是我提到的那件事情最好的做法吗? - user470760
7个回答

1
其他答案提供了关于接口的好观点,这可能更符合您的需求。但是,为了进一步了解,不,您不必为每个新类创建一个新的.java文件,有替代方法。但是,请记住,更多的类并不一定是坏事。您的选择是...

嵌套类:

public class A {

    public/private class B {

    }

}

B 的实例可以访问 A 的私有变量,但不能在没有 A 实例的情况下构造 B 实例(这通常是用于按钮处理程序等的方法)。

嵌套静态类:

public class A {

    public/private static class B {

    }

}

B类的实例不能访问A类的私有变量,但是它们不需要A类的实例就可以被构造。如果B类被声明为public,则可以在任何地方实例化B类;如果B类被声明为private,则只能在A类的方法中实例化。

匿名类:

public class A {

    private void setupLayout() {

        ...
        button.addClickListener(new ActionListener() {
            public void actionPerfored(ActionEvent e)
            {
                handleClick();   
            }
        });
    }

}

这种奇怪的语法创建了一个没有名称的类,并且与嵌套类相同(例如可以访问私有变量)。它是编写嵌套类的另一种形式,有时更短,但会导致非常奇怪的语法。


1

Java不支持在抽象类或普通类上进行多重继承,但只能在接口上进行。

您可以创建扩展特定Activity的抽象类,并不断创建抽象类,直到您拥有一个继承所有活动功能的类。

或者,可以有一个类继承多个接口。


1

如果您使用集成开发环境来实现这个,会比较容易创建多个文件的开销小。

但是,在同一个文件中拥有多个类的方法也有一些。其中包括:a) 使用内部/嵌套类 b) 匿名类 c) 枚举 d) 包局部类。

唯一无法轻松完成的事情是将类定义分散在多个文件中。


唯一不能轻易做到的是将类的定义跨多个文件分散开来,这实际上是很好的。 - bestsss
@bestsss:这只是语言强加的一些东西,它并不代表好或坏。可以理解,在正常情况下,散布你的代码并不是一个好主意,但在某些情况下,这样做可能是有用的,并且在语言中设置任意限制似乎会对C++程序员产生反作用。 - Martin York
@Martin,类可以使用抽象超类、委托和辅助方法来分散代码。这样做会产生多个类,但如果您想将一个大类转换为多个文件,可以这样做(前提是添加类来实现)。 - Peter Lawrey
1
@Martin,如果你真的需要这么大的类,那么就存在设计缺陷;有很多方法可以委托执行、功能而不必拥有数百个字段。也可以说,多重继承可以提高性能(由于局部性和缺乏额外的间接性),但实际上它主要会造成混乱和难以维护的代码。 - bestsss
1
良好的实践/代码审查和团队协议,允许偏离常规,我认为比任意规则更好。 - Martin York
显示剩余2条评论

1
Java不支持多重继承。解决方法是使用接口。 但是,我们是否真的必须为每个新活动创建一个单独的.java文件? 不需要,如果您的活动可以在现有类中完成或可以作为现有类的子类。Java建立在为每个活动创建类的基础上。

1

Java不允许多重继承,但它允许实现多个接口。你不需要为每个类创建一个单独的文件(虽然这是一个好习惯)。你可以将子类封装在文件的主要类中。

ListView可以简单地extend,并且您可以在xml等中使用相应的扩展类。


0

Java在某种程度上支持多重继承,只需将基类定义为抽象类并将其称为接口而不是即可。


2
那可完全不是同一回事,差距非常大。 - TravisG
2
抽象基类和接口是不同的。 - iammilind
1
一个接口(在Java中)没有实现的方法。抽象类(在C++中)至少有一个纯虚函数,但可能有不是纯虚的虚函数,并且可能有已实现的函数(包括纯虚函数)。同样,在Java中,抽象类可以有已实现的方法。因此,“抽象”这个术语是错误的,但基本思想是正确的,如果你能将“额外”的C++基类转换为接口,那么你就可以将设计迁移到Java(至少在这方面)。如果不能,你就必须改变设计。 - Steve Jessop

0

你可以在XML中简单地声明一个ListView,并在Activity中调用它,无需为ListView单独创建一个ListActivity。这适用于整个Activity都是ListView的情况。

至于更多类的问题,这并不是坏事。更多的类意味着更多的面向对象,虽然不是严格的(一切都有限度)。
多重继承被认为不好,因为会出现“死亡之钻”问题。所以解决方法是使用Java中的Interface(Objective-C中的普通类)来代替纯虚类。
我建议你阅读HeadFirst Java第二版,以更好地掌握术语及其用法。这是一本适合初学者的好书。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接