使用super();在Java中

时间:2013-06-03 06:46:31

标签: java android extends super

package com.example.mapdemo;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

import com.example.mapdemo.view.FeatureView;

/**
 * The main activity of the API library demo gallery.
 * <p>
 * The main layout lists the demonstrated features, with buttons to launch them.
 */
public final class MainActivity extends ListActivity {

    /**
     * A simple POJO that holds the details about the demo that are used by the List Adapter.
     */
    private static class DemoDetails {
        /**
         * The resource id of the title of the demo.
         */
        private final int titleId;

        /**
         * The resources id of the description of the demo.
         */
        private final int descriptionId;

        /**
         * The demo activity's class.
         */
        private final Class<? extends FragmentActivity> activityClass;

        public DemoDetails(
                int titleId, int descriptionId, Class<? extends FragmentActivity> activityClass) {
            super();
            this.titleId = titleId;
            this.descriptionId = descriptionId;
            this.activityClass = activityClass;
        }
    }

我发现有两件事我需要更好地理解这段代码。首先,我试图确定:

的确切含义
private final Class<? extends FragmentActivity> activityClass;

其次我很好奇用super()调用什么;因为定义了DemoDetails时,它定义为:

private static class DemoDetails {

那么在那一点上没有延伸所以超级引用了什么?使用

<? extends >

我以前从未见过。

提前致谢...

7 个答案:

答案 0 :(得分:2)

private final Class<? extends FragmentActivity> activityClass;

声明一个名为activityClass的字段private(仅在声明它的类中可见)和final(无重新分配)。它的类型是Class<? extends FragmentActivity>(它是泛型类型Class<T>的参数化类型或(类型)实例化,其中T是类型参数)。使用泛型类型时,它们称为参数化类型,并为type参数提供类型参数。这里的类型参数是? extends FragmentActivity(实际上是wildcard with an upper bound,这里的上限恰好是FragmentActivity

这意味着activityClass可以引用Class实例,该实例代表类FragmentActivity本身或其任何子类(例如FragmentActivity.class)。

答案 1 :(得分:1)

private-表示此变量无法在此类之外访问 final-一旦分配了值,就无法更改。

因此,私有的最终类是一个只能在此文件中访问的类,并且不能为其分配新值 - 它是常量。

super-每个类都扩展了Object。只有对象在层次结构中没有父级。所以super()调用Object()。它不是必需的,可能是由一个不知道这个的人添加的,或者是曾经有一个父级并且被重构但是错过了这一行的类。

<? Extends FragmentActivity> - 这意味着该类是通用的。它的一些函数可以处理大量的对象,我们将在实例化类时指定它们。现在它是一个? Extends FragmentActivity部分意味着只有扩展FragmentActivity的类才是?的有效值。显而易见的问题是,为什么不让它采取FragmentActivity?使用通用限制所有?是同一类型,而采用基类可以允许它们是混合类型 - ?更具体。

编辑:最初错过了一个大写,并将最终的含义用于类,而不是类。固定的。

答案 2 :(得分:1)

理解陈述

private final Class<? extends FragmentActivity> activityClass;

以及相应的构造函数参数,请记住ObjectgetClass()方法:

public final Class<?> getClass();

此外,如果您有一个命名类型(没有匿名子类),那么您可以使用.class

String s = "a string";
assert s.getClass().equals(String.class);
// String.class is a Class<String> object.

您可以使用此机制进行许多操作。反思是一种,虽然很少见。 Log4J记录器是另一个。

声明一个任意对象类的最安全的方法是:

Thing t = ...;  // assume not null.
Class<? extends Thing> clazz = t.getClass();

毕竟,t可能是Thing的子类的实例,甚至可能是匿名子类。此表达式表示clazzClass对象,clazz的特定类型变量是Thing的某些(不一定是已知的)子类,或者只是{{} 1}}本身。

回到原始表达式,ThingactivityClass或其某个子类型的类对象。如果程序具有0参数构造函数,则程序可以使用FragmentActivity构造它的实例。

答案 3 :(得分:0)

private final Class activityClass;

将阻止其他课程扩展您的课程。您也可以使用方法执行此操作,以便不会覆盖您的方法。 http://docs.oracle.com/javase/tutorial/java/IandI/final.html提供了更多信息

super();

将调用父的构造函数(在这种情况下是您扩展的ListActivity) http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

答案 4 :(得分:0)

好的,我们来看看:

private final Class<? extends FragmentActivity> activityClass;

DemoDetails类将Class作为构造函数参数。此类必须是FragmentActivity类型或其子类。传递Class引用有多种用法,一种是您可以使用activityClass.newInstance()创建新实例。另一种方法是使用runtime checks of types

进行isAssignableFrom()
  

其次我很好奇用super()

调用什么

这绝对没有效果。超类(Object)中没有任何内容,但总是调用super()是个好主意。特别是如果您在稍后阶段决定让DemoDetails继承其他东西。

答案 5 :(得分:0)

 private final Class<? extends FragmentActivity> activityClass;

这一行的含义是activityClass是private和final,它只能保存FragmentActivity的引用变量或FragmentActivity的所有子类。

super(); 

这将调用超类的构造函数,即ListActivity。如果不编写此代码,编译器将自动将此代码附加到.class文件中。

 <? extends temp>

这个测量,这个容器只能保存temp的引用变量或temp的子类。如果一个尝试传递其他ref.var,就会发生编译时错误。所以,它基本上是限制类型的保持参考变量。

答案 6 :(得分:0)

问题1.没有延伸,所以super引用了什么?

Ans: - 默认情况下,每个类都是java中Class对象的子类 .So首先调用Object类空构造函数然后调用子类构造函数。

问题2.private final Class活动类意义?

Ans: - 声明为final的类不能被子类化。 .private类可以在同一个类文件中访问的类通过相同不同包中的其他类文件。

这是<? extends >

的内容

Ans-it是在java.same中作为模板在c ++中实现泛化。