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;}@Overridepublic 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("caixukun@example.com");// 获取并打印属性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;}}
}