JAVA 从入门到起飞 面向对象 day08 P2

news2025/2/28 15:31:08

 

老师的知识点1

在JAVA中,必须先设计类,才能获得对象。

我的理解:

疑问:为什么是这样的呢?

答案:

在 JAVA 或其他面向对象的编程语言中,类是对象的蓝图或模板。这意味着在你创建对象之前,你需要定义一个类来指明你的对象应该拥有哪些属性和方法。这个设计模式有几个原因和优点:

1. **规范性与一致性**:
   通过首先定义类,你可以确保每个对象都具有一致的结构和行为。这提供了一个明确的规范,指明了对象的属性和能够执行的操作。

2. **代码重用与模块化**:
   类允许你创建具有相同属性和方法的多个对象,而无需重复编写代码。这有助于减少代码重复,同时也使得代码更加模块化和可维护。

3. **抽象化**:
   类提供了一种抽象化的方式,使你能够将现实世界中的复杂实体模拟为简化但仍然代表其基本特性和行为的对象。

4. **封装与信息隐藏**:
   通过定义类,你可以实现封装,即将对象的内部状态和实现细节隐藏起来,仅通过公共接口暴露出必要的信息和交互方式。这有助于保护对象的内部状态,并提高代码的安全性和稳定性。

5. **易于维护和扩展**:
   通过使用类和对象,程序更易于维护和扩展。如果需要更改对象的结构或行为,你只需要在类级别进行更改,而不是在多个地方更改相同的代码。

因此,必须先设计类以便能够定义对象的结构和行为,然后才能创建和使用具有这些结构和行为的对象。这是面向对象编程的基本原则和工作方式。

2.如何定义类?

 老师的答案:

如上图。我觉得很直观了

我的答案:

在 Java 中定义一个类基本上包括以下几个步骤和元素:

### 1. 定义类的基本结构:

public class ClassName {
    // 类体
}

- `public` 是一个访问修饰符,它定义了这个类的可见性。除了 `public`,还有其他的访问修饰符,比如 `protected`, `private` 和默认的包级访问。
- `class` 是一个关键字,用来声明这是一个类。
- `ClassName` 是你给这个类起的名字,应遵循大驼峰命名规则。

### 2. 声明类的属性(字段):

public class ClassName {
    private String attribute1;
    private int attribute2;
}

- `private` 是访问修饰符,表示这些属性只能在这个类内部访问。
- 属性的类型和名称:这里定义了两个属性,一个是字符串类型,一个是整数类型。

### 3. 定义类的方法:

public class ClassName {
    private String attribute1;
    private int attribute2;

    public void method1() {
        // 方法体
    }

    public int method2(int parameter) {
        // 方法体
        return 0;  // 根据实际情况返回合适的值
    }
}

- 方法可以有返回类型(如 `method2`),也可以没有(如 `method1`,其返回类型是 `void`)。
- 方法可以有参数,也可以没有参数。

### 4. 定义构造方法:

public class ClassName {
    private String attribute1;
    private int attribute2;

    public ClassName() {
        // 无参数构造方法
    }

    public ClassName(String attribute1, int attribute2) {
        this.attribute1 = attribute1;
        this.attribute2 = attribute2;
        // 带参数构造方法
    }

    // ... 其他方法
}

- 构造方法用于创建类的对象,它的名称必须与类名相同。
- 可以定义多个构造方法,实现构造方法重载。

以上是定义一个基本类的方法。可以根据实际需要添加更多的属性和方法,以及进行更复杂的操作和逻辑实现。

 3.如何得到类的对象

老师举了个例子就是构建手机类

package Phone;

public class Phone {
    //属性
    String brand;
    double price;
    //行为
    public void call(){
        System.out.println("手机在打电话");
    }
    public void playgame(){
        System.out.println("手机在打电话");
    }
}
package Phone;

public class Phonetest {
    public static void main(String[] args){
        //创建手机的对象
        Phone p=new Phone();
        p.brand="小米";
        p.price=199.9;
        System.out.println(p.brand);
        System.out.println(p.price);
    }
}

 

运行结果:

 

我的答案:

在Java中,你可以通过多种方式来获取一个类的对象:

### 1. 使用 `new` 关键字

最常见的方法是使用 `new` 关键字来创建一个类的新实例:

MyClass myObject = new MyClass();

### 2. 通过反射

你也可以通过反射来动态创建对象:

try {
    Class<MyClass> myClass = (Class<MyClass>) Class.forName("MyClass");
    MyClass myObject = myClass.getDeclaredConstructor().newInstance();
} catch (Exception e) {
    e.printStackTrace();
}

### 3. 克隆一个已存在的对象

如果一个类实现了 `Cloneable` 接口,你可以通过调用 `clone` 方法来创建一个新的对象:

MyClass originalObject = new MyClass();
try {
    MyClass clonedObject = (MyClass) originalObject.clone();
} catch (CloneNotSupportedException e) {
    e.printStackTrace();
}

### 4. 使用工厂方法

你可以通过一个工厂方法来创建对象。工厂方法是一个返回类的实例的静态方法:

public class MyClass {
    public static MyClass createInstance() {
        return new MyClass();
    }
}

// 使用工厂方法创建对象
MyClass myObject = MyClass.createInstance();
```

### 5. 反序列化

如果一个类实现了 `Serializable` 接口,你可以通过反序列化来创建对象:

```java
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"))) {
    MyClass myObject = (MyClass) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

注意:对于上述每个例子,`MyClass` 应该替换为你想创建对象的实际类名。

4.如何使用对象

老师的答案:

访问属性:对象名,成员变量

访问行为:对象名,方法名

总结:

补充扩展:

JAVAbean类:

`JavaBean` 是Java编程中的一种标准,主要用于封装多个属性为一个单一对象,方便数据的存储和传输。JavaBean通常满足以下几个标准或条件:

1. 有一个公共的无参数的构造函数。
2. 属性私有化,并通过公共方法(getter和setter方法)来访问这些属性。
3. 实现`Serializable`接口,使得JavaBean可以被序列化和反序列化。
4. 可以包含业务逻辑方法,但这些方法通常是对该JavaBean属性的操作或与属性相关的逻辑。

下面是一个简单的JavaBean类的例子:

import java.io.Serializable;

public class Person implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private String name;
    private int age;
    
    public Person() {
        // 无参数的构造函数
    }

    // getter 方法
    public String getName() {
        return name;
    }

    // setter 方法
    public void setName(String name) {
        this.name = name;
    }

    // getter 方法
    public int getAge() {
        return age;
    }

    // setter 方法
    public void setAge(int age) {
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

在这个例子中,`Person`类就是一个简单的JavaBean,它有两个私有属性(`name`和`age`),通过公共的getter和setter方法来访问和修改这些属性,并实现了`Serializable`接口以支持序列化。

测试类:

创建一个测试类是一个很好的方法来检验你的 `JavaBean` 类是否正常工作。下面是一个简单的测试类,使用了上面定义的 `Person` 类:

public class PersonTest {
    public static void main(String[] args) {
        // 创建一个 Person 对象
        Person person = new Person();
        
        // 使用 setter 方法设置属性值
        person.setName("John");
        person.setAge(30);
        
        // 使用 getter 方法获取属性值,并打印到控制台
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
        
        // 使用 toString 方法打印对象的状态
        System.out.println("Person Details: " + person.toString());
    }
}

当你运行这个测试类时,它应该输出:
Name: John
Age: 30
Person Details: Person [name=John, age=30]

这个测试类首先创建了一个新的 `Person` 对象,然后使用 `setter` 方法设置了 `name` 和 `age` 属性。然后它使用 `getter` 方法获取这些属性的值并打印它们,最后它使用 `toString` 方法打印出对象的整体状态。

定义类的补充注意事项:

老师的答案:

老师举了个手机类的例子。

package Phone;

public class Phone {
    //属性
    String brand;
    double price;
    //行为
    public void call(){
        System.out.println("手机在打电话");
    }
    public void playgame(){
        System.out.println("手机在打电话");
    }
}

 

package Phone;

public class Phonetest {
    public static void main(String[] args){
        //创建手机的对象
        Phone p=new Phone();
        p.brand="小米";
        p.price=199.9;
        System.out.println(p.brand);
        System.out.println(p.price);
    }
}

 运行结果:

我的答案:

在Java中定义类时,除了遵循基本的语法规则和编码标准之外,还应考虑以下几点,以确保代码的可维护性、可读性和可重用性:

1. **封装性**:
   - 限制类的字段和方法的访问级别(使用`private`, `protected`, `public`修饰符)。
   - 提供公共的getter和setter方法来访问和修改私有属性。

2. **命名规范**:
   - 类名应该是名词,以大写字母开头,遵循驼峰命名法。
   - 方法名应该是动词,以小写字母开头,遵循驼峰命名法。

3. **文档和注释**:
   - 使用JavaDoc来为类及其成员变量和方法提供适当的文档。
   - 使用注释来解释代码中复杂或不明显的部分。

4. **代码结构**:
   - 保持类的职责单一,避免一个类做太多事情。
   - 尽量减少类中的代码重复,考虑使用继承或者组合来复用代码。

5. **初始化和清理**:
   - 提供合适的构造方法来初始化对象。
   - 如果需要,可以覆盖`finalize`方法来清理对象。

6. **异常处理**:
   - 使用适当的异常处理来处理可能出现的错误情况。
   - 为方法提供适当的`throws`声明,或者使用`try-catch`块来处理异常。

7. **依赖管理**:
   - 尽量减少类之间的紧密耦合,使用接口和抽象类来实现松耦合。

8. **合理使用静态成员**:
   - 考虑将一些不依赖于实例状态的方法或常量定义为静态成员。

9. **遵循设计原则和模式**:
   - 尽量遵循软件设计的一些基本原则,如开闭原则、依赖倒置原则等。
   - 如果可能,尝试使用设计模式来解决复杂的设计问题。

10. **单元测试**:
    - 为类编写单元测试,以验证其正确性和功能。
    - 试图覆盖各种边界条件和异常情况。

遵循这些注意事项可以帮助你创建更健壮、更可维护和更易于理解的代码。

 老师的练习:

package GirlFriend;

public class Girlfriendtext {
    //创建女朋友的对象
    Girlfriend gf1=new Girlfriend();
    gf1.name="琳琳";
    gf1.age=18;
    gf1.gender='少女';
    System.out.Printlen(gf1.name);
    gf1.eat();
}

实际例子:

讲的非常好。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/996312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【已解决】在Win11上离线安装 .NET Framework 3.5的方法【含网盘离线文件】

随 Windows 11提供的是.NET Framework 4.8&#xff0c;该环境可以运行任何 .NET Framework 4.x 应用。 而.NET Framework 3.5 支持为 .NET Framework 2.0 到 3.5 生成的应用&#xff0c;需要自行安装。 当Win11的应用软件需要.net framework3.5的运行环境时&#xff0c;就会提…

领域驱动设计:微服务架构模型

文章目录 整洁架构六边形架构DDD 分层架构三种微服务架构模型的对比和分析从三种架构模型看中台和微服务设计 整洁架构 整洁架构又名“洋葱架构”。为什么叫它洋葱架构&#xff1f;整洁架构的层就像洋葱片一样&#xff0c;它体现了分层的设计思想。在整洁架构里&#xff0c;同…

跨站请求伪造

CSRF是什么&#xff1f; 跨站请求伪造(Cross Site Request Forgery&#xff0c;CSRF)是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击&#xff0c;攻击的重点在于更改状态的请求&#xff0c;而不是盗取数据&#x…

西部是真的地广人稀啊,常用地市东西分布差异明显

背景 最近在使用folium处理一些工作上的事情&#xff0c;这过程中发现一些GPS坐标数据的获取和置换不是太方便&#xff0c;尤其是坐标置换&#xff0c;做了一些工作进行了GPS坐标数据秘坐标置换方向的封装。 GPS坐标类封装的过程中&#xff0c;发现一些常用的GPS坐标的查取比…

安装程序报错“E: Sub-process /usr/bin/dpkg returned an error code (1)”的解决办法

今天在终端使用命令安装程序时出现了如下的报错信息。 E: Sub-process /usr/bin/dpkg returned an error code (1) 这种情况下安装什么程序最终都会报这个错&#xff0c;具体的报错截图如下图所示。 要解决这个问题&#xff0c;首先使用下面的命令进到相应的目录下。 cd /var/…

项目02—基于keepalived+mysqlrouter+gtid半同步复制的MySQL集群

文章目录 一.项目介绍1.拓扑图2.详细介绍 二.前期准备1.项目环境2.IP划分 三. 项目步骤1.ansible部署软件环境1.1 安装ansible环境1.2 建立免密通道1.3 ansible批量部署软件1.4 统一5台mysql服务器的数据 2.配置基于GTID的半同步主从复制2.1 在master上安装配置半同步的插件,再…

蓝桥杯官网练习题(玩具蛇)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一条玩具蛇&#xff0c;一共有 16 节&#xff0c;上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。 小蓝还有一个…

ROS学习笔记(五)---话题发布

1. 话题通信是什么 在ROS&#xff08;机器人操作系统&#xff09;中&#xff0c;话题通信是一种常用的通信机制&#xff0c;用于在不同的ROS节点之间传递消息。话题通信基于发布者-订阅者模式&#xff0c;其中一个节点&#xff08;发布者&#xff09;发布消息到一个特定的话题…

使用最新android sdk 将jar文件编译成dex

最近需要一些比较骚的操作&#xff0c;所以需要将gson编译成dex。 因为手上有jar包&#xff0c;所以就拿出了android sdk准备一把入魂&#xff0c;结果报错不断&#xff0c;让人无奈。只好根据报错来调整编译步骤&#xff0c;不得不为安卓环境更新Debug。 1、dx变d8 并不确定…

postgresql-通用表达式

postgresql-通用表达式 入门案例简单CTE递归 CTE案例1案例2 入门案例 -- 通用表达式 with t(n) as (select 2) select * from t;简单CTE WITH cte_name (col1, col2, ...) AS (cte_query_definition ) sql_statement;WITH 表示定义 CTE&#xff0c;因此 CTE 也称为 WITH 查询…

Pandas中at、iat函数详解

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 at 函数&#xff1a;通过行名和列名来取值&#xff08;取行名为a, 列名为A的值&#xff09; iat 函数&#xff1a;通过行号和列号来取值&#xff08;取第1行&#xff0c;第1列的值&#xff09; 本文给出at、iat常见的…

Mybatis-Plus-入门简介(2)

Mybatis-Plus-入门简介 1.简介 Mybatis-Plus官网&#xff1a;https://baomidou.com/ Mybatis-Plus仓库地址&#xff1a;https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter 仓库地址&#xff1a;仓库地址&#xff1a;https://gitee.com/long-xiaozhe…

932. 漂亮数组

932. 漂亮数组 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 932. 漂亮数组 https://leetcode.cn/problems/beautiful-array/description/ 完成情况&#xff1a; 解题思路&#xff1a; nums 是由范围 [1, n] 的…

智慧公厕破解公共厕所管理的“孤岛现象”

在现代社会中&#xff0c;公共厕所是城市管理中的一项重要任务。然而&#xff0c;经常会出现公厕管理的“孤岛现象”&#xff0c;即每个公厕都是独立运作&#xff0c;缺乏统一的管理和监控机制。针对这一问题&#xff0c;智慧公厕的出现为解决公共厕所管理难题带来了新的方案。…

无涯教程-JavaScript - COUPNUM函数

描述 COUPNUM函数返回结算日和到期日之间应付的息票数量,四舍五入到最接近的整数。 语法 COUPNUM (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 Re…

Co-SLAM——论文解析

Co-SLAM: Joint Coordinate and Sparse Parametric Encodings for Neural Real-Time SLAM 神经隐式表征slam&#xff08;implict neural representaton&#xff0c;INR&#xff09;使用一个连续函数来表征图像或者三维voxel&#xff0c;并用神经网络来逼近这个函数。Co-SLAM 也…

MyBatis-Plus-扩展操作(3)

3.扩展 代码生成 逻辑删除 枚举处理器 json处理器 配置加密 分页插件 3.1 代码生成 https://blog.csdn.net/weixin_41957626/article/details/132651552 下载下面的插件 红色的是刚刚生成的。 我觉得不如官方的那个好用&#xff0c;唯一的好处就是勾选的选项能够看的懂得。…

架构图怎么制作?分享5个实用方法!

面对复杂的系统、应用程序或项目&#xff0c;绘制架构图是一种关键的手段&#xff0c;帮助我们清晰地展示各个组件、关系和交互。本文将带你深入了解几种常见的制作架构图的方法&#xff0c;一起看下去吧。 1 手绘和扫描 对于简单的概念&#xff0c;你可以手绘架构图&#…

自考本科,毕业八年,2023浙大MPA提面优秀分享

去年十月中旬&#xff0c;我参加了浙江大学MPA提前批面试。结果出乎意料地&#xff0c;我竟然获得了A资格。对此&#xff0c;我自己也感到难以置信。事实上&#xff0c;我只是抱着试一试的心态递交了申请材料。因为通过我对前几年浙大自划线的情况来看&#xff0c;对于浙江大学…

OSPF协议:优点、初始化流程和管理

文章目录 一、RIP的缺陷二、定义三、OSPF初始化流程1. 建立邻居和邻接关系2. 邻接路由器之间交换链路状态信息&#xff0c;实现区域内链路状态数据库同步3. 每台路由器根据本机链路状态数据库&#xff0c;计算到达每个目的网段的最优路由&#xff0c;写入路由表 四、OSPF分区域…