精华内容
下载资源
问答
  • 本来想试试final能不能被重载,后来想想还是都整理一下吧。 final修饰的类不能继承验证 public class FinalTest { public static void main(String[] args){ Parent parent = new Son(); System.out.println...

    本来想试试final能不能被重载,后来想想还是都整理一下吧。

    1. final修饰的类不能被继承验证

      public class FinalTest {
          public static void main(String[] args){
              Parent parent = new Son();
              System.out.println(parent.getAge());
          }
      
          static final class Parent {
              private int age;
      
              public final int getAge() {
                  return age;
              }
          }
      
          static class Son extends Parent {
      
          }
      }
      

      结果:编译不通过

      java: 无法从最终FinalTest.Parent进行继承
      
    2. final修饰的方法不能被重写

      static class Parent {
          private int age;
      
          public final int getAge() {
              return age;
          }
      }
      
      static class Son extends Parent {
          @Override
          public int getAge() {
              return super.getAge();
          }
      }
      

      结果:编译不通过

      java: FinalTest.Son中的getAge()无法覆盖FinalTest.Parent中的getAge()
        被覆盖的方法为final
      

      补充:final修饰的方法能否被重载

      public class FinalTest {
          public static void main(String[] args){
              Parent parent = new Parent(3);
              System.out.println(parent.getAge());
              System.out.println(parent.getAge(5));
          }
      
          static class Parent {
              private int age;
      
              public Parent(int age) {
                  this.age = age;
              }
      
              public final int getAge() {
                  return age;
              }
      
              public final int getAge(int age) {
                  return age;
              }
          }
      }
      

      结果:可以

      3
      5
      
    3. final修饰的变量:

      1. 基本类型不能更改值

        public class FinalTest {
            public static void main(String[] args){
                final int a = 5;
                a = 10;
            }
        }
        

        结果:不行

        java: 无法为最终变量a分配值

      2. 对象数据类型不能修改指向,但是可以修改内容

        public class FinalTest {
            public static void main(String[] args){
                final int[] a = {1,2,3};
                a = new int[5];
            }
        }
        

        结果:不行

        java: 无法为最终变量a分配值

        public class FinalTest {
            public static void main(String[] args){
                final int[] a = {1,2,3};
                a[0] = 5;
                System.out.println(Arrays.toString(a));
            }
        }
        

        结果:可以修改内容

        [5, 2, 3]

    综上所述,其实final只是表示一种不可变的语义。对于对象来说,只是说指向对象的指针不能变,但是通过指针修改内容是可以的

    那么其实就有意思了,很多人说String只是因为value通过final修饰了,所以不可变。

    其实在effective java有介绍过,如果真的想要实现属性不可变

    1. 把属性设置为final
    2. 不要对外提供任何可以修改该属性的方法

    其实这就是String实现不可变的原因,没有提供任何可以修改的方法,并且本身使用final修饰来保证不会发生指向改变。

    展开全文
  • 首先我们先看下final在java中的作用 final在Java中可以用来修饰类、... final修饰的方法可以被继承和重载,但不能重写 3. final修饰的变量不能修改,是个常量 举例说明: public class Person { private S...

    首先我们先看下final在java中的作用

    final在Java中可以用来修饰类、修饰方法和修饰变量

     1. final修饰的类,为最终类,该类不能被继承。如String 类
        
     2. final修饰的方法可以被继承和重载,但不能被重写
            
     3. final修饰的变量不能被修改,是个常量
    

    举例说明:

    public class Person {
    
        private String name;
        private int age;
        private String sex;
    
        final public void work(){ //final 修饰的最终方法 可以被子类继承,但不能被重写
            System.out.println("a person can do work");
        }
    
        final public void work(int age){ //重载一个final类
            System.out.println("a person can do another work");
        }
    
        public void eat(){   //普通方法  可以被子类继承、重写
            System.out.println("a person need to eat");
        }
    
        public static void sleep(){  //静态方法  可以被继承
            System.out.println("a person need to sleep");
        }
    }
    

    子类继承了父类Person 重写了父类普通方法eat() ,但不能重写父类final修饰的方法和静态方法

    public class Man extends Person{
        
        public void eat(){
            System.out.println("the man also need do eat");
        }
    
        public static void sleep(){
            System.out.println("the man also need to sleep");
        }
    
    }
    

    注意:
    在Java中静态方法可以被继承,但是不能被覆盖,即不能重写。
    如果子类中也含有一个返回类型、方法名、参数列表均与之相同的静态方法,那么该子类实际上只是将父类中的该同名方法进行了隐藏,而非重写。(比如子类Man 中的sleep方法)

    展开全文
  • final方法不能覆盖,可被重载(方法名相同而参数不同) Given: class Pizza { java.util.ArrayList toppings; public final void addTopping(String topping) {  // 这里不能用final,无法覆盖,应...

    (转载)

    final方法不能被覆盖,可被重载(方法名相同而参数不同)

    Given:

    class Pizza {
    java.util.ArrayList toppings;
    public final void addTopping(String topping) { 
    // 这里不能用final,无法覆盖,应改成void
    toppings.add(topping);
     }
     }
     public class PepperoniPizza extends Pizza {
    public void addTopping(String topping) {
    System.out.println("Cannot add Toppings");
    }

     public static void main(String[] args) {
     Pizza pizza = new PepperoniPizza();
     pizza.addTopping("Mushrooms");
    }
    }

    What is the result?
    A. Compilation fails.
    B. Cannot add Toppings
    C. The code runs with no output.
    D. A NullPointerException is thrown in Line 4.

    Answer: A

    ------------------------------------
    final方法是不能被覆盖的方法,但可以被重载(即方法名相同而参数不同).另外有一个很容易被搞糊涂的地方是当方法是private final时.首先要知道的是:当一个方法被声明为private时,该方法隐式的指定为final!说到这里,也许你就会有产生一个疑问,既然private被隐式地指定为fianl,那么为什么它可以被覆盖?就象下面的程序为什么可以运行?
    class Father {
    private final void f() { //即使这里你不显示的加上final,它隐式的就是final
    System.out.println("Father.f()");
    }
    }
    public class Son extends Father {
    private final void f() { //看上去象不象覆盖??
    System.out.println("Son.f()");
    }
    void test() {
    f();
    }

    public static void main(String[] a) {
    new Son().test();

    }

    } //本程序的输出结果为: Son.f() ???
    在阐明这个问题前,先来了解一下什么叫做覆盖.
    “覆盖”只有在某方法是基类接口的一部分时才发生。即,必须能将一个对象向上转型为它的基类并调用相同的方法.如果一个方法是private的,它就不是基类接口的一部分,它只是隐藏在类里面的一些代码罢了!

    正如我们刚才说的,private默认的是final,可见,private方法是不能被覆盖。但是因为它可以以相同的名字存在于子类中,所以“看上去”它被“覆盖”了。从子类来看,它根本不知道父类有这个方法(因为private的权限是定义它的类本身才能使用它,因此private方法就不能被带到子类中),而父类也不知道子类有这个方法,它们是独自存在于各自类的内部的,与接口无关。所以,我们并没有覆盖private方法,只是创建了一个新的方法,而碰巧也有那个名字!
    展开全文
  • 在animal类中重载了shout方法,但子类dog和cat中重写shout方法报错

    在animal类中重载了shout方法,但子类dog和cat中重写shout方法报错

    展开全文
  • 1.final修饰变量,则等同于常量 2.final修饰方法中的参数,称为最终参数。 3.final修饰类,则类不能继承 4.final修饰方法,则方法不能重写。 ... final 不能修饰抽象类...final修饰的方法可以被重载 但不能重写
  • 这是一次阿里面试里问到的题目,在我的印象中,final修饰的方法是不能被子类重写的。如果在子类中重写final修饰的方法,在编译阶段就会提示Error。但是回答的时候还是有点心虚的,因为final变量就可以用反射的方法...
  • Question 1: 子类是否可以重写父类的final方法,...子类是否可以重载父类的final方法,答案是可以的! 父类Add  子类 SubAdd: Question 3: 重载方法中 int ,char 如何自动适配重载函数的!
  • 方法重载(overload)(在一个类中进行) * 方法的重写(Override) (前提:至少两个类 并且有继承关系) * 方法的重写 作用:相当于 对父类的该方法 进行升级 * 重写:跟父类的方法完全一致 * * 书写一个类 都...
  • “覆盖”只有在某方法是基类的接口的一部分时才会出现。即,必须能将一个对象向上转型为它的基本类型并调用相同的方法。 class StaticSuper{ public static void staticGet() { System.out.println(...
  • 1、父类中的静态方法可以被继承、但不能被子类重写。2、如果在子类中写一个和父类中一样的静态方法,那么该静态方法由该子类特有,两者不构成重写关系。final修饰: 1、修饰类表示不允许继承。2、修饰方法表示不...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    值传递 当一个对象当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 为什么 Java 中只有值传递 值传递和引用传递有什么区别 Java包 JDK 中常用的...
  • Java方法重载

    万次阅读 多人点赞 2018-12-06 10:23:33
    方法重载 如果一个类中有多个具有相同名称但参数不同的方法,则称为方法重载。如果只需要执行一个操作,具有相同的方法名称将增加程序的可读性。 假设必须执行给定数值的添加操作...正确的方式可以重载: 两个参...
  • 方法重写与方法重载的区别详解

    万次阅读 多人点赞 2019-05-24 21:44:46
    文章目录1、方法重写(Override)概念:好处:注意:重写规则:2、方法重载(Overload)概念:注意重载规则:3、重写与重载直接的区别4、简明了解5、总结(硬)6、图解 1、方法重写(Override) 概念: 重写是子类对...
  • 持续原创输出,点击上方蓝字关注我吧作者:不才陈某 博客:https://chenjiabing666.github.io/目录前言环境配置错误示范为什么不能重载?如何找到XML中对应的S...
  • 子类能重载父类的方法

    千次阅读 2020-02-13 10:44:02
    1、方法重载:在同一个类中,方法名相同,参数列表...所以这个时候,在子类中就可以重载从父类继承过来的方法,但是其实继承父类的方法之后,这个方法就相当于是子类的方法,所以这个时候重载就满足在同一个类中。 ...
  • 可以将重复代码抽取到父类中 方便修改代码 减少代码量 特征: 继承是代码重用的一种方式 将子类共有的属性和行为放到父类中 符合is-a关系的设计使用继承 关键字、格式及规则: 关键字 : extends 规则:只能...
  • 一.重载 重载(Overloading): [ruby]view plaincopyprint?...(1)方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,... (2)Java的方法重载,就是在类中可以创建多个方法,它们具...
  • final修饰的Map集合可以被修改

    千次阅读 2020-05-11 09:35:27
    final就是的方法不能重写,可以被重载final修饰的变量不可修改。 到这里是没有毛病的,但是为什么map就可以修改呢? 这里我在网上查阅了一些博客,资料说的是final修饰的变量不可修改说的是 引用 不可修改...
  • 重载方法名相同,但是参数必须有区别(参数不同可以使类型不同,顺序不同,个数不同)。 覆盖: 子类继承父类的方法,并重新实现该方法。 构造方法:和类同名。为新建对象开辟内存空间后,用于初始化新建的...
  • 使用final来修饰方法

    万次阅读 2018-06-07 09:15:26
    如果使用final来修饰方法,那么表示该方法不能被重写,如果在父类中使用final 来修饰方法,那么该方法就被定义为private,即不可重写,即方法被私有化了。 demo 父类 中有一个用final 声明的speak方法,子类继承...
  • 先给出答案:可以被子类继承,不能被子类重写。 关于父类和子类关系还不太了解的看一去看一下链接https://blog.csdn.net/qq_34826261/article/details/97635047,里面详细解释了父类和子类不同情况下成员方法和成员...
  • 面试题  以下关于final关键字说法错误的是(A...C) final修饰的方法不能被重载 D) final修饰的变量不允许再次赋值 一、final关键字可以用来修饰类、方法、变量。各有不同。 A、修饰类(class)。   1、
  • Java基础【方法 重载

    万次阅读 多人点赞 2018-10-20 19:17:14
    在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法。 如:小明同学在路边准备坐车来学校学习。这就面临着一件事情(坐车到学校这件事情)需要解决,解决办法呢?可采用坐公交车或坐出租车的方式来...
  • java中方法重载和重写的区别

    千次阅读 2018-08-16 10:34:08
    方法重载和重写,光从名称上来说,很类似,也很...方法重载其实是同一个类中多态性的表现,调用者可以依据传入不同个数或者不同类型的参数来决定最终调用哪一个同名的方法方法重载其实是程序编译时的多态性,即代...
  • MyBatis方法不支持重载--我有妙招

    千次阅读 多人点赞 2019-12-16 20:21:07
    使用JDK1.8 default关键字解决Mybatis方法不支持重载问题 配置: mybatis > 3.4.2 JDK > 1.8 问题 Mybatis中对接口方法重载没有提供优雅的支持,然而方法重载是对代码复用的一个重要手段。 场景 用户和...
  • static和final修饰方法

    千次阅读 2017-08-19 17:18:33
    static修饰的方法是静态方法,所有的对象共用一份,也就是共享方法。static方法可以被继承,然后可以被...final修饰的方法是不可变方法final方法所在类继承时,被final修饰的方法是不能重写的,但是可以重载
  • static方法能否重写

    万次阅读 多人点赞 2016-09-11 15:51:54
    在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写(Override)。... 那么,我们便可以据此来对static方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 122,687
精华内容 49,074
关键字:

final方法可以被重载吗