2010-01-01 4 views

ответ

25

Да, перегрузка окончательного метода совершенно законна.

Например:

public final void doStuff(int x) { ... } 
public final void doStuff(double x) { ... } 
1

Да Возможно.

Вы можете изучить такие вещи, написав небольшие классы Java.

class TestClass{ 
    final public void testMethod(){ 

    } 

    final public void testMethod(int i){ 

    } 
} 
2

ДА, почему нет? Это так же законно, как перегрузка неконфиденциальных методов.

Но вы не можете изменить их (вы уже знаете).

Например:

public final void func(String x) {/* code */} 
public final void func(double x) { /* more code */ } 
public final void func(int x) { /* yeah I have still more code */ } 
+0

Почему один голос? –

0

да перегрузки окончательного метода возможно в java.As окончательных методы ограничены, чтобы не перекрывать методы.

при перегрузке списка аргументов должен быть другой тип метода перегрузки.

8

Да, очень возможно.

Небольшая программа для демонстрации его:

class A{ 
    final void foo(){ System.out.println("foo ver 1 from class A"); } 
    final void foo(int a){ System.out.println("foo ver 2 from class A"); } 
    } 


class B extends A{ 
    final void foo(long l){ System.out.println("foo ver 3 from class B"); } 
    // final void foo(){ System.out.println("foo ver 1 from class A"); } NOT ALLOWED 
} 

public class Test {  
    public static void main(String [] args){ 
     B obj = new B(); 

     obj.foo(); 
     obj.foo(1); 
     obj.foo(1L); 
    } 
} 

Выход:

 
foo ver 1 from class A 
foo ver 2 from class A 
foo ver 3 from class B 
13

Да, но имейте в виду, что динамический отправка не может делать то, что вы ожидаете! Быстрый пример:

class Base { 
    public final void doSomething(Object o) { 
     System.out.println("Object"); 
    } 
} 

class Derived extends Base { 
    public void doSomething(Integer i) { 
     System.out.println("Int"); 
    } 
} 

public static void main(String[] args) { 
    Base b = new Base(); 
    Base d = new Derived(); 
    b.doSomething(new Integer(0)); 
    d.doSomething(new Integer(0)); 
} 

Это будет печатать:

Object 
Object
+1

Да, поскольку для обоих объектов, созданных в основном методе, задан самый высокий родительский тип данных 'Base', они оба будут печатать« * Object * ». Поскольку экземпляр «Derived» имеет отношение «* is *» к классу «Base», этот объект может быть передан в 'Derived' для вызова метода, который печатает« * Int * ». –

+0

@IanCampbell Exactly '((Производный) d) .doSomething (1);' –

+0

Динамическая отправка происходит, когда вы переопределяете методы, а не с перегрузкой. – sharhp

0

да мы можем перегружать окончательные методы

1

Да:

class a { 
    final void method1(int a,int b) { 
    System.out.println("super class"); 
    int d = a+ b; 
    System.out.println(d); 
    } 
} 
class b extends a{ 
    final void method1(int a) { 
    System.out.println("sub class"); 
    System.out.println(a); 
    } 
} 
public class c { 
    public static void main(String ar[]) { 
    b m = new b(); 
    m.method1(10); 
    } 
} 
+1

Вы должны отформатировать свой код и добавить что-то, чтобы объяснить свой ответ. – Jonathan