标签: super

Java:调用一个调用重写方法的超级方法

public class SuperClass
{
    public void method1()
    {
        System.out.println("superclass method1");
        this.method2();
    }

    public void method2()
    {
        System.out.println("superclass method2");
    }

}

public class SubClass extends SuperClass
{
    @Override
    public void method1()
    {
        System.out.println("subclass method1");
        super.method1();
    }

    @Override
    public void method2()
    {
        System.out.println("subclass method2");
    }
}



public class Demo 
{
    public static void main(String[] args) 
    {
        SubClass mSubClass = new SubClass();
        mSubClass.method1();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的预期输出:

子类method1
超类method1
超类method2

实际产量:

子类method1
超类method1
子类方法2

我在技术上知道我已经覆盖了一个公共方法,但我认为因为我正在调用super,所以超级中的任何调用都会保留在super中,这种情况不会发生.关于如何实现这一点的任何想法?

java inheritance overriding super

86
推荐指数
4
解决办法
9万
查看次数

super.onCreate(savedInstanceState);

我创建了一个Android应用程序项目,并在MainActivity.java> onCreate()中调用它super.onCreate(savedInstanceState).

作为初学者,任何人都可以解释上述行的目的是什么?

android instance super oncreate

81
推荐指数
2
解决办法
8万
查看次数

我什么时候使用super()?

我目前正在学习Java课程中的类继承,我不知道何时使用该super()调用?

编辑:
我发现了这个代码示例:super.variable

class A
{
    int k = 10;
}

class Test extends A
{
    public void m() {
        System.out.println(super.k);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我理解在这里,您必须使用super访问k超类中的变量.但是,在任何其他情况下,做super();什么?在其自己的?

java inheritance super

77
推荐指数
5
解决办法
16万
查看次数

如何强制派生类调用超级方法?(就像Android一样)

我想知道,在创建新Activity类然后重写onCreate()方法时,在eclipse中我总是自动添加:super.onCreate().这是怎么发生的?抽象或父类中是否有一个强制执行此操作的java关键字?

我不知道调用超类是否违法,但我记得在某些方法中我因为没有这样做而抛出异常.这也是内置到java中的吗?你可以使用一些关键字来做到这一点吗?或者它是如何完成的?

java android overriding super

76
推荐指数
5
解决办法
4万
查看次数

什么是通用<?的真实例子?超级T>?

据我所知,它<? super T>代表任何超级类T(T任何级别的父类).但我真的很难想象这个通用绑定通配符的任何现实生活示例.

我明白了什么<? super T>意思,我看过这个方法:

public class Collections {
  public static <T> void copy(List<? super T> dest, List<? extends T> src) {
      for (int i = 0; i < src.size(); i++)
        dest.set(i, src.get(i));
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个真实生活用例的例子,可以使用这种结构,而不是解释它是什么.

java generics inheritance super

74
推荐指数
3
解决办法
4554
查看次数

从超类中获取子类的名称

假设我有一个名为的基类Entity.在那个类中,我有一个静态方法来检索类名:

class Entity {
    public static String getClass() {
        return Entity.class.getClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有另一个类扩展.

class User extends Entity {
}
Run Code Online (Sandbox Code Playgroud)

我想获得User的类名:

System.out.println(User.getClass());
Run Code Online (Sandbox Code Playgroud)

我的目标是看到"com.packagename.User"输出到控制台,但是我将最终得到"com.packagename.Entity",因为Entity类是直接从静态方法引用的.

如果这不是一个静态方法,可以通过thisEntity类中使用关键字(即:)来轻松解决return this.class.getClass().但是,我需要这种方法保持静态.有关如何处理此问题的任何建议?

java class subclass super superclass

70
推荐指数
4
解决办法
8万
查看次数

使用super与类方法

我正在尝试学习Python中的super()函数.

我以为我掌握了它,直到我看到这个例子(2.6)并发现自己卡住了.

http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html#super-with-classmethod-example

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test.py", line 9, in do_something
    do_something = classmethod(do_something)
TypeError: unbound method do_something() must be called with B instance as first argument (got nothing instead)
>>>
Run Code Online (Sandbox Code Playgroud)

当我在示例之前读到这一行时,这不是我的预期:

如果我们使用类方法,我们没有一个实例来调用super.幸运的是,对于我们来说,super甚至可以使用类型作为第二个参数.---类型可以直接传递给super,如下所示.

通过说do_something()应该用B的实例调用,这正是Python告诉我的不可能.

python class object super class-method

68
推荐指数
2
解决办法
4万
查看次数

Python超级方法和调用替代方案

我到处都看到应该通过以下方式调用超类方法:

super(SuperClass, instance).method(args)
Run Code Online (Sandbox Code Playgroud)

这样做有什么不利之处:

SuperClass.method(instance, args)
Run Code Online (Sandbox Code Playgroud)

python class super

56
推荐指数
2
解决办法
3万
查看次数

使用'super'关键字绑定泛型

为什么我super只能使用通配符而不使用类型参数?

例如,在Collection界面中,为什么toArray方法不是这样写的

interface Collection<T>{
    <S super T> S[] toArray(S[] a);
}
Run Code Online (Sandbox Code Playgroud)

java generics language-design super

55
推荐指数
3
解决办法
1万
查看次数

Python的"超级"如何做正确的事情?

我正在运行Python 2.5,因此这个问题可能不适用于Python 3.当您使用多重继承创建钻石类层次结构并创建派生最多类的对象时,Python会执行Right Thing(TM).它调用派生最多类的构造函数,然后调用从左到右列出的父类,然后是祖父母.我熟悉Python的MRO ; 那不是我的问题.我很好奇从super返回的对象实际上如何管理与父类中的super调用正确的顺序进行通信.考虑这个示例代码:

#!/usr/bin/python

class A(object):
    def __init__(self): print "A init"

class B(A):
    def __init__(self):
        print "B init"
        super(B, self).__init__()

class C(A):
    def __init__(self):
        print "C init"
        super(C, self).__init__()

class D(B, C):
    def __init__(self):
        print "D init"
        super(D, self).__init__()

x = D()
Run Code Online (Sandbox Code Playgroud)

代码做直观的事情,它打印:

D init
B init
C init
A init
Run Code Online (Sandbox Code Playgroud)

但是,如果你在B的init函数中注释掉对super的调用,则不会调用A和C的init函数.这意味着B对super的调用在某种程度上意识到C在整个类层次结构中的存在.我知道super返回一个带有重载get运算符的代理对象,但是在D的init定义中super返回的对象如何将C的存在传达给B的init定义中super返回的对象?后续超级使用调用的信息是否存储在对象本身上?如果是这样,为什么不是超级而不是self.super?

编辑:Jekke非常正确地指出它不是self.super,因为super是类的属性,而不是类的实例.从概念上讲,这是有道理的,但在实践中,超级也不是班级的属性!您可以在解释器中通过创建两个类A和B来测试它,其中B继承自A,并且调用dir(B).它没有super__super__属性.

python constructor multiple-inheritance super python-2.5

51
推荐指数
3
解决办法
3万
查看次数