欧博客户端下载:Java入门系列之重写

admin 4周前 (07-11) 科技 17 0

前言

关于所有Java系列文章面向有一定基础的童鞋,所写每一篇希望有一定含金量,有些内容可能会从Java整个语法全局思量穿插后续要解说的内容以成系统,若不明白,请看完后再学习。上一节我们解说完了final关键字,本节我们继续来对比解说Java和C#中的重写,二者语言的重写区分异常清晰,Java子类中基类方式署名一样或通过注解@Override显式声明,C#中基类通过virtual关键字修饰,子类通过ovveride关键字示意重写,详细细节请往下看。

重写

既然是重写一定就涉及到继续,我们首先来看看Java中的重写是怎样的呢?如下:

public class Main {
    public void f() {
        System.out.println("Main.f");
    }

    public static void main(String[] args) {
        Main main = new Sub();
        main.f();
    }
}

class Sub extends Main {
    public void f() {
        System.out.println("Sub.f");
    }
}

当挪用基类的f方式时,此时发现已被子类所重写,以是如上正常打印出Sub.f,要是我们将上述基类中方式修改为私有的呢

可能我们期待输出子类中的打印效果,然则修改为私有后,说明此时对子类不再可见,也就相当于使用了final,在这种情形下,子类中方式则是一个全新的方式,很显然说明:只有非私有方式才可以被重写。对于这种情形下编译不会报错, 然则也不会凭据我们所期望的效果来执行,以是建议对于基类中的私有方式命名为和子类差别的名字,为了让重写一目了然或加倍明确,在1.5版本公布了注解功效,我们可以通过注解来显式声明要重写基类方式,若基类为私有,此时通过注解则会编译报错,由于找不到要重写的方式,这种体验加倍友好,好比如下:

public class Main {
    private void f() {
        System.out.println("Main.f");
    }

    public static void main(String[] args) {
        Main main = new Sub();
        main.f();
    }
}

class Sub extends Main {

    //编译错误,未找到基类(超类)中要重写的方式
    @Override
    public void f() {
        System.out.println("Sub.f");
    }
}

闻一知十,我们来思索一个问题,是不是方式署名一致,子类就可以重写基类方式呢?很显然不是,若是静态方式,一定不能被重写,若是通过注解@Override声明那么一定编译报错,否则挪用基类方式,对于接口中的静态方式同理。以是照样建议使用注解来声明重写。那么为什么通过注解显式声明重写基类方式或通过关键字final修饰方式就会在编译阶段报错呢?由于它们在编译阶段就完成了静态绑定,而不是运行时动态绑定。问题又来了,上述我们解说到若在子类中不通过注解显式声明重写,同时在基类中方式私有,此时一定可以编译通过(上述已演示),并且会挪用基类方式并打印出效果,事实情形一定是这样吗?很显然也不是云云,如下示例:

class Super {
    private void f() {
        System.out.println("Super.f");
    }
}

class Derived extends Super {
    public void f() {
        System.out.println("Derived.f");
    }
    public static void main(String[] args) {
        Super aSuper = new Derived();
        
        //编译报错(由于基类方式私有)
        aSuper.f();
    }
}

初一看,这不是一样么,其实是不一样,上述可以那是由于挪用方在基类内里,固然可以挪用内部的私有方式,如上情形只对基类内部私有, 固然也就不能挪用,这里就又引出一个问题,是不是声明为基类的私有方式,子类就无法举行重写呢?凭据我们上述打印的效果来看,理论上不可行,事实情形是可以的,通过内部类(后续会出文章详细解说)来实现。

class Main {

    private void f() {
        System.out.println("Main.f");
    }

    class Inner extends Main {
        private void f() {
            System.out.println("Inner.f");
        }
    }

    public static void main(String args[]) {

        //内部类实例必须通过外部类实例建立
        Main outer = new Main();
        Inner inner = outer.new Inner();

        //内部类可以在内部接见外部的所有成员(包罗私有)
        inner.f();

        // 挪用外部类方式
        outer = inner;
        outer.f();
    }
}

欧博客户端下载:Java入门系列之重写 第1张

C#若明确需要重写,那么基类方式声明为虚有的virtual,子类通过ovverride关键字修饰方式到达重写目的,若没有这两个关键字,和Java中一样只是方式署名一致,那么说明编译器会提醒是否通过new关键字来解释隐藏基类的方式

class Program
{
    public void F()
    {
        Console.WriteLine("Main.f");
    }

    static void Main(string[] args)
    {
        Program program = new Sub();
        program.F();

        Console.ReadKey();
    }
}

class Sub : Program
{
    public new void F()
    {
        Console.WriteLine("Sub.f");
    }
}

总结

Java和C#中的重写区分度异常清晰,Java中只要方式署名一致就可以到达重写,不外建议通过注解方式来显式声明重写以免引起不必要的问题,同时,纵然基类方式私有,我们也可借助于内部类来实现重写。

,

欧博代理

欢迎进入欧博代理(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

Sunbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:欧博客户端下载:Java入门系列之重写

网友评论

  • (*)

最新评论

标签列表

    文章归档

      站点信息

      • 文章总数:671
      • 页面总数:0
      • 分类总数:8
      • 标签总数:1160
      • 评论总数:283
      • 浏览总数:12748