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中,这种情况不会发生.关于如何实现这一点的任何想法?
我创建了一个Android应用程序项目,并在MainActivity.java> onCreate()中调用它super.onCreate(savedInstanceState).
作为初学者,任何人都可以解释上述行的目的是什么?
我目前正在学习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();什么?在其自己的?
我想知道,在创建新Activity类然后重写onCreate()方法时,在eclipse中我总是自动添加:super.onCreate().这是怎么发生的?抽象或父类中是否有一个强制执行此操作的java关键字?
我不知道调用超类是否违法,但我记得在某些方法中我因为没有这样做而抛出异常.这也是内置到java中的吗?你可以使用一些关键字来做到这一点吗?或者它是如何完成的?
据我所知,它<? 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)
我正在寻找一个真实生活用例的例子,可以使用这种结构,而不是解释它是什么.
假设我有一个名为的基类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类是直接从静态方法引用的.
如果这不是一个静态方法,可以通过this在Entity类中使用关键字(即:)来轻松解决return this.class.getClass().但是,我需要这种方法保持静态.有关如何处理此问题的任何建议?
我正在尝试学习Python中的super()函数.
我以为我掌握了它,直到我看到这个例子(2.6)并发现自己卡住了.
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告诉我的不可能.
我到处都看到应该通过以下方式调用超类方法:
super(SuperClass, instance).method(args)
Run Code Online (Sandbox Code Playgroud)
这样做有什么不利之处:
SuperClass.method(instance, args)
Run Code Online (Sandbox Code Playgroud) 为什么我super只能使用通配符而不使用类型参数?
例如,在Collection界面中,为什么toArray方法不是这样写的
interface Collection<T>{
<S super T> S[] toArray(S[] a);
}
Run Code Online (Sandbox Code Playgroud) 我正在运行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__属性.
super ×10
java ×6
class ×3
inheritance ×3
python ×3
android ×2
generics ×2
overriding ×2
class-method ×1
constructor ×1
instance ×1
object ×1
oncreate ×1
python-2.5 ×1
subclass ×1
superclass ×1