abstract和static

abstract抽象类(相当于是一种模板设计方案,提供好后随你怎么用)

抽象类、就是一个用abstract修饰的类,在这个类中、你可以定义一些不需要具体实现的方法、也就是没有方法体的方法、这些方法叫做抽象方法、当一个类要继承这个抽象类时、就必须要实现这些抽象方法、。当你在做一个比较复杂的项目时,一些简单的方法就可以马上写出来;但一些复杂的方法、在不同的类中需要不同的实现、那么这个时候就需要用到抽象类的。
抽象类定义了方法而不实现,正因为这样,其子类可以有更多的展现空间和实现能力;就好比定义方法名称和返回值,至于如何实现完全交给子类处理。

static方法类

(全局或者静态)用来修饰成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。 意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见。既然属于类,就可以不靠创建对象来调用了。
静态变量
当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值。减少代码,减少内存消耗。可通过类名+字段名,如果用public修饰,则可以在程序中的任何地方都可以通过上述方式访问
假如需要定义一个关于课表的学生类,里面有姓名,年龄,学号,上课教室,这里的共有信息:上课教室(用红色标注)。对于姓名,年龄,学号而言,每个对象都要用自己独立的数据,但是对于上课教室而言,应该是多个对象共享同一份数据才对。因为同一班级的同学的是一个集体,上课的教室也是一个共有的属性,假如下一节课要换一所教室上课的话,如果不用static修饰成员变量,则需要全部对象都更改一遍,此处举例三人,但是一个班的同学的数据会更多,所需代码也就会越多,也会消耗更多内存。
在这里插入图片描述

静态方法
当 static 修饰成员方法时,该方法称为静态方法 。静态方法在声明中有 static ,可直接使用类名来调用
class Text{
public static int number;
public int temp;
}
如果你想访问temp属性,你就必须先创建一个Text的对象,才能访问:Text b=new Text();
b.temp;这就是实例成员变量

想访问number的话,不用创建Text的实例就可以访问,就像这样:Text.number.这就是类成员变量

### public static abstract 关键字组合的用法含义 #### C# 中 `public static abstract` 的特性 在 C# 中,`public static abstract` 这种关键字组合并不合法。具体来说,在 C# 语法中,静态成员(由 `static` 定义)不允许被标记为抽象 (`abstract`)。这是因为静态成员属于类本身而不是其实例,而抽象成员则要求子类提供具体的实现版本[^1]。 然而,如果仅考虑 `public abstract` 或者单独使用这些修饰符,则有如下解释: - **Public**: 表明该成员对外部完全开放访问权限。 - **Abstract**: 声明一个没有实际功能体的方法或属性,强制任何非抽象派生类都必须给出自己的实现方式。 因此,在 C# 中常见的做法是在抽象类里定义公共抽象成员,例如: ```csharp // 抽象类 Shape 可以拥有多个不同的图形作为它的子类 public abstract class Shape { // 此处定义了一个公开且抽象的方法 Draw() public abstract void Draw(); } ``` 对于 Java 来说情况有所不同,自 JDK8 开始支持默认方法(default methods),这使得接口能够包含带有默认实现的方法。尽管如此,Java 并不允许可同时声明为 `static` `abstract` 成员;但是可以在接口内创建静态方法以及抽象方法。 #### 合理替代方案 当希望模拟类似于 "public static abstract" 功能时,通常会采用以下几种模式之一: - 利用接口配合默认实现来达到目的; - 创建工具类中的工厂方法或其他辅助逻辑; - 设计不可变对象并通过嵌套私有的构造函数控制实例化过程。 例如,在 C# 中可以通过接口加扩展方法的方式间接实现某些类似的效果: ```csharp using System; namespace ExampleNamespace { /// <summary> /// 接口 IFoo 提供了一些操作契约 /// </summary> public interface IFoo { string GetData(); } /// <summary> /// 扩展类 FooExtensions 添加了静态帮助方法给IFoo类型的对象 /// </summary> public static class FooExtensions { public static string GetStaticData(this IFoo foo) => "This is a static-like method result."; } } class Program { static void Main(string[] args) { var myFoo = new ConcreteFoo(); // 实现了IFoo接口的具体类 Console.WriteLine(myFoo.GetStaticData()); // 调用了扩展方法GetStaticData } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值