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

抽象类中的公共变量

抽象类中的公共变量是指在抽象类中定义的可以被所有子类访问和修改的变量。这些变量通常用于存储与类层次结构中的多个类相关的数据,或者用于实现一些通用的功能。

基础概念

抽象类:抽象类是不能被实例化的类,它通常包含一个或多个抽象方法(没有具体实现的方法),以及一些具体的方法和变量。抽象类的主要目的是为子类提供一个通用的模板。

公共变量:在抽象类中声明的公共变量(使用public关键字)可以被该类的所有子类访问和修改。

优势

  1. 代码重用:公共变量可以在多个子类之间共享数据,避免了数据的重复定义。
  2. 一致性:通过公共变量,可以确保所有子类都使用相同的数据结构,从而保持数据的一致性。
  3. 灵活性:子类可以根据需要读取或修改公共变量的值,提供了较高的灵活性。

类型

  • 实例变量:每个对象都有自己的副本。
  • 静态变量(类变量):所有对象共享同一个副本。

应用场景

  • 模板方法模式:在抽象类中定义算法的骨架,而将一些步骤延迟到子类中实现。公共变量可以用来存储算法过程中需要共享的数据。
  • 状态管理:当多个子类需要维护相同的状态信息时,可以使用公共变量。

示例代码

代码语言:txt
复制
abstract class Shape {
    // 公共实例变量
    public String color;

    // 抽象方法
    public abstract double area();

    // 具体方法
    public void setColor(String color) {
        this.color = color;
    }

    public String getColor() {
        return color;
    }
}

class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}

class Square extends Shape {
    private double side;

    public Square(double side) {
        this.side = side;
    }

    @Override
 public double area() {
        return side * side;
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(5);
        circle.setColor("Red");
        System.out.println("Circle color: " + circle.getColor());
        System.out.println("Circle area: " + circle.area());

        Square square = new Square(4);
        square.setColor("Blue");
        System.out.println("Square color: " + square.getColor());
        System.out.println("Square area: " + square.area());
    }
}

可能遇到的问题及解决方法

问题:子类意外地修改了公共变量的值,导致程序行为不一致。

原因:公共变量可以被所有子类访问和修改,缺乏封装性。

解决方法

  1. 使用私有变量和getter/setter方法:将公共变量改为私有,并通过公共的getter和setter方法进行访问和修改,这样可以增加对变量访问的控制。
代码语言:txt
复制
abstract class Shape {
    private String color;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    // 其他代码...
}
  1. 使用final关键字:如果公共变量的值在初始化后不应该被修改,可以将其声明为final
代码语言:txt
复制
abstract class Shape {
    public final String color;

    public Shape(String color) {
        this.color = color;
    }

    // 其他代码...
}

通过这些方法,可以更好地管理和控制抽象类中公共变量的使用,从而避免潜在的问题。

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

相关·内容

慎用公共变量

前言 在开发过程中,避免不了会使用公共变量,记录共享对象状态、数据最简单的方式就是创建创建公共变量; 当业务逻辑变多,还采用这种思想就会变得危险,代码逻辑变得不清晰,慢慢就有一种代码坏味道。...具体总结如下: 1、过多逻辑分支,不够清晰,公共变量不利于系统维护和项目拓展; 2、安全性收到威胁,过多地方共享变量,变量的写入和读取在多线程下是危险的; 3、业务逻辑交叉过多时,很难保证数据-逻辑的一致性...当我们需要在多个线程中处理访问关联对象的多线程代码时,这就非常有用了,实现线程和逻辑绑定。...函数将key指定的关联对象设置为nil; 举个栗子 在开发工程中,给UIView添加单击手势是非常常见的需求。...假定,现在我们就要动态地将一个Tap手势操作连接到任何UIView中,并且根据需要指定点击后的实际操作; 这时候我们就可以将一个手势对象及操作的Block对象关联到我们的UIView对象中。

58120

慎用公共变量~~

在开发过程中,避免不了会使用公共变量,记录共享对象状态、数据最简单的方式就是创建创建公共变量。 当业务逻辑变多,还采用这种思想就会变得危险,代码逻辑变得不清晰,慢慢就有一种代码坏味道。...具体总结为一下几点: 过多逻辑分支,不够清晰,公共变量不利于系统维护和项目拓展; 安全性收到威胁,过多地方共享变量,变量的写入和读取在多线程下是危险的; 业务逻辑交叉过多时,很难保证数据-逻辑的一致性;...当我们需要在多个线程中处理访问关联对象的多线程代码时,这就非常有用了,实现线程和逻辑绑定。...4、举个栗子: 在开发工程中,给UIView添加单击手势是非常常见的需求。假定,现在我们就要动态地将一个Tap手势操作连接到任何UIView中,并且根据需要指定点击后的实际操作。...这时候我们就可以将一个手势对象及操作的block对象关联到我们的UIView对象中。这项任务分为两部分。 首先,如果需要,我们要创建一个手势识别对象并将它及block做为关联对象。

78740
  • Python - 面向对象(三)公共变量,受保护变量,私有变量

    前言 在Python的类里面,所有属性和方法默认都是公共的;但Python也可以设置受保护、私有类型的变量or方法 受保护类型的变量、方法 一般称为:protected变量 #!..._protected) @classmethod def class_m(cls): print("类方法中类属性:", cls...._test() 执行结果 子类实例属性: 子类的受保护实例变量 子类类属性: 受保护变量 实例属性: 子类的受保护实例变量 类属性: 受保护变量 子类实例对象调用类属性 子类的受保护实例变量 类方法中类属性...: 受保护变量 类对象调用类属性 受保护变量 受保护的方法 知识点 在变量和方法前加一个下划线 即可变成protected类型的变量or方法 _ 父类的protected变量,子类能继承 实例对象能直接调用..._protect 总的来说,和公共变量没有什么特别大的区别 私有类型的变量、方法 #!

    1.6K20

    CA1012:抽象类型不应具有公共构造函数

    项 “值” RuleId CA1012 类别 设计 修复是中断修复还是非中断修复 非中断 原因 类型为抽象类型并且具有公共构造函数。 默认情况下,此规则仅查看外部可见的类型,但这是可配置的。...规则说明 抽象类型的构造函数只能由派生类型调用。 由于公共构造函数可创建类型的实例,但无法创建抽象类型的实例,因此具有公共构造函数的抽象类型在设计上是错误的。...如何解决冲突 若要解决此规则的冲突,请将构造函数设置为受保护的函数,或者不将该类型声明为抽象类型。 何时禁止显示警告 不禁止显示此规则发出的警告。 抽象类型具有公共构造函数。...配置代码以进行分析 使用下面的选项来配置代码库的哪些部分要运行此规则。 包含特定的 API 图面 你可以仅为此规则、为所有规则或为此类别中的所有规则配置此选项(设计)。..., internal 示例 下面的代码片段包含与此规则冲突的抽象类型。

    50320

    java中的抽象类

    抽象类中不一定包含抽象方法:抽象类可以不包含抽象方法,但包含抽象方法的类一定是抽象类。 可以包含常量或实例变量:抽象类可以定义常量(使用final修饰)和普通的实例变量。...} } 抽象类与接口的区别 成员变量:抽象类可以有成员变量,而接口中所有的变量都是public static final的。...继承:一个类只能继承一个抽象类,但可以实现多个接口。 访问修饰符:抽象类中的方法可以有各种访问修饰符,而接口中的方法默认是public的。...封装性:抽象类可以封装公共的属性和方法。 缺点 灵活性降低:如果抽象类的实现不够通用,可能会限制子类的灵活性。 增加复杂性:抽象类的引入可能会增加系统的复杂性。...代码共享:当多个类有共同的行为时,可以将这些行为放在抽象类中。 强制规范:通过抽象类强制子类实现某些方法。

    11810

    java中的抽象类

    抽象类详解目录什么是抽象类抽象类的特点抽象类的定义和语法抽象类的应用实例抽象类与接口的区别抽象类在设计模式中的应用抽象类的优缺点如何在实际项目中使用抽象类总结什么是抽象类抽象类(Abstract Class...**抽象类中不一定包含抽象方法**:抽象类可以不包含抽象方法,但包含抽象方法的类一定是抽象类。**可以包含常量或实例变量**:抽象类可以定义常量(使用final修饰)和普通的实例变量。...**成员变量不能被abstract修饰**:成员变量不能是抽象的,因为变量需要具体的值。...}}抽象类与接口的区别**成员变量**:抽象类可以有成员变量,而接口中所有的变量都是public static final的。...抽象类的优缺点优点**代码复用**:抽象类可以在不同子类间共享代码。**提高灵活性**:抽象类允许子类根据需要重写方法。**封装性**:抽象类可以封装公共的属性和方法。

    10010

    10、less的引用及公共变量的抽离

    less是什么自然不用多言,乃一个css预编译器,可以扩展css语言,添加功能如如允许变量(variables),混合(mixins),函数(functions) 和许多其他的技术,让你的Css更具维护性...home.vue 三、less与公共变量 一般在我们项目中,需要把所有统一的色调、样式提出出来作为公共变量使用,比如这里,假设红色是我们项目的基调色,很多页面都要用到,所以我们定义一下这个背景色。...1、我们在styles下面新建一个variables.less文件,用于存放less公共变量,然后定义一下全局背景色 ?...variables 这是定义less变量的语法,还有很多less的语法,大家可以去官网看看。 2、项目中引入 ? 项目中引入 这里需要踩的坑我都注释了,看注释就行。...浏览器 那么,以后再项目中就可以把所有的页面公共的变量抽离出来使用了。 参考学习 http://lesscss.org/usage/

    2.6K10

    Swift 中的抽象类型和方法

    在面向对象的编程中,抽象类型提供了一个基础实现,其他类型可以从中继承,以获得某种共享的、共同的功能。...抽象类型与普通类型的区别在于,它们永远不会被当作原样使用(事实上,一些编程语言甚至阻止抽象类型被直接实例化),因为它们的唯一目的是作为一组相关类型的共同父类。...一个基于抽象类型的方法是使用一个基类,它将作为我们所有模型加载类型的共享、统一的接口。...所以,一般来说,协议肯定是在Swift中声明抽象类型的首选方式,但这并不意味着它们是完美的。...因此,如果我们将Loadable还原成一个类,那么我们就能够将我们的子类所需要的所有对象直接存储在我们的基类中——不再需要在多种类型中重复声明这些属性: class Loadable {

    81720

    Java集合中的AbstractMap抽象类

    但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范。   抽象类通常作为一种骨架实现,为各自子类实现公共的方法。...Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实现了Map接口部分方法,也就是说为它的子类各种Map提供了公共的方法,没有实现的方法各种Map可能有所不同。   ...抽象类不能通过new关键字直接创建抽象类的实例,但它可以有构造方法。...AbstractMap中定义了一个成员变量“transient Set keySet”,在JDK7中keySet变量是由volatile修饰的,但在JDK8中并没有使用volatile修饰。...在对keySet变量的注释中解释道,访问这些字段的方法本身就没有同步,加上volatile也不能保证线程安全。关于keySet方法的实现就有点意思了。

    53720

    TS中的类的继承以及抽象类

    前言 上篇文章中,我们介绍了TS中的类和修饰符,这篇我们继续了解TS中的类相关的两个东西,分别是类的继承以及抽象类 类的继承 我们知道js中有继承,最开始js是使用函数来模拟实现类的,一直到ES6出现...事实上,继承的好处在于,可以更好的重用代码,以及后期更好的维护代码 TS中的继承ES6中的类的继承极其相识,子类可以通过extends关键字继承一个类 例如: class Person{ name:...js和ts中多态其实很常见,可以理解为多种状态,比如代码在运行时才能决定具体执行哪个函数 抽象类 抽象就是指不具体的,所以抽象类就是指不具体的类。...所以抽象类自身没有什么功能,通常作为父类类使用 定义一个抽象类,使用abstract class两关键字定义 abstract class A{ abstract fn():number; } 复制代码...抽象类规定了所有继承自它的非抽象子类必须实现它的所规定的功能和相关操作,否则会报错 class B extends A{ constructor(){ super(); } fn(

    1.5K00

    Python中的接口类与抽象类

    接口类 面向对象中的继承有两种用途:1)可以通过继承做到代码重用,并完成扩展;2)接口继承。...') # NotImplementedError 子类覆盖父类中的方法时,要注意方法名需要与父类中的方法名相同,且方法的参数个数与参数名也要相同~ 这里更好的方式是通过 abc模块 来实现接口~...抽象类 抽象类和接口类一样是一种规范,规定子类应该具备的功能。 在Python中,抽象类和接口类没有明确的界限。...def query(self, sql): pass @abstractmethod def update(self, sql): pass 抽象类就是从一堆类中抽取相同的内容...上述示例中可以看到,抽象类中对部分方法进行了实现~ 其实 Python 原生仅支持抽象类,不支持接口类。

    1.8K10

    JavaScript中的抽象类和虚方法

    一:抽象类与虚方法 虚方法是类成员中的概念,是只做了一个声明而未实现的方法,具有虚方法的类就称之为抽象类,这些虚方法在派生类中才被实现。...抽象类是不能实例化的,因为其中的虚方法并不是一个完整的函数,不能被调用。所以抽象类一般只作为基类被派生以后再使用。 和类的继承一样,JavaScript并没有任何机制用于支持抽象类。...但利用JavaScript语言本身的性质,可以实现自己的抽象类。 二: 在JavaScript实现抽象类 在传统面向对象语言中,抽象类中的虚方法必须先被声明,但可以在其他方法中被调用。...当然,如果希望在基类中添加虚方法的一个定义,也是可以的,只要在派生类中覆盖此方法即可。...尽管这个例子在prototype-1.3.1中不是一个抽象类的概念,而是类的一种设计模式。

    4.5K22

    Java中接口和抽象类的区别

    简单来说, 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法...,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。...4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。   ...5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。   ...6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。   7.接口中的方法默认都是 public,abstract 类型的。

    69240

    Dart 中的抽象类与多态、接口

    Dart中的抽象类 Dart抽象类主要用于定义标准,在抽象类中定义继承它的子类必须有哪些方法。 抽象类通过abstract关键字来定义,抽象类中没有方法体的方法称为抽象方法,类似于C++中的虚函数。...抽象类不能被实例化,只有继承它的子类才可以,子类必须实现抽象类里面定义的抽象方法才能实例化。 ? 2....Dart中的多态 Dart中的多态与C++中的虚基类相似,允许将子类类型的指针赋值给父类类型的指针。...在实现上,将子类的实例赋值给父类的引用,父类的引用调用父类中存在的抽象类方法,从而间接的调用在子类中覆写的抽象类方法。 ? 3....Dart如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。 ? 4. Dart中一个类实现多个接口 ? extends抽象类 和 implements 的区别: 1.

    2.6K20

    Java中抽象类和接口的区别

    最终变量: 在 Java 接口中声明的变量默认是最终的。抽象类可能包含非最终变量。 变量类型: 抽象类可以有final、non-final、静态和非静态变量。接口只有静态和最终变量。...多重实现: 一个接口只能扩展另一个Java接口,一个抽象类可以扩展另一个Java类并实现多个Java接口。 数据成员的可访问性: 默认情况下,Java 接口的成员是公共的。...如果以下任何陈述适用于您的情况,请考虑使用抽象类: 在java应用程序中,有一些相关的类需要共享一些代码行,那么你可以将这些代码行放在抽象类中,并且这个抽象类应该由所有这些相关类进行扩展。...您可以在抽象类中定义非静态或非最终字段,以便您可以通过方法访问和修改它们所属的对象的状态。...您可以期望扩展抽象类的类具有许多公共方法或字段,或者需要除 public 之外的访问修饰符(例如 protected 和 private)。

    54120

    python中的变量

    什么是变量?总结不好也记不得它的完整定义,就举个例子来便于自己学习总结吧。假如我们要计算1+2的值,那么首先在内存中要存储两个值,一个是:1,一个是:2。...假如在程序中我们用a+b来表示两个数相加,那么当a=1,b=2时,就可以计算出1+2=3,此时这个a和b就是变量,它们也可以等于其他数值,结果也是随着数值的改变而改变的。a和b的值能变动,就叫变量。...知道了变量的名字(上面的a和b)就是内存中存储的数据的别名,那么a=1,b=a,表示什么意思呢?a=1 表示内存中存有一个数值1,给它取个名字叫a。b=a表示给a取个名字叫b吗?非也。...3、python中的一些关键字不能当做变量,这些关键字已经被系统使用了,如果作为变量名就不知道是系统内置的,还是自己定义的。 4、变量名是区分大写的。 5、变量名中不能含有空格。...变量是能改变的,名字可以随意给哪个内存中的数据用嘛。而常量就是不能变的。常量的定义必须是大写字母。比如:NAME = "大能猫",表示NAME就是内存中“大能猫”这个数据的专属名字。

    2.5K10

    Js中的变量

    Js中的变量:  1:如果在var中没有初始化变量的值,则默认为undefined.  2:可以不用var来申明一个变量,但是在过程级中申明一个变量时,就必须用var.   ...var bestAge = null;  4:如果声明了一个变量但没有对其赋值,该变量存在,其值为Jscript 值 undefined。下面给出示例。    ...var currentCount  5: 在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,    而 undefined 的操作象特殊值NaN (不是一个数字...js中的数据类型  1:Jscript 有三种主要数据类型、两种复合数据类型和两种特殊数据类型    主要(基本)数据类型是: 字符串 数值 布尔    复合(引用)数据类型是: 对象 数组    特殊数据类型是...: Null Undefined  2:测试是否已经声明变量 x :    if (typeof(x) == "undefined")      // 作某些操作 js中的内置对象  1:Jscript

    12.9K60

    Android 的CompoundButton(抽象类按钮)、StringBuffer(字符串变量)「建议收藏」

    2.1 第一种想法,已近在大佬的帮助下解决,就是利用CompoundButton(抽象类按钮)设置一个监听器,根据监听器的名称(listener),监听全部的CheckBox控件,只需要为CheckBox...2.2一次性获取到 全部的已选项text属性的想法,却没有实现。直到今天碰到了StringBuffer(字符串变量)便想利用其append的字符串追加方法,来实现。...的append方法,将字符串追加到 buffer变量中去,以下的判断逻辑,于此相同,不再赘述。...监视器设置相同的监听器名称(listener),以实现抽象类按钮CompoundButton对其的监听。...CompoundButton(勾选状态变化监听器),为抽象的复合按钮,因为是抽象类,所以不能直接使用,它的派生类有CheckBox(复选框)、RadioButton(单选框)、Switch(开关按钮),

    59120
    领券