首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Java中,为什么我不能在父类中声明最终成员并在子类中设置它的值?

在Java中,当一个成员被声明为final时,它的值不能被改变。这意味着在父类中声明一个最终成员变量后,它的值必须在声明时或者构造函数中初始化。一旦一个最终成员变量被初始化,它的值就不能再被改变。

在继承关系中,子类不能直接修改父类中声明的最终成员变量的值,因为这违反了final成员变量的不可变性。如果子类需要设置父类中声明的最终成员变量的值,可以考虑使用构造函数或者setter方法来实现。

例如,在父类中声明一个最终成员变量:

代码语言:java
复制
public class Parent {
    private final int value;

    public Parent(int value) {
        this.value = value;
    }
}

在子类中,可以通过调用父类的构造函数来设置父类中声明的最终成员变量的值:

代码语言:java
复制
public class Child extends Parent {
    public Child(int value) {
        super(value);
    }
}

或者,可以使用setter方法来设置最终成员变量的值:

代码语言:java
复制
public class Parent {
    private final int value;

    public Parent(int value) {
        this.value = value;
    }

    public void setValue(int value) {
        // do nothing
    }
}

public class Child extends Parent {
    public Child(int value) {
        super(value);
    }

    @Override
    public void setValue(int value) {
        super.setValue(value);
    }
}

需要注意的是,在这种情况下,setter方法实际上不会改变最终成员变量的值,因为它是final的。这种方法只是为了保持代码的一致性和可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java基础八股文(背诵版)

Java 代码块执行顺序 静态代码块(只执行一次) 子类静态代码块(只执行一次) 构造代码块 构造函数 子类构造代码块 子类构造函数 普通代码块 面向对象三大特性?...不同对象调用相同方法即使参数也相同,最终表现行为是不一样为什么 Java 语言不支持多重继承? 为了程序结构能够更加清晰从而便于维护。...如果子类改写了方法,那么子类那些同名方法共享一个方法表项,都被认作是方法。因此可以实现运行时多态。 Java 提供多态机制?...静态内部类不能与外部类有相同名字,不能访问普通成员变量,只能访问外部类静态成员和静态成员方法。 为什么要把 String 设计为不可变?...@Inherited:一个被@Inherited 注解了注解修饰了一个,如果他子类没有被其他注解修饰,则子类也继承了注解。

44.1K2738

Java 继承、多态与复用

如果两个存在继承关系,则子类会自动继承方法和变量,子类可以直接调用方法和变量。需要指出是,java,只允许单继承,也就是说,一个最多只能显式地继承于一个。...因为其是 final ,因而没有默认;且又是static,因此没有实例化时,其已被赋值,所以只能在声明时初始化。 ---- 四....子类对象使用这个方法时,将调用该方法子类定义,对而言,该方法定义被屏蔽了。 总的来说,重载和覆盖是Java多态性不同表现。...覆盖是一种动态绑定多态机制。即,子类具有相同签名方法具有不同具体实现,至于最终执行哪个方法 根据运行时实际情况而定。...隐藏:指运行时系统调用当前对象引用 编译时类型 定义方法,即 被声明或者转换为什么类型就调用对应类型方法或变量,属于编译期绑定。

70420

Java面向对象问题汇总

1.5、为什么是单继承而不能多继承呢? 如果在一个子类继承多个拥有相同名字实例变量,子类引用该变量时将产生歧义,无法判断应该使用哪个变量。...如果在一个子类继承多个拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个方法。 1.6、为什么是多实现呢?...3、内部类 3.1、什么是内部类 内部类就是定义另外一个里面的隐藏在外部类,封装性更强,不允许除外部类外其他访问。但它可直接访问外部类成员。...; 局部内部类: 局部内部类和成员内部类一样被编译,只是作用域发生了改变,能在该方法和属性中被使用,出了该方法和属性就会失效。...如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类,通过final关键字可得到一个外部变量引用。通过final关键字也不会在内部类去做修改该变量,保护了数据一致性。

35930

JAVA 1-6章测试题

答:局部变量与成员变量区别: 1>局部变量是定义方法体,而成员变量是定义中方法体外; 2>局部变量只能在所定义方法体或者代码块中使用,而成员变量本类中都可以使用。...2>Super:如果没有提供无参数构造方法,那么,我们必须通过super语句指导子类调用其他构造方法; 3>当子类局部变量或成员变量与成员变量同名时,通过super访问成员变量...:最终,不能被继承 Native:本地,不是Java语言书写 40、成员修饰符有哪些?...答:1>方法重写只存在于子类(包括直接和间接)之间,同一个方法只能被重载,不能被重写。...2>子类方法必须和方法具有相同方法名、参数列表和返回 3>子类可以定义与方法同名方法,以便在子类隐藏方法 4>方法不能被子类重写成实例方法,而实例方法也不能被子类隐藏为方法

83430

赶在 520 之前给您来份 Java 面向对象小抄

Java 声明形式如下所示,变量声明和方法定义意味着只能声明变量、初始化、方法定义等,而不能在方法外进行赋值等操作。......... } 方法定义声明变量(包括括号内声明变量和参数列表变量)称为局部变量,局部变量具有以下这些性质: 只方法中有效; 从声明位置之后开始都是有效; 复合语句或循环中语句声明变量只相应语句中有效...: 子类声明继承之后,将继承成员变量或方法,就相当于子类声明成员变量或方法一样。...,实际访问还是,只是继承成员变量/方法可以通过子类访问,所以当访问继承方法时,该方法访问成员变量其实是成员变量(因为实现时候,并不知道自己会被哪些继承,所以无法知道除自己之外成员变量...子类继承构造方法。 4.2.1. 成员变量隐藏 当子类声明成员变量名字和从父那边继承来成员变量名字相同时,那么子类就会隐藏继承成员变量。

62420

java面向对象相关知识

当新对象被创建时候,构造函数会被调用。每一个都有构造函数。程序员没有给提供构造函数情况下,Java编译器会为这个创建一个默认构造函数。 Java构造函数重载和方法重载很相似。...Java方法重载发生在同一个里面两个或者是多个方法方法名相同但是参数不同情况。与此相对,方法覆盖是说子类重新定义了方法。方法覆盖必须有相同方法名,参数列表和返回类型。...(单一职责原则想表达就是"高内聚",写代码最终原则只有六个字"高内聚、低耦合",所谓高内聚就是一个代码模块只完成一项功能,面向对象,如果只让一个完成该做事,而涉及与它无关领域就是践行了高内聚原则...重载发生在一个,同名方法如果有不同参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类之间,重写要求子类被重写方法与被重写方法有相同返回类型,比被重写方法更好访问...,不能比被重写方法声明更多异常(里氏代换原则)。

55710

Java核心基础知识:面向对象三大特性讲义

封装 上述代码, 我们可以任意设置属性, 包括我们可以设置一些非法, 例如: 把年龄设置成负数, 这样做程序就容易出问题, 针对于这种情况, 我们可以通过private关键字来优化. 6.1...int age = 30; 定义Son, 让继承Father, 并在该类成员位置定义变量: int age = 20; 测试FatherTestmain方法, 定义变量: int age...问: 为什么这样设计呢? 答: 用于子类对象访问数据前, 对数据进行初始化....方法重写要求返回数据类型也必须一样. 7.9.2 应用场景 当子类需要使用功能, 而功能主体又有自己独有需求时候, 就可以考虑重写方法了, 这样, 即沿袭了功能, 又定义了子类特有的内容...参考代码 略. 7.9.4 注意事项 子类重写方法时, 方法声明上要用@Override注解来修饰. 私有的方法不能被重写.

42710

Java面试之关键字

final final关键字有哪些用法 修饰数据:只能进行一次赋值操作,并在生命周期内不可改变他 修饰方法参数:表示整个方法我们不修改参数 修饰方法:表示方法不能被覆盖 修饰:无法被继承...被final修饰,就意味着不能再派生出新子类,不能作为而被子类继承。因此一个不能既被abstract声明,又被final声明。...super主要存在与子类方法,用于指向子类对象对象 使用场景:访问属性、函数、构造函数 public static void 写成 static public void会怎样 一样,程序正常运行...当程序运行时候这个变量就会创建直到程序结束后才会被销毁。变量作用域和实例变量是一样初始成员变量也是一样,当变量没被初始化时候根据数据类型,会有一个默认。...静态方法会被子类静态方法屏蔽,只要原来方法没有声明为final。非静态方法不能重写静态方法,也就是说,你不能在子类把一个静态方法改成实例方法。

627100

Java中所有的关键字及用法

extends java,extends是继承。 a extends b。 此处a为子类,b为java,一个子类只可以有一个,但是一个可以有多个子类。...如果表明出来,按照子类优先原则,相当于还是调用重写getName方法,就形成了死循环。 2.子类重新变量。...throws 用来声明一个方法可能抛出所有异常信息,将异常声明但是处理,而是将异常往上传,谁调用就 交给谁处理。 try 出现在方法体自身是一个代码块,表示尝试执行代码块语句。...import import就是java文件开头地方,先说明会用到那些类别。 接着我们就能在代码只用名指定某个,也就是只称呼名字,称呼他姓。...(2)为什么要用transient关键字? 持久化对象时,对于一些特殊数据成员(如用户密码,银行卡号等),我们不想用序列化机制来保存

26620

第七章 面向对象编程(进阶)

1. this 关键字 ‍ 1.1 this 含义 ‍ Java ,this 关键字不算难理解,作用和其词义很接近。...概念:直接、间接 Java 概念是相对Java 中一个可以声明多个子类。...因为 static 方法是属于子类无法覆盖方法。 ‍ 3.2 为什么需要方法重写? ‍ 子类继承以后,就获取了声明所有的方法。...):调用另一个构造器协助当前对象实例化,只能在构造器首行,只会找本类构造器,找不到就报错 super super.成员变量:表示当前对象某个成员变量,该成员变量声明 super.成员方法...:表示当前对象某个成员方法,该成员方法声明 super()或 super(实参列表):调用构造器协助当前对象实例化,只能在构造器首行,只会找直接对应构造器,找不到就报错 ‍ 5

13610

C++ 程序员 Java 指南

当系统加载或创建该类实例时,系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始。...private 只能在同一个访问,default 能在同一个、同一个包访问,protected 能在同一个、同一个包、子类访问,public 能在全局范围内访问。...使用 super 调用实例方法,使用名调用方法。 如果方法具有 private 访问权限,则该方法对其子类是隐藏,因此其子类无法访问和重写该方法。...java 只有传递。 对 private 方法,即使使用 final 修饰,子类也可以定义一个相同,因为这是子类定义了一个新方法,并非重写。...经验证,只要这个局部变量在后续不改变其,即使它不以 final 修饰,但实际表现是有效 final 时, Java 8 环境下编译后会自动为加上 final,不报错。

59310

菜鸟教程 Java 学习笔记 (基础教程)

任何继承抽象子类必须实现所有抽象方法,除非该子类也是抽象。 如果一个包含若干个抽象方法,那么该类必须声明为抽象。抽象可以包含抽象方法。...例如:如果一个方法被声明为public,那么子类重写该方法就不能声明为protected。 成员方法只能被子类重写。 声明为final方法不能被重写。...声明为static方法不能被重写,但是能够被再次声明子类同一个包,那么子类可以重写所有方法,除了声明为private和final方法。...抽象方法 如果你想设计这样一个,该类包含一个特别的成员方法,该方法具体实现由子类确定,那么你可以声明该方法为抽象方法。...最终,必须有子类实现该抽象方法,否则,从最初最终子类都不能用来实例化对象。 抽象总结规定 抽象不能被实例化(初学者很容易犯错),如果被实例化,就会报错,编译无法通过。

1.1K10

一文读懂面向对象(OOP)

多态使用细节 向上转型 本质:引用指向了子类对象 引用名 = new 子类类型(); ①它可以调用所有成员(遵守访问权限前提下) ②不能调用子类特有的成员最终运行效果看子类具体实现...修饰变量 如果final修饰变量,只能在静态初始化代码块中指定初始或者声明该类变量时指定初始。...修饰成员变量 如果final修饰成员变量,可以非静态初始化块、声明该变量或者构造器执行初始。 修饰局部变量 系统不会为局部变量进行初始化,局部变量必须由程序显示初始化。...因此使用final修饰局部变量时,即可以定义时指定默认(后面的代码不能对该变量进行修改), 也可以指定默认,而在后面的代码对final变量赋初始(仅一次)。...就将局部变量设置为final,对初始化后,就不让你再去修改这个变量,就保证了内部类成员变量和方法局部变量一致性。这实际上也是一种妥协。使得局部变量与内部类简历拷贝保持一致。

67420

(还在没有对象而发愁吗,new出来)->Java面向对象入门

√ √ √ private:表示当前是私有的,只能在本类访问,离开本类之后就不能直接访问 写:表示当前包私有,定义和调用只能在同一个包,才能访问 protected:表示子类访问权限,同一个包可以访问...: 中用public和protected修饰成员子类均可以继承 如果子类同一个包,使用缺省访问修饰成员,此时子类可以继承到 如果成员用private修饰,子类继承不到,因为private...方法重写需要注意点: private修饰方法不能被子类所继承,也就不存在重写概念 实例方法签名必须相同(方法签名=方法名+方法参数列表) 子类方法返回类型和返回类型相同或者是其子类 子类方法声明抛出异常小于或者等于方法声明抛出异常类型...静态方法名()Java推荐这种访问机制 静态方法特性 静态方法可以访问静态变量和其他静态方法 实例方法可以访问静态成员变量以及静态成员方法 10.1.2、静态变量 ,用static....静态变量(Java推荐) 10.2、final修饰符 final含义是最终,不可改变,可以修饰、方法、变量,他是来限制某个不可以有子类,不可以覆盖方法 final修饰 表示最终

82910

「万字图文」史上最姨母级Java继承详解

Java语言中实现Cat和Dog等时候,就需要继承Animal这个。继承之后Cat、Dog等具体动物类就是子类,Animal就是。 ? 为什么需要继承 你可能会疑问为什么需要继承?...extends关键字 Java继承是单一继承,也就是说一个子类只能拥有一个,所以extends只能继承一个。...image-20201026201029796 方法重写(Override) 方法重写也就是子类中出现和中一模一样方法(包括返回类型,方法名,参数列表),建立继承基础上。...提到Java继承,不得不提及所有:Object(java.lang.Object),如果一个没有显式声明(即没有写extends xx),那么默认这个就是Object,...: 静态成员变量和静态代码块 子类静态成员变量和静态代码块 普通成员变量和代码块,构造函数 子类普通成员变量和代码块,子类构造函数 总的来说,就是静态>非静态,>子类,非构造函数

39620

Java课程主要内容回顾

继承关系中子类继承了什么? 子类通过extends关键字表达对继承。继承关系子类继承了非私有成员变量和方法。 Java子类之间是一种继承关系。...super关键字作用? 多层继承,创建子类对象不需要直接调用对象。super关键字用于子类访问成员变量或调用构造方法。...protected: 受保护访问级别,同一包内和所有子类可见。被声明为 protected 成员可以同一包内其他访问,并且也可以被子类访问。...被声明为 private 成员能在定义它们内部访问,其他任何都无法访问。这就是封装,一般我们会设置seter和geter来读取值。...这样称为私有内部类,只能在包含外部类内部访问。 私有顶级(Private Top-Level Class): 如果将声明为顶级(非内部)并且私有,那么只能在同一文件内其他访问。

9110

java面试强基(15)

public: main方法是Java程序运行时调用第一个方法,因此必须对Java环境可见。所以可见性设置为 pulic. ​...static: Java平台调用这个方法时不会创建这个一个实例,因此这个方法必须声明为static。 ​ void: main方法没有返回。 ​...Java程序初始化工作可以许多不同代码块来完成(例如:静态代码块、构造函数 等),它们执行顺序为:静态变量→静态代码块→子类静态变量→子类静态代码→非静态变量→非静态代码块→构造方法...(静态)非静态成员定义时初始化和(静态)非静态代码块初始化优先级是平级,也就是说按照从上到下初始化,最后—次初始化为最终(不包括非静态成员构造器初始化)。...所以(静态)非静态块初始化域甚至能在该域声明上方,因为分 配存储空间初始化之前就完成了。

14830

Java基础系列1:Java面向对象

大部分时候,子类总是以为基础,额外增加新成员变量和方法。但有一种情况例外:子类需要重写方法。...重写与重载区别: 重写:相对继承而言,子类已经存在方法进行区别化修改。 重载:同一个处理不同数据多个相同方法名多态手段。重载方法名相同,参数列表不同。...final修饰变量必须在静态初始化块中指定初始声明该类变量时指定初始,而且只能在两个地方其中之一指定;final修饰实例变量必须在非静态初始化块、声明该实例变量或构造器中指定初始,而且只能在三个地方其中之一指定...因此使用final修饰局部变量时,既可以定义时指定默认,也可以指定默认。   ...super用法: 1、普通直接引用:与this类似,super相当于是指向当前对象 super.name:引用变量 super.add():引用方法 2、子类成员变量或方法与成员变量或方法同名

46210

Java基础-甲骨文系列

详细先后顺序:静态变量、静态代码块、子类静态变量、子类静态代码块、非静态变量、非静态代码块、构造函数、子类非静态变量、子类非静态代码块、子类构造函数。...finally作为异常处理一部分,只能在try/catch语句中使用,finally附带一个语句块用来表示这个语句最终一定被执行,经常被用在需要释放资源情况下。...Java代码块执行顺序 静态代码块(只执行一次) 子类静态代码块(只执行一次) 构造代码块 构造函数 子类构造代码块 子类构造函数 普通代码块 Java中一维数组和二维数组声明方式?...@Inherited:一个被@Inherited注解了注解修饰了一个,如果他子类没有被其他注解修饰,则子类也继承了注解。...简述重载与重写区别 重写即子类重写方法,方法对应形参和返回类型都不能变。 重载即在一个,方法名相同,参数类型或数量不同,这个和返回类型无关。

82910
领券