Java三个小老弟

本文深入讲解Java的继承、封装和多态三大特性。探讨了继承如何提高代码复用性,封装如何增强数据安全性,以及多态如何提升程序的扩展性和维护性。详细解析了抽象类与接口的概念及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   

Java 继承。

   Java 封装。   

Java 多态。

继承

把很多类的相同特征和行为进行抽取,

用一个类来描述。

让多个类和这个类产生一个关系。

这样的话,多个类就可以省略很多代码。

这个关系就是继承。

java中用extends关键字表示。


 继承的体系结构
       多个具体的对象,

    不断的向上抽取共享的内容,

       最终形成了一个体系。

        这个体系叫做继承体系。


继承体系的学习和使用原则
1,学习顶层的内容。

因为他是整个体系的共性内容。
2, 创建子类使用。

也就是使用底层的具体对象。

 继承的特点:
        java中只能单继承,没有多继承。
        java可以有多重(层)继承。


    继承的好处:
        继承的出现提高了代码的复用性。
        继承的出现让类与类之间产生了关系,

提供了多态的前提。

子父类中的成员关系


成员变量
   在子类方法中使用一个变量时,

首先,

在方法的局部变量中找这个变量,

有则使用。

否则,在本类中找成员变量,

有则使用。

否则,在父类中找成员变量,有则使用。

否则,报错。

成员方法
  用子类对象使用一个方法时。

首先,在子类中找这个方法,

有则使用。

否则,在父类中找这个方法,

有则使用。

否则,报错。

重写和重载的区别

重载:在同一类中。

方法名相同,参数列表不同。

重载可以改变返回类型。
     重写:在不同类中(子父类中)

方法声明相同

(返回类型,方法名,参数列表均相同)。
 重写需要注意:
           子类方法的访问权限要大于等于父类方法的访问权限。

 静态只能重写静态。

但是这种情况一般不会出现。

构造方法

子类的实例化过程

                子类创建对象时,会先去创建父类的对象。

默认是去调用父类的无参构造方法。

子类构造方法中,

第一行默认是super()
        为什么子类中第一行会默认有super()

因为他继承父类的成员使用,

使用前这些成员必须初始化,

而他们是父类的成员,

所以,必须通过父类进行初始化。

所以,会先创建一个父类的对象。

当父类没有无参构造方法时,

必须使用this

或者super调用其他的构造方法。


    this和super的区别
        this:代表本类对象的引用。
        super:代表父类的存储空间。

封装

 指隐藏对象的属性和实现细节,

仅对外提供公共访问方式

将抽象得到的数据和行为(或功能)相结合,

形成一个有机的整体,

也就是将数据与操作数据的源代码

进行有机的结合,

形成“类”,

其中数据和函数都是类的成员。

在电子方面,

封装是指把硅片上的电路管脚,

用导线接引到外部接头处,

以便与其它器件连接。

比如电脑机箱、笔记本等


好处:
将变化隔离;方便使用;
 提高复用性;提高安全性

多态

 同一个对象,

在程序不同时刻的多种运行状态。

举例:动物,狗是狗,狗是动物。

水(气态,液态,固态)


   多态前提
        存在着继承或者实现关系
        有方法的重写
        父类(接口)引用指向子类(实现)对象
   多态的好处和弊端:
        好处:

多态的存在提高了程序的扩展性和后期可维护性
        弊端:

虽然可以预先使用,

但是只能访问父类中已有的功能,

运行的是后期子类的功能内容。

不能预先使用子类中定义的特有功能。


    多态中对象调用成员的特点
        Fu f = new Zi();
        成员变量:编译看左边,运行看左边
       成员方法 :编译看左边,运行看右边
        静态方法:编译看左边,运行看左边

抽象类


多个类有相同的方法声明,

但是方法体不一样。

这个时候,

我们考虑把方法声明进行抽取。

让子类继承后,

自己去实现方法体。

没有方法体的方法

我们需要用抽象标志下。

抽象的关键字是:abstract。


    抽象类:
该方法称为抽象方法,

包含抽象方法的类就是抽象类。


    抽象类的特点:
        抽象类和抽象方法都要用abstract进行修饰
        抽象类不能被实例化
        抽象类中不一定有抽象方法,

但是,

有抽象方法的类一定是抽象类。


抽象类中数据的特点
成员变量:

抽象类中可以有变量,

也可以有常量。
成员方法:

抽象类中可以有抽象方法,

也可以有非抽象方法。
构造方法:

抽象类是一个类,

所以,它有构造方法。

虽然本身不能实例化。

但是可以给子类实例化使用。


抽象类中的问题
        抽象类中是否有构造方法?

能不能被实例化?

如果不能,

为什么有构造方法?
抽象类有构造方法。
抽象类不能被实例化。
          抽象类中的构造方法供子类实例化调用。

抽象关键字abstract

不可以和哪些关键字共存?
private:

私有内容子类继承不到,

所以,不能重写。

但是abstract修饰的方法,

要求被重写。

两者冲突

final:

final修饰的方法不能被重写。

而abstract修饰的方法,

要求被重写。两者冲突。

static:

假如一个抽象方法能通过static修饰,

那么这个方法,

就可以直接通过类名调用。

而抽象方法是没有方法体的,

这样的调用无意义。

所以,不能用static修饰。


抽象类中可不可以没有抽象方法?

如果可以,这样的类有什么用吗?
抽象类可以没有抽象方法。
        抽象类中没有抽象方法的作用,

只是为了不让别的类建立该抽象类对象。

这个在awt中有体现。

ITSTAR ∣一起学编程

    


长按,识别二维码,加关注

我就知道你“在看”

### 将Java中的`fmap`转换为JSON格式 在Java中,将似于`fmap`的数据结构(通常指映射型如`Map<K, V>`)转换为JSON格式的任务非常常见。以下是实现这一目标的一些方法和库: #### 使用Jackson库 Jackson 是一个广泛使用的Java库,能够轻松地将对象(包括`Map`型的实例)序列化为JSON字符串或将JSON反序列化回对象。 ```java import com.fasterxml.jackson.databind.ObjectMapper; import java.util.HashMap; import java.util.Map; public class MapToJsonExample { public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); // 创建一个示例Map Map<String, Object> map = new HashMap<>(); map.put("key1", "value1"); map.put("key2", 123); map.put("key3", true); // 转换Map为JSON字符串 String jsonString = objectMapper.writeValueAsString(map); System.out.println(jsonString); // 输出 {"key1":"value1","key2":123,"key3":true} } } ``` 这种方法利用了 Jackson 的 `ObjectMapper` [^6],它提供了简单易用的 API 来完成序列化操作。 --- #### 使用Gson库 另一个流行的选项是 Google 提供的 Gson 库。它的使用方式也十分直观。 ```java import com.google.gson.Gson; import java.util.HashMap; import java.util.Map; public class MapToJsonWithGson { public static void main(String[] args) { Gson gson = new Gson(); // 创建一个示例Map Map<String, Object> map = new HashMap<>(); map.put("name", "Alice"); map.put("age", 30); map.put("isStudent", false); // 转换Map为JSON字符串 String json = gson.toJson(map); System.out.println(json); // 输出 {"name":"Alice","age":30,"isStudent":false} } } ``` 这里展示了如何通过 Gson 实现相同的目标[^7]。 --- #### 自定义实现 如果不希望依赖外部库,则可以手动构建 JSON 字符串。然而这种方式容易出错且维护成本高,仅适用于极其简单的场景。 ```java import java.util.Map; public class ManualJsonConversion { public static String convertToJSON(Map<String, ?> map) { StringBuilder sb = new StringBuilder("{"); boolean firstEntry = true; for (Map.Entry<String, ?> entry : map.entrySet()) { if (!firstEntry) { sb.append(","); } sb.append("\"").append(entry.getKey()).append("\":\"").append(entry.getValue()).append("\""); firstEntry = false; } sb.append("}"); return sb.toString(); } public static void main(String[] args) { Map<String, String> map = Map.of("key1", "value1", "key2", "value2"); System.out.println(convertToJSON(map)); // 输出 {"key1":"value1","key2":"value2"} } } ``` 尽管如此,在实际开发中强烈推荐采用成熟的第三方库以简化工作并减少潜在错误[^8]。 --- ### 总结 对于大多数情况而言,借助像 Jackson 或 Gson 这样的成熟框架是最优解法。它们不仅支持基本数据型还兼容复杂嵌套结构以及自定义的处理需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值