【问题标题】:The use of super(); in Javasuper()的使用;在爪哇
【发布时间】:2013-06-03 06:46:30
【问题描述】:
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 {

所以那时没有扩展,那么 super 引用的是什么?使用

<? extends >

我从来没有见过。

提前谢谢...

【问题讨论】:

  • Java 中的所有类都派生自Object,所以在这种情况下,super() 已过时,可能因为生成了构造函数而存在这一行。
  • @MarcoForberg:如果这里没有显式调用super(),那么无论如何都会隐式调用它。
  • @MarcoForberg:我很确定 ;) 请参阅 Java 语言规范,第 12.5 节创建新类实例第 3 点,Link here
  • 好吧,今天学到了一些东西,ty ;)

标签: java android extends super


【解决方案1】:
private final Class<? extends FragmentActivity> activityClass;

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

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

【讨论】:

    【解决方案2】:

    private- 这意味着这个变量不能在这个类之外访问 final - 一旦分配了值,就无法更改。

    所以私有最终类是一个只能在这个文件中访问的类,不能被赋予新的值——它是一个常量。

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

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

    编辑:最初遗漏了一个大写字母并将 final 的含义用于类,而不是类。固定。

    【讨论】:

    • 私有的最终事物是 Class 对象而不是单独的 class 定义;)
    • 啊,错过了首都。我的错。
    【解决方案3】:

    理解语句

    private final Class<? extends FragmentActivity> activityClass;
    

    以及对应的构造函数参数,记住Object有一个getClass()方法:

    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 的子类的一个实例,甚至可能是一个匿名子类。这个表达式意味着clazz 是一个Class 对象,而clazz 的特定类型变量是Thing 的某个子类,不一定是Thing 的子类,或者可能只是Thing 本身。

    回到原来的表达式,activityClassFragmentActivity 或其某个子类型的类对象。如果程序有一个 0 参数的构造函数,程序可以用 Class.newInstance() 构造它的一个实例。

    【讨论】:

      【解决方案4】:
      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

      【讨论】:

      • super() 在内部类的构造函数中被调用。它与 ListActivity 无关。
      【解决方案5】:

      好的,让我们开始吧:

      private final Class<? extends FragmentActivity> activityClass;
      

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

      其次,我很好奇 super() 叫什么

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

      【讨论】:

        【解决方案6】:
         private final Class<? extends FragmentActivity> activityClass;
        

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

        super(); 
        

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

         <? extends temp>
        

        这意味着,这个容器只能保存 temp 的引用变量或 temp 的子类。如果尝试传递其他 ref.var,则会发生编译时错误。所以,基本上是限制类型要保存的引用变量。

        【讨论】:

          【解决方案7】:

          问题1.没有extends那么super引用了什么?

          Ans:- Java中每个类默认都是Class Object的子类。所以先调用Object类的空构造函数,然后调用子类构造函数。

          问题2.private final Class activity 类的含义?

          Ans:- 声明为 final 的类不能被子类化。私有类是可以在同一个类文件中访问的类并且不能 b> 由相同不同包中的其他类文件。

          这是什么&lt;? extends &gt;

          Ans-it是java中泛化的实现。与c++中的模板相同。

          【讨论】:

          • 问题 2 中的您也一样:它是 Class 而不是 class
          猜你喜欢
          • 1970-01-01
          • 2012-12-26
          • 1970-01-01
          • 2022-10-02
          • 2017-02-05
          • 1970-01-01
          • 2023-03-04
          • 1970-01-01
          • 2013-10-13
          相关资源
          最近更新 更多