28

私有方法可以在 Java 中被覆盖吗?如果不是,那么下面的代码是如何工作的?

class Base{
      private void func(){
            System.out.println("In Base Class func method !!");         
      };
}

class Derived extends Base{
      public void func(){   //  Is this a Method Overriding..????        
            System.out.println("In Derived Class func method"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived();
            d.func(); 
      }
}
4

12 回答 12

51

不,你没有覆盖它。您可以通过尝试用 标记@Override或尝试拨打 来检查super.func();。两者都行不通;他们抛出编译器错误。

此外,检查一下:

类基{
      私人无效函数(){
            System.out.println("在基础函数方法中");         
      };
      公共无效 func2() {
          System.out.println("func2");
          函数();
      }
}

类派生扩展基{
      public void func(){ // 这是一个覆盖方法吗?
            System.out.println("在派生类函数方法");
      }
}

类继承演示{
      公共静态无效主要(字符串[]参数){
            派生 D = new Derived();
            D.func2();
      }
}

它将打印:

func2
In base func method

当您更改func()Basepublic 时,它将被覆盖,并且输出将更改为:

func2
In Derived Class func method
于 2012-08-15T20:17:57.357 回答
21

不,私有方法不能被覆盖,因为子类不继承其父类的私有成员。您已经为您的子类声明了一个与超类方法无关的新方法。super.func()一种看待它的方法是问自己在 Derived 类中编写是否合法。不可能禁止覆盖方法访问它覆盖的方法,但这正是这里的情况。

于 2012-08-15T20:10:29.497 回答
3

你没有压倒一切。您不能覆盖私有成员,您只是在 Derived 中定义一个新方法。Derived 没有知识库的实现,func()因为它被声明为私有。在 Derived 中定义时不会出现编译器错误,func()但这是因为 Derived 不知道 Base 具有func(). 需要明确的是:说您正在覆盖 Base 的func().

于 2012-08-15T20:10:29.920 回答
3

不它不是。您可以标记一个覆盖只是为了确保这样:

@Override
public void func(){
     System.out.println("In Derived Class func method"); 
}

在这种情况下,这将是一个编译器错误。

于 2012-08-15T20:08:37.630 回答
3

除了已经正确的答案之外,请考虑以下内容:

public class Private {
    static class A {
        public void doStuff() {
            System.out.println(getStuff());
        }

        private String getStuff() {
            return "A";
        }
    }

    static class B extends A {
        public String getStuff() {
            return "B";
        }
    }

    public static void main(String[] args) {
        A a = new A();
        a.doStuff();
        a = new B();
        a.doStuff();
        B b = new B();
        b.doStuff();
    }
}

这将打印

一个

一个

一个

虽然B“覆盖” getStuff()A的实现doStuff()固定为调用A#getStuff(),不会触发多态性。

于 2018-04-15T07:28:06.840 回答
1

不,因为如果您执行类似的操作,Base b = new Derived();您仍然无法调用 b.func()。你正在做的事情被称为“隐藏”。

于 2012-08-15T20:13:54.310 回答
0

私有方法永远不能被覆盖。它总是隐藏的。

在您的示例中 - 派生类有一个父类私有方法,并且有自己的函数func。两者都是不同的,并且func没有被覆盖。它是一个单独的独立功能。

如果在调用父类函数的父类中创建一个新函数,父类函数将被调用,如果使用父类引用,而不是在方法覆盖的情况下

注意:对象定义了它拥有的成员,引用定义了它可以访问的成员

// Method Overriding case

class Base{
      public void func(){
            System.out.println("Parent class");         
      };                                                                   
      public void func1(){                                                
            func();                                                             
       }                                                                        
 }

class Derived extends Base{
      public void func(){         
            System.out.println("Derived class"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived();                               
            d.func1(); // Prints Derived class                                          

            Base b = new Derived();                                    
            b.func1();                                                         // Prints Derived class - no matter parent reference is calling,as there as method is overridden - Check func1() is in parent class, but id doesn't call parent class func() as the compiler finds a func() method over ridden in derived class    

      }
}

// Method Hidding case - Private and static methods case  

class Base{
      private void func(){
            System.out.println("Parent class");         
      };                                                                   
      public void func1(){                                                
            func()                                                              
      }     
}

class Derived extends Base{
      public void func(){   //  Is this a Method Overriding..????        
            System.out.println("Derived class"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived(); 
            d.func1(); // Prints Derived class
            Base b = new Derived();
            b.func1(); 
// Prints Parent class - the reason is we are using the parent class reference, so compiler is looking for func() and it founds that there is one private class method which is available and is not over ridden, so it will call it. Caution - this won't happen if called using derived class reference.

            b.func();
// this prints the Derived class - the compiler is looking func(), as Derived class has only one func() that it is implementing, so it will call that function. 

      }
}
于 2018-03-25T17:50:13.497 回答
0

基类的私有成员不能被类外的任何人访问,也不能被覆盖。派生类中的函数是一个独立的函数,可以在任何地方访问。

该代码将在派生类中运行该函数

于 2018-03-27T00:38:52.883 回答
0

方法隐藏将在这里发生,而不是覆盖。就像在静态的情况下会发生什么。

于 2016-08-09T09:30:50.323 回答
0

实际上,您并没有压倒一切。Java5 之前

重写方法的返回类型必须与父类的方法匹配。

但是 Java 5 引入了一种称为协变返回类型的新工具。您可以覆盖具有相同签名的方法,但返回返回对象的子类。换句话说,子类中的方法可以返回一个对象,该对象的类型是该方法返回的类型的子类,在超类中具有相同的签名。你可以关注这个线程:被覆盖的方法可以在返回类型上有所不同吗?

于 2017-01-05T08:39:33.000 回答
0

由于该方法是私有的,它对其他类不可见。因此派生类不继承此方法。所以这不是覆盖的情况

于 2015-12-03T10:22:45.137 回答
-1

阅读以下代码片段中的注释以找到答案。

资料来源:

  1. 定义参考:

  2. 来自“Jeanne Boyarsky”和“Scott Selikoff”一书的源代码示例(参考)的学分 - “OCA Oracle Certified Associate Java SE 8 Programmer Study Guide Exam 1Z0-808 Book”。

     public class Deer {
            public Deer() { System.out.print("Deer"); }
            public Deer(int age) { System.out.print("DeerAge"); }
            private boolean hasHorns() {  return false; }
            public static void main(String[] args) {
                Deer deer = new Reindeer(5);
                System.out.println(","+deer.hasHorns());// false is printed.
            }
        }
        class Reindeer extends Deer {
            public Reindeer(int age) { System.out.print("Reindeer"); }
            private boolean hasHorns() { return true; } // Overriding possible, but is of no use in the below context.
            // Below code is added by me for illustration purpose
            public static void main(String[] args) {
                Deer deer = new Reindeer(5);
                //Below line gives compilation error.
                //System.out.println(","+deer.hasHorns());
            }
        }
    
于 2018-03-16T12:00:46.727 回答