1.构造器
1.1 详解
类的成员:构造器
构造器的作用
- 初始化对象:构造器用于设置对象的初始值,确保对象在创建时是有效的。
- 提供灵活性:可以重载构造器,以便在创建对象时提供不同数量或类型的参数,从而支持多种初始化方式。
- 限制对象创建:通过构造器,可以控制对象的创建过程,例如通过私有构造器实现单例模式。
构造器的使用说明
// 构造器的声明格式
class ClassName {
// 构造器
public ClassName(parameters) {
// 构造器体
}
}
注意:
- 构造器的名称必须与类名相同。
- 构造器没有返回类型(即使是
void
也不需要声明)。 - 可以定义多个构造器,参数列表必须不同。
1.2 举例
题目1:创建一个 Student
类,包含 name
和 grade
属性。通过构造器初始化这些属性,并提供一个方法来显示学生信息。
class Student {
private String name;
private String grade;
// 带参构造器
public Student(String name, String grade) {
this.name = name;
this.grade = grade;
}
public void displayInfo() {
System.out.println("学生姓名: " + name + ", 年级: " + grade);
}
}
// 主程序
public class PersonTest {
public static void main(String[] args) {
Student student1 = new Student("甲一", "高三");
student1.displayInfo();
}
}
题目2:创建一个 Book
类,包含 title
和 author
属性。通过构造器初始化这些属性,并提供一个方法来显示书籍信息。
class Book {
private String title;
private String author;
// 带参构造器
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public void displayInfo() {
System.out.println("书名: " + title + ", 作者: " + author);
}
}
// 主程序
public class Main {
public static void main(String[] args) {
Book book1 = new Book("Java 编程思想", "Bruce Eckel");
book1.displayInfo();
}
}
2.实例变量赋值过程
2.1 详解
1.实例变量的赋值过程主要包括以下几个步骤:
- 定义类:在类中声明实例变量。
- 创建对象:通过使用
new
关键字来创建对象实例,这会触发构造器。 - 初始化实例变量:在构造器中或直接在声明时对实例变量进行赋值。
- 访问和使用实例变量:通过对象来访问和使用实例变量。
2.在类的属性中,可以有哪些位置给属性账值?
- ①默认初始化;
- ②显式初始化;
- ③构造器中初始化;
- ④通过"对象.方法"的方式赋值;
- ⑤通过"对象.属性"的方式赋值;
3.这些位置执行的先后顺序是怎样?
- ①-②-③-④/⑤
4.以上操作在对象创建过程中可以执行的次数如何?
- 只能执行一次:①、②、③
- 可以多次执行:④、⑤
2.2 举例
一个简单的学生系统:
class Student {
// 实例变量
private String name; // 学生姓名
private int age; // 学生年龄
private String grade; // 学生年级
// 构造器
public Student(String name, int age, String grade) {
this.name = name; // 赋值实例变量
this.age = age; // 赋值实例变量
this.grade = grade; // 赋值实例变量
}
// 显示学生信息的方法
public void displayInfo() {
System.out.println("学生姓名: " + name);
System.out.println("学生年龄: " + age);
System.out.println("学生年级: " + grade);
System.out.println();
}
}
public class PersonTest {
public static void main(String[] args) {
// 创建Student对象并通过构造器赋值,姓名使用中文
Student student1 = new Student("程咬金", 20, "大一");
student1.displayInfo(); // 显示学生信息
// 创建另一个Student对象,姓名使用中文
Student student2 = new Student("李逵", 21, "大二");
student2.displayInfo(); // 显示学生信息
}
}
3.JavaBean的理解与UML类图
3.1 JavaBean
理解:JavaBean 是一种符合特定约定的 Java 类,通常用于封装数据并提供访问和修改这些数据的机制。
具体指符合以下标准的java类:
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get、set方法
举例:
题目:简单的用户信息显示
import java.io.Serializable;
public class User implements Serializable {
private String username; // 用户名
private String password; // 密码
private String email; // 邮箱
// 无参构造函数
public User() {
}
// 带参数的构造函数
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
// Getter 和 Setter 方法
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", email='" + email + '\'' +
'}';
}
}
import java.io.Serializable;
public class PersonTest {
public static void main(String[] args) {
// 创建 User 对象
User user = new User();
// 设置属性
user.setUsername("蔡旭困");
user.setPassword("securePassword123");
user.setEmail("[email protected]");
// 获取并打印属性
System.out.println("Username: " + user.getUsername());
System.out.println("Email: " + user.getEmail());
// 打印 User 对象
System.out.println(user);
}
}
3.2 UML类图
3.2.1 详解
- UML (Unified Modeling Language,统一建模语言) ,用来描述软件模型和架构的图形化语言。
- 常用的UML工具软件有PowerDesinger、Rose 和Enterprise Architect 。
- UML工具软件不仅可以绘制软件开发中所需的各种图表,还可以生成对应的源代码。
- 在软件开发中,使用UML类图可以更加直观地描述类内部结构(类的属性和操作)以及类之间的关系(如关联、依赖、聚合等)。
1.+表示public类型,- 表示private类型, #表示protected类型
2.方法的写法:
- 方法的类型(+、)方法名(参数名:参数类型): 返回值类型
3.斜体表示抽象方法或类。
3.2.2 类图表示
类的表示
- 类的定义:一个类通常用一个矩形表示,矩形可以分为三个部分:
- 类名(Top section):显示类的名称,通常使用大写字母开头。
- 属性(Middle section):列出类的属性,包括属性名和数据类型,通常格式为
属性名: 数据类型
。 - 方法(Bottom section):列出类的方法,通常格式为
方法名(参数列表): 返回类型
。
图解:
类之间的关系
类图中的类之间可以有多种关系,主要包括以下几种:
-
关联(Association):表示类之间的静态关系。通常用直线表示,线的两端可以带有箭头,箭头指向关联的方向。关联可以是单向或双向。
-
聚合(Aggregation):表示“整体-部分”关系,用空心菱形标记整体的端点。整体和部分可以独立存在。
-
组合(Composition):也是“整体-部分”关系,但比聚合更强,表示部分不能独立于整体存在。用实心菱形表示。
-
继承(Generalization):表示类之间的继承关系,通常用带空心三角形的线表示,三角形指向父类。
-
实现(Realization):表示接口与实现类之间的关系,通常用带空心三角形的虚线表示。
举例:
实战UML类图示例:
代码:
TestBanking类中的代码
package test;
import banking.*;
public class TestBanking {
public static void main(String[] args) {
Bank bank = new Bank();
Customer customer;
Account account;
// 创建两个客户和他们的账户
bank.addCustomer("Jane", "Simms");
customer = bank.getCustomer(0);
account = customer.getChecking();
customer.setSavings(new SavingAccount(500.00, 0.05));
customer.setChecking(new CheckingAccount(200.00, customer.getSavings()));
bank.addCustomer("Owen", "Bryant");
customer = bank.getCustomer(1);
customer.setChecking(new CheckingAccount(200.00));
// 测试 Jane Simms 的支票账户(有透支保护)
customer = bank.getCustomer(0);
System.out.println("Customer [" + customer.getLastName()
+ ", " + customer.getFirstName() + "]"
+ " has a checking balance of "
+ customer.getChecking().getBalance()
+ " and a savings balance of "
+ customer.getSavings().getBalance());
System.out.println("Checking Acct [Jane Simms] : withdraw 150.00 succeeds? "
+ account.withdraw(150.00));
System.out.println("Checking Acct [Jane Simms] : deposit 22.50 succeeds? "
+ account.deposit(22.50));
System.out.println("Checking Acct [Jane Simms] : withdraw 147.62 succeeds? "
+ account.withdraw(147.62));
System.out.println("Customer [" + customer.getLastName()
+ ", " + customer.getFirstName() + "]"
+ " has a checking balance of "
+ account.getBalance()
+ " and a savings balance of "
+ customer.getSavings().getBalance());
System.out.println();
// 测试 Owen Bryant的支票账户 (没有透支保护)
customer = bank.getCustomer(1);
account = customer.getChecking();
System.out.println("Customer [" + customer.getLastName()
+ ", " + customer.getFirstName() + "]"
+ " has a checking balance of "
+ account.getBalance());
System.out.println("Checking Acct [Owen Bryant] : withdraw 100.00 succeeds? "
+ account.withdraw(100.00));
System.out.println("Checking Acct [Owen Bryant] : deposit 25.00 succeeds? "
+ account.deposit(25.00));
System.out.println("Checking Acct [Owen Bryant] : withdraw 175.00 succeeds? "
+ account.withdraw(175.00));
System.out.println("Customer [" + customer.getLastName()
+ ", " + customer.getFirstName() + "]"
+ " has a checking balance of "
+ account.getBalance());
System.out.println();
}
}
CheckingAccount类中的代码
package banking;
public class CheckingAccount extends Account{
private SavingAccount protectedBy=null;
public CheckingAccount(double balance) {
super(balance);
}
public CheckingAccount(double balance, SavingAccount protect) {
super(balance);
this.protectedBy = protect;
}
public boolean withdraw(double amt){
if (balance < amt){
if(protectedBy==null){
return false;
}
if (amt-balance> protectedBy.getBalance()) {
return false;
}else {
protectedBy.balance-=amt-balance;
balance=0;
return true;
}
}else {
balance-=amt;
return true;
}
}
}
标签:customer,String,类图,构造,System,println,UML,public,out
From: https://blog.csdn.net/m0_72047169/article/details/142719972