首页
学习
活动
专区
圈层
工具
发布

如何在不改变父类变量本身的情况下改变在子类的父类中定义的变量?

在不改变父类变量本身的情况下改变在子类的父类中定义的变量,可以通过以下步骤实现:

  1. 在子类中创建一个同名的变量,覆盖父类中的变量。这样子类就可以使用自己的变量而不改变父类的变量。
  2. 如果需要在子类中使用父类的变量值,可以通过调用父类的方法来获取。在子类中可以使用super关键字来调用父类的方法,通过这个方法获取父类的变量值。

下面是一个示例代码:

代码语言:java
复制
class ParentClass {
    protected int variable;

    public ParentClass(int variable) {
        this.variable = variable;
    }

    public int getVariable() {
        return variable;
    }
}

class ChildClass extends ParentClass {
    private int variable;

    public ChildClass(int parentVariable, int childVariable) {
        super(parentVariable);
        this.variable = childVariable;
    }

    public int getChildVariable() {
        return variable;
    }

    public int getParentVariable() {
        return super.getVariable();
    }
}

public class Main {
    public static void main(String[] args) {
        ParentClass parent = new ParentClass(10);
        ChildClass child = new ChildClass(20, 30);

        System.out.println("Parent Variable: " + parent.getVariable());
        System.out.println("Child Variable: " + child.getChildVariable());
        System.out.println("Parent Variable in Child: " + child.getParentVariable());
    }
}

输出结果为:

代码语言:txt
复制
Parent Variable: 10
Child Variable: 30
Parent Variable in Child: 20

在这个示例中,父类ParentClass定义了一个变量variable,并提供了获取变量值的方法getVariable()。子类ChildClass中也定义了一个同名的变量variable,并通过调用父类的构造方法super(parentVariable)来初始化父类的变量。子类还提供了获取子类变量值的方法getChildVariable()和获取父类变量值的方法getParentVariable(),在getParentVariable()方法中使用了super关键字来调用父类的getVariable()方法。

通过这种方式,我们可以在不改变父类变量本身的情况下,在子类中定义并使用自己的变量。

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

相关·内容

继承与隐藏:Java中父类成员变量的神秘禁忌

摘要 在Java中,子类继承了父类的成员变量,但不能直接覆盖(或称为隐藏)父类的成员变量。...本文将解释为什么Java设计了这样的规则,探讨与此相关的继承和多态的概念,并说明如何在子类中访问和使用父类的成员变量。 1....本文将探讨这个设计决策的原因,以及如何在子类中正确使用父类的成员变量。 2. 成员变量的继承和隐藏 在Java中,继承是一种允许子类获取父类属性和方法的机制。...} } 在上面的例子中,我们定义了一个Vehicle类和两个子类Car和Motorcycle,它们都重写了父类的makeSound方法。...通过多态,我们可以在父类引用的层面上编写通用的代码,而在运行时根据实际对象的类型来调用适当的方法。这提高了代码的灵活性和可复用性,并使得我们可以在不修改通用代码的情况下扩展和改变程序的行为。 4.

1K20

Java super继承

所以,子类初始化之前,一定要先完成父类数据的初始化每一个构造方法的第一条语句默认都是:super() 继承中构造方法的关系  如果父类中没有构造方法  子类通过super去显示调用父类其他的带参的构造方法子类通过...使用特点: 如果方法名不同,就调用对应的方法  如果方法名相同,最终使用的是子类自己的  方法重写的应用:  当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能...方法重写的注意:  父类中私有方法不能被重写子类重写父类方法时,访问权限不能更低父类静态方法,子类也必须通过静态方法进行重写。...修饰类,类不能被继承修饰变量,变量就变成了常量,只能被赋值一次修饰方法,方法不能被重写 final修饰局部变量  在方法内部,该变量不可以被改变在方法声明上,分别演示基本类型和引用类型作为参数的情况 基本类型...第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。  总结:把多个类中相同的成员给提取出来定义到一个独立的类中。

64030
  • java 多态

    1.概述 1.多态概述 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法...3.多态的定义与使用格式 定义格式:父类类型 变量名=new 子类类型(); 2.多态中成员的特点 1.多态成员变量:编译运行看左边 Fu f=new Zi(); System.out.println...3.多态的转型 多态的转型分为向上转型和向下转型两种: 向上转型:多态本身就是向上转型过的过程 使用格式:父类类型 变量名=new 子类类型(); 适用场景:当不需要面对子类类型时...5.多态的情况下,子父类存在同名的成员变量或成员方法优先调用问题 1.多态的情况下,子父类存在同名的成员变量时,默认访问的是父类的成员变量数据. 2.多态的情况下,子父类存在同名的非静态函数的时候,默认是调用子类的成员函数...,类型指针,那么对象体中存放的是对象的成员变量,成员变量包括从父类继承过的成员变量和本类的成员变量,那么如果父类和子类有重名的变量,那么这个时候就要看对象的静态类型是什么了,静态类型就是声明类型,如果声明类型是父类那么就直接选取父类的成员变量

    59110

    Python的面向对象

    类名.成员变量 只跟类有关,不可改变 应用场景: 比如定义一个狗类叫做ClassA: 里面有成员变量 动物种类、狗品种、狗毛色 有构造函数...) # 打印 0 表示子类继承了父类的类变量 print(s.name) # 打印 Tom 表示子类继承了父类的实例变量 print(s.age) # 打印...13 表示子类继承了父类的实例变量 s.get_name() # 打印 Tom 表示子类继承了父类的实例方法 注意: 上述只是将Human父类的变量和方法提取到了子类中...现在对于上述代码,如果父类改变,那么代码中涉及的地方全都要改,违反了开闭原则 引出:super() 通用调用方法,修改为: super(Student,self...__init__(name,age) 注意: 这样修改父类时不需要修改这里的代码 super()目的是继承父类的同名方法,如__init__()或一些公共方法

    54440

    super关键字和继承中的潜规则

    this调用自己类中的构造器,而super可以调用父类中的构造器。 super除了调用被子类重写后被隐藏的成员变量和方法,还有一个重要的作用就是调用父类构造器。...在创建子类对象的时候,并没有创建父类对象,但是由于子类继承了父类,内存中不但会划分子类的变量空间,也会将子类的所有父类的成员变量也划分内存空间,所以可以使用super去访问他们。...因为父类定义private的时候,无论是变量还是方法,子类都是不可见的。所以当我们有个方法是专门给子类去重写而又不希望被其他类发现的时候,我们可以定义为protected方法。...还有种情况是我们不希望子类重写父类。比如我们普通玩家打怪的时候,一不小心怪没打死,自己挂了。这时候会有系统惩罚的,比如掉经验掉金币,就算用户是VIP,我也不希望他们改变这个机制,为什么?...加在变量前面,这个变量就变成常量了,不能再赋值了,加在方法前面,子类统统不能改。 阻止重写 我们在开发软件的过程中,会是一个多人配合团体合作的过程。

    56430

    疯狂Java笔记之对象及其内存管理

    java.PNG 2访问子类对象的实例变量 子类因为继承父类所以可以访问父类的成员方法和变量,当一般情况下父类是访问不了子类的,因为父类不知道哪个子类继承。...也就是说,当系统创建一个Java对象时,如果该Java类有两个父类(一个直接父类A,一个间接父类g ),假设A类中定义了2个实例变量,B类 中定义了3个实例变量,当前类中定义了2个实例变量,那么这个Java...如果子类里定义了与父类中已有变量同名的变量,那么子类中定义的变量会隐藏父类中定义的变量,而不是覆盖。因此系统创建子类对象是依然会为父类定义的,被隐藏的变量分配内存空间。...为了在子类中访问父类定义的,被隐藏的变量和方法,可以使用super来限定修饰这些变量和方法。...3.父,子类的类变量 如果在子类中要访问父类中被隐藏的静态变量和方法,程序有两种方式: 直接使用父类的类名作为主调来访问类变量 使用super.作为限定来访问类变量 一般情况下,都建议使用第一种方式访问类变量

    47430

    UIview

    Overview 在运行时,一个视图对象处理任何内容的呈现它的面积,还处理任何与内容交互。UIView类本身提供了基本行为与背景颜色填充的矩形区域。...这将创建一个视图之间的亲子关系被嵌入(称为子视图)和嵌入的父视图(称为父视图)。通常情况下,子视图的可见区域的范围不剪它的父视图,但在iOS可以使用clipsToBounds属性来改变行为。...框架定义了视图的起源和维度的坐标系统中常用它的父视图和布局调整视图的大小或位置。中心属性可以用来调整视图的位置不改变它的大小。边界定义视图,把他们的内部维度和几乎完全用于自定义代码。...Animations 几个视图属性可以更改该对象animated,改变属性创建一个动画,这种改变在很短的时间内传达给用户。...因此,你应该叫UIView类的方法从代码中运行您的应用程序的主线程。这可能不是严格必需是唯一一次在创建视图对象本身,而是所有其他操作应该发生在主线程。

    92310

    谈谈我对C#协变和逆变的理解

    简单点说,协变和逆变有一个基本的公式: 协变:IFoo父类> = IFoo子类>; 简单点说:从儿子变成老子,年龄自然长大,顺理成章,叫做协变。...父类Person和子类Student 首先我们声明一个父类Person,包含一个Name字段,表示人的姓名。...但遗憾的是,C#无法将泛型子类(List)隐士转换到泛型父类(List)。...为了解决这个转换问题,微软提出了协变这个概念,对于泛型接口的参数T来说,给这个参数T加一个修饰符out,表示这个参数支持协变,也就是可以安全的从子类转换为父类。...但是,如果你去掉in关键字,就会编译失败,因为默认情况下,父类Person是不能直接转换为子类Student的。 这就是逆变在委托中的应用。那么接下来来看下逆变在接口中的应用,也是很简单的。

    18400

    谈谈你对多态的了解以及应用

    Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。 如Student类可以为Person类的子类。...1.2 多态的定义与使用格式 多态的定义格式:就是父类的引用变量指向子类对象 父类类型 变量名 = new 子类类型(); 变量名.方法名(); 普通类多态定义的格式...多态成员变量 多态出现后会导致子父类中的成员变量有微弱的变化。看如下代码 父类子类都有同名的变量: ? 父类没有的情况下: ? 子类没有的情况下: ?...简单记:编译和运行都参考等号的左边。编译运行看左边。 多态成员方法 多态出现后会导致子父类中的成员方法有微弱的变化。看如下代码 父类子类都有同名的方法: ? 父类没有的情况下: ?...子类没有的情况下: ? 当子父类中出现同名的成员方法时,多态调用该变量时: 编译时期:参考引用变量所属的类,如果类中没有调用的方法,编译失败。

    51620

    JAVA 什么是多态?

    大家好,又见面了,我是你们的朋友全栈君。 面向对象编程有三大特性:封装、继承、多态。 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。...通俗一点的说法:所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法...方法重写的应用: 当子类需要父类的功能,而功能主体子类有自己的特有内容时,可以重写父类中的方法。即沿用了父类的功能,又定义了子类特有的内容。...,即静态只能覆盖静态 子类重写父类方法时,最好声明得一模一样 如果子类中定义了一个与父类private方法具有相同的方法名、相同的形参列表、相同的返回值类型的方法,依然不是重写,只是在子类中重新定义了一个新的方法...子类对象调用方法时,先找子类本身的方法,再找父类中的方法。

    1K30

    Java学习之抽象类与接口

    由于java不支持多继承,子类不能继承多个类,但可以实现多个接口。 若基本功能在不再改变,那么就需要使用抽象类。若不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。...2.抽象类不能用来创建对象。 3.若一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。...5,接口(interface) 在软件工程中,接口泛指供别人调用的方法或函数 定义形式:[public] interface InterfaceName{} 接口中可以含有变量和方法。...可以看出接口是一种极度抽象的类型,它比抽象类更加”抽象”,并且一般情况下不在接口中定义变量。...抽象类是对整个类整体进行抽象,包括属性,行为。接口是对类局部(行为)进行抽象。 抽象类作为很多子类的父类,是一种模板式设计。接口是一种行为规范。

    51120

    精读《设计模式 - Template Method 模版模式》

    意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。...意图解释 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。...这个设计模式初衷是用于面向对象的,所以考虑的是如何在类中运用模版模式。首先定义一个父类,实现了一些算法,再将需要被子类重载的方法提出来,子类重载这些部分方法后,即可利用父类实现好的算法做一些功能。...比如说父类方法 function a() { b() + c() },此时子类只需要重定义 b 与 c 方法,即可复用 a 的算法(b 与 c 相加)。...弊端 模版模式用在类中,本质上是固定不可变的结构,进一步缩小重写方法的范围,重写的范围越小,代码可复用度就越高,所以一定要在具有通用算法可提取的情况下使用,而不要为了节省代码行数而过度使用。

    55420

    Android 设计模式Template Method模式

    自定义模板方法模式:定义的算法的骨架中的方法,虽然某些步骤推迟到子类中,下模板方法允许子类不能改变在的情况下,该算法的结构。算法重新定义某些步骤。 设计原则:不要给我们打电话。我会打电话给你。...他们的冲泡方法 第一步:都是要用沸水 第二步:用热水泡咖啡或茶 第三步:把饮料倒进杯子 第四步:在饮料中增加适当的调料 在上面的步骤中一、三是一样的,能够抽取出来放在基类中,二、四不一样,能够抽象出来,...让子类去实现,下面是饮料抽象的父类,父类能够让未知的子类去做它本身可能完毕的不好或者根本完毕不了的事情。...它们在类库中尤为重要,它们提取了类库中的公共行为。 2、模板方法导致一种方向控制结构,”好莱坞法则”:”Don’t call me,i will call you.”,即一个父类调用子类的操作。...3、模板调用操作的类型有详细的操作,详细的AbstracClass操作,原语操作。工厂方法,钩子操作。少定义原语操作。 4、模板方法使用继承来改变算法的一部分。策略模式使用托付来改变整个算法。

    28030

    【Java基础】封装、继承、多态

    继承 继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类,现有类称作父类。子类会自动拥有父类中“可以”继承的属性和方法。在子类中,可以直接调用父类的成员变量及方法。...成员变量和成员方法的继承关系 不同名的成员变量或成员方法,子类直接继承使用; 同名的变量或方法,默认访问子类自己的成员变量或方法,想访问父 类中的可以使用super关键字,如:super.成员变量。...抽象类在使用时要定义子类继承抽象类,将抽象类进行重写,创建子类的对象。其子类只有重写了抽象类中的所有方法后,才能创建对象,否则该子类还是一个抽象类。...static final 修饰,说明是不可改变的,public static final 也可省略; 接口定义的就是常量,接口中的常量必须进行赋值,不赋值会报错; 接口中的常量名称,使用完全大写的字母...代码中的多态性,就是父类引用指向子类的对象,其使用方法如下: 父类名称 对象名 = new 子类名称(); 接口名称 对象名 = new 实现类名称(); 多态情况下,访问成员变量也有所不同:一种是直接通过对象名称访问成员变量

    36110

    Java 回顾 ( Revisiting Java )

    换一种说法,多态即允许将子类对象的引用赋值给父类对象的引用,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。...这样一些情况我们可以定义抽象类,它不能被初始化,只能被继承。。抽象类中可以定义抽象方法,抽象方法只存在于抽象类中,一个类只要有一个抽象方法,那他必是抽象类。...super()调用父类的构造函数,this是对对象本身的引用 谈谈实例变量,实例变量即对象的成员变量。...一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见; 8)实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。...静态变量定义在类中,它属于类,不属于任何对象,但对象可以获得它。 类的静态变量由(该类的)所有对象所共享。 静态方法通过类名调用,静态变量通过类名存取 。

    1.8K20

    Java基础(七): 面向过程与面向对象、类与对象、成员变量与局部变量、值传递与引用传递、方法重载与方法重写

    (不推荐) 修饰符 可用 public/private/protected/static/final 等 2、局部变量 定义:声明在方法、构造方法、代码块或形参列表中的变量 分类: 方法局部变量...对于引用类型,传递的是引用的值(即对象地址的副本),而非引用本身(即不是引用传递) 五、方法重载 vs 方法重写 1、方法重载(Overloading) 定义:在同一个类中,多个方法使用相同的方法名但参数列表不同...(参数类型、个数或顺序不同) 核心特点: 相同类中:所有重载方法必须在同一个类(或父子类中也可重载) 方法名相同:必须使用完全相同的名称 参数列表不同: 参数类型不同(如 int vs String...:子类重新定义从父类继承的方法,提供特定实现 目的:实现运行时多态,允许子类定制父类行为 核心特点: 方法名称一致,参数类型、个数、顺序完全一致 返回类型:可以相同,也可以是父类返回类型的 子类型...,Java 编译器就无法访问这个方法 异常限制:子类方法抛出的异常小于等于父类抛出异常 // 假设父类方法声明会抛出某个异常,那么你就可以在使用父类引用时,写出对应的异常处理代码 // 如果子类重写方法却抛出了更多或更广泛的异常

    11800

    java核心技术基础知识整理

    ,不再查找子类本身属性; 方法:super方法直接在子类之中查找父类中的指定方法,不再查找子类本身方法; 构造:必须放在构造方法首行,不能与this关键字同时出现。...3、只要包含一个抽象方法的类,该类必须要定义成抽象类,不管是否还包含有其他方法。 4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。 5、子类中的抽象方法不能与父类的抽象方法同名。...(先初始化成员变量,后加载构造函数的原因是,构造函数中可能要用到这些成员变量) 父类静态块——子类静态块——父类块——父类构造器——子类块——子类构造器 最终版本:父类静态域——父类静态块——子类静态域...52、Java程序初始化的顺序 (1)遵循3个原则: 1)静态对象(变量)优先于非静态对象(变量)初始化; 2)父类优先于子类进行初始化; 3)按照成员变量的定义顺序进行初始化, (2)初始化顺序 父类静态变量...、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数 53、Java变量类型 (1)变量类型 静态变量、成员变量

    94720

    Java入门必背100条

    24、赋值运算符:= += -= *= /= %=,运算的结果不会改变变量本身的数据类型。...58、super调用属性、方法: ①在子类的方法或构造器中,通过使用”super.属性”或”super.方法”的方式,显式的调用父类中声明的属性或方法,通常情况下,习惯省略”super.”。...②特殊情况:当子类和父类中定义了同名的属性时,要想在子类中调用父类中声明的属性,则必须显式的使用”super.属性”的方式,表明调用的是父类中声明的属性。...③如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没重写此方法的情况下,默认调用的是父类中的同名同参数的方法。–>类优先原则。...⑤如何在子类(或实现类)的方法中调用父类、接口中被重写的方法。

    1.3K20
    领券