简体   繁体   English

是“继承”正确的术语来解释超类的静态方法可以通过子类访问吗?

[英]Is “inherited” the correct term to explain static method of superclass can be accessed by subclass?

Clarification: this question is not about access modifier 澄清:这个问题不是关于访问修饰符

Confirmed that Bm() and bm() statements both works in the following code: 确认Bm()和bm()语句都适用于以下代码:

class A {
  static void m() { //some code }
}

class B extends A {
}

class Example {
  public static void main (String [] args) {
    B.m(); // running A's m() static method
  }

  public void try() {
    B b = new B();
    b.m(); // running A's m() static method
  }
}

My question is can we said "static method is inherited"? 我的问题是我们可以说“静态方法是继承的”吗?

if "inherited" is the correct term, if we add a method to B class we same signature of the static class: 如果“inherited”是正确的术语,如果我们向B类添加一个方法,我们将使用相同的静态类签名:

class A {
  static void m() { //some code }
}

class B extends A {
  static void m() { //some code }
}

class Example {
  public static void main (String [] args) {
    B.m(); // running B's m() static method
  }

  public void try() {
    B b = new B();
    b.m(); // running B's m() static method

    A a = new B();
    a.m(); // running A's m() static method, no polymorphism
  }
}

In this case, notice that we have no polymorphism, is it the correct term to said that "static method is inherited but not overridden, subclass static method hide superclass static method"? 在这种情况下,请注意我们没有多态性,是否正确的术语表示“静态方法是继承但未被覆盖,子类静态方法隐藏超类静态方法”?

Last doubt, for these 2 terms, "inherited" and "overriden", which one is directly tied to the term "polymorphism" ? 最后疑问,对于这两个术语,“继承”和“覆盖”,哪一个与“多态”一词直接相关?

Yes, I think "inherit" is the correct term here, even if it's not as descriptive as it might be. 是的,我认为“继承”在这里是正确的术语,即使它不像它那样具有描述性。 From section 8.4.8 of the Java Language Specification : Java语言规范的8.4.8节

A class C inherits from its direct superclass and direct superinterfaces all non-private methods (whether abstract or not) of the superclass and superinterfaces that are public, protected or declared with default access in the same package as C and are neither overridden (§8.4.8.1) nor hidden (§8.4.8.2) by a declaration in the class. 类C继承自其直接超类,并直接超级接口超类和超级接口的所有非私有方法(无论是否为抽象),这些方法是公共的,受保护的或在与C相同的包中使用默认访问声明,并且都不会被覆盖(§8.4) .8.1)也没有隐藏(§8.4.8.2)在课堂上的声明。

That doesn't specify instance methods, but there are specific restrictions on what is allowed to hide or override what, which wouldn't make sense if static methods were not inherited. 没有指定实例方法, 对什么是允许隐藏或覆盖什么,这是没有意义的,如果继承静态方法的具体限制。

Really though, I would simply view static methods as "accessible without qualification" rather than anything else, given that they don't take part in polymorphism etc. I think it's worth being very clear about that - for example, one static method can hide an inherited one, but it can't override it. 实际上,我只是简单地将静态方法视为“无需资格即可访问”而不是其他任何东西,因为它们不参与多态性等等。我认为值得非常清楚 - 例如,一个静态方法可以隐藏继承的,但不能覆盖它。

In other words, while I think "inherit" is technically correct, I would try to avoid using it without any further explanation. 换句话说,虽然我认为“继承”在技术上是正确的,但我会尽量避免使用它而不做任何进一步的解释。

For your second question, I'd say that based on the above, overriding is tied to polymorphism, but inheriting isn't necessarily. 对于你的第二个问题,我会说基于上面的内容, 覆盖与多态性有关,但继承不一定。

(I would also strongly advise you to avoid calling static methods "via" variables, and also to use the name of the class which declares the static method wherever you specify the name at all. I know that's not part of the question, but I thought I'd just add it anyway...) (我还强烈建议你避免调用静态方法“via”变量,并且还要使用声明静态方法的类的名称,无论你在哪里指定名称。我知道这不是问题的一部分,但是我以为我只是添加它...)

I think trying to apply words like 'inherited' and 'overridden' to this sort of thing is not productive. 我认为尝试将“继承”和“重写”等词语应用于此类事情并不富有成效。 It's misleading because it gives the impression there is something comparable of what goes on with virtual instance methods, and you point out there isn't. 这是误导性的,因为它给人的印象是有一些与虚拟实例方法相似的东西,你指出没有。

(But as Jon Skeet points out, the Java language spec doesn't agree with me, it groups these together in the same section.) (但正如Jon Skeet指出的那样,Java语言规范与我不一致,它将这些内容组合在一起。)

Guys I would like to share my knowledge in java with all java lovers out there! 伙计们我想与所有java爱好者分享我在java中的知识!

First of all let me tell you that static members are those members which can be accessed directly without creating an object of that particular class, when static members of a class is used in some other class then it should be used by specifying the class name .(dot) static member's name(eg Ai in the following example), and also if any subclass class is getting inherited from a super class which has static members and if both subclass and super class are in the same package then that static members can be accessed from the base class without even using the class name of the super class. 首先让我告诉你静态成员是那些可以直接访问而不创建该特定类的对象的成员,当在某个其他类中使用类的静态成员时,应该通过指定类名来使用它。 (点)静态成员的名称(例如以下示例中的Ai),以及如果任何子类类从具有静态成员的超类继承,并且如果子类和超类都在同一个包中,那么静态成员可以是从基类访问,甚至没有使用超类的类名。 Please go through the Example: 请仔细阅读示例:

package myProg; 
class A 
{ 
static int i = 10; 
A() 
{ 
System.out.println("Inside A()"); 
} 
} 

class B extends A 
{ 
public static void main(String[] args) 
{ 
System.out.println("i = " + i); //accessing 'i' form superclass without specifying class name 
System.out.println("A.i = " + A.i); //again accessing 'i' with the class name .(dot) static member 'i' 

/* 
we can also use the super class' object in order to access the static member compiler 
will not show any error but it is not the exact way of using static members. static members are created 
so that it could be used without creating the class object. see below the usage of object to use the 
static member i. 
*/ 
A obj = new A(); //creating class A object and A() also gets called 
obj.i = 20; 
System.out.println("obj.i = " + obj.i); 
} 
} 

/* 
This program was to show the usage of static member. Now, lets discuss on the topic of static member inheritance. 
SO GUYS I WOULD LIKE TO TELL YOU THAT STATIC MEMBERS ARE NOT INHERITED. This undermentioned program is 
to show the inheritance of static members. 
*/ 
class A 
{ 
static int i = 10; //initially the value of i is 10 
static int j = 20; //lets use one more static member int j, just to see the value of it through class A, and B 
static 
{ 
/* 
This is static initialization block(SIB) of class A, 
SIB gets executed first in the order of top to bottom only one time 
when the class is loaded. 
*/ 

System.out.println("A-SIB"); 
} 
} 
class B extends A 
{ 
static 
{ 
i = 12;//trying to modify the i's value to 12 
System.out.println("B-SIB"); 
} 
} 
class D extends A 
{ 
static int k = 15; 
static 
{ 
System.out.println("D-SIB"); 
} 
} 
class C 
{ 
public static void main(String [] arhs) 
{ 
System.out.println("D.k: " + D.k); 
/*here we are trying to access the static member k from class D, 
it will try to search this class and then that class 
will be loaded first i.e. SIB of class D will be loaded and SOP 
statement of class D will be printed first. When the class loading 
is done then the compiler will search for the static int k in class 
D and if found SOP statement will be executed with the value of k. 
*/ 
/* 
ONE GROUND RULE: as soon as the compiler see this statement the compiler will load 
class D into the memory, loading of class into memory is nothing but 
storing all the static members (i.e. static constant & SIBs) into the 
memory. 
*/ 


System.out.println("B.i: " + B.i); 
/*Now, this is what we are talking about... we think that static int i's 
value is there in class B and when we write B.i it compiles and executes 
successfully BUT... there compiler is playing a major role at this statement... 
Try to understand now... we know that class B is the subclass of class A 
BUT when the compiler sees this statement it will first try to search 
the static int i inside class B and it is not found there, then since it is 
the subclass of A, the compiler will search in class A and it is found 
there. NOW, WHEN STATIC INT I IS FOUND IN CLASS A THE COMPILER WILL CHANGE 
THIS STATEMENT B.i TO A.i and the class B WILL NOT AT ALL BE LOADED INTO 
THE MEMORY BECAUSE STATIC I IS ONLY PRESENT IN CLASS A. But in the previous 
statement static int k is present inside class D so when we try to access k's value 
the class D will be loaded into memory i.e. SIB will be executed and then 
the SOP statement of the value of k. USING B.i IS NOT WRONG BUT COMPILER 
ASSUMES THAT THE PROGRAMMER HAS MADE A MISTAKE AND IT REPLACES THE CLASS NAME 
B.i TO A.i. Thus this show that static members are not inherited to the subclass.And 
therefore the vaue of i will NOT BE CHANGE TO 12 AS YOU CAN SEE IN THE SIB OF 
CLASS B, it will be 10 only.. 
*/ 



System.out.println("A.j: " + A.j);//this statement will be executed as it is, compiler will not make 
System.out.println("A.i: " + A.i);//any modifications to these statements.  


System.out.println("B.j: " + B.j);//again compiler will modify this statement from B.j to A.j 

} 
} 

Guys if you still have any confusion mail me at this email-id: pradeep_y2k@yahoo.co.in 如果您仍然有任何疑惑,请通过此电子邮件发送给我:pradeep_y2k@yahoo.co.in

Regards Pradeep Kumar Tiwari 关心Pradeep Kumar Tiwari

好的静态方法不能被覆盖,但可以重新定义,换句话说,它被称为隐藏检查这个http://www.coderanch.com/how-to/java/OverridingVsHiding他们解释得很好

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在子类中访问超类的“protected static”变量,其中子类位于不同的包中..? - How can ‘protected static’ variable of superclass be accessed in the subclass, where subclass resides in different package..? 访问子类中的超类静态方法 - Accessing superclass static method in subclass 在超类静态方法中实例化子类 - instantiate subclass in superclass static method 继承子类方法后自动调用超类方法 - Automatically call superclass method after inherited subclass method 来自超类的静态方法在子类上调用 - Static method from superclass called on subclass 使用超类静态方法获取子类的实例 - Get instance of subclass with superclass static method 使继承的方法使用子类的变量而不是超类 - Make inherited method to use subclass' variables instead of superclass' 我可以从抽象超类上的方法访问子类上定义的静态成员变量吗? - Can I access static member variables defined on the subclass from a method on the abstract superclass? 如何从 Java 的超类中的 static 方法创建子类的新实例? - How can I create a new instance of a subclass from a static method in its superclass in Java? 我可以使用超类的类似工厂的 Static 方法创建子类实例吗? - Can I Create a Subclass Instance Utilising a Factory-like Static Method of the Superclass?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM