对于普通对象来说,调用属性名进行赋值时,需要去记住对象的属性名以及类型,非常麻烦,并且对于属性值没有验证机制,不能保证数据的安全性和隐秘性。而封装就能解决这些问题。
封装:是将类里的某些信息通过访问权限修饰符,限制其使用范围,从而达到隐藏的目的,要访问或者修改的话只能通过类暴露出来的setter/getter执行。
封装的好处:隐藏实例化的细节,并且只能通过规定的方法进行更改或者查看,而不是任何类属性都可以查看和修改。
封装的实现步骤:
1.对类中属性使用private修饰
2.创建setter/getter方法
3.在setter/getter中进行逻辑验证
public class User{
private String username;
private String userpwd;
private int age;
/**
* set 对属性赋值
* 对于第三方提供的参数 必须做验证
*
* @param age
*/
public void setAge(int age){
// 数据验证
if(age >= 0){
this.age = age;
} else{
System.err.println ("输入年龄值不合法!!");
}
}
/**
* 获取年龄值
*
* @return 年龄值
*/
public int getAge(){
return age;
}
public void setUsername(String username){
this.username = username;
}
}
上一篇文章说到了类与对象的概念以及如何创建一个类和实例化一个对象,之前实例化的对象时,都是隐式构造,也就是说没有在创建的时候传入我们需要的添加的参数,有时候我们需要直接快捷的实例化一个满足条件的对象,这时我们可以使用构造方法来完成。
构造方法的格式:
类名为方法名,没有返回值结构
public class User{
private String username;
private String userpwd;
private int age;
// 构造方法
// 如果显式的写了构造方法 那么隐式就会被覆盖,不管显式的是否带参数
// 只会被调用一次--- 创建对象时调用
public User(String username, String userpwd, int age){
this.setUsername (username);
this.userpwd = userpwd;
this.setAge (age);
}
}
此时实例化的对象就可以传入需要的参数
public class UserManage{
public static void main(String[] args){
User user = new User ("admin","admin123",20);
//隐式构造时的写法
//user.username="admin";
//user.userpwd="admin123";
//user.age=-20;
}
}
接下来在介绍一个概念,叫做重载(TypeScript中也有此概念,笔者会在之后的文章中专门介绍)
同一个类中,有同名的方法。但有关键前提,方法中的参数不一致
1.参数有无
public class User{
String username;
String userpwd;
int age;
public User(String username, String userpwd, int age){
this.setUsername = username;;
this.userpwd = userpwd;
this.setAge (age);
}
// 方法重载
// 重载不同的构造方法 实现不同的对象创建
public User(){
this.setUsername = "";;
}
}
2.参数类型不同
public class User{
String username;
String userpwd;
int age;
public User(String username, String userpwd, int age){
this.setUsername = username;;
this.userpwd = userpwd;
this.setAge = age;
}
// 方法重载
// 重载不同的构造方法 实现不同的对象创建
public User(String username, String userpwd, double age){
this.setUsername = username;
this.userpwd = userpwd;
this.setAge = age;
}
}
3.参数的数量不同
public class User{
String username;
String userpwd;
int age;
public User(String username, String userpwd, int age){
this.setUsername = username;;
this.userpwd = userpwd;
this.setAge = age;
}
// 方法重载
// 重载不同的构造方法 实现不同的对象创建
public User(String username, int age){
this.setUsername = username;;
this.setAge = age;
}
}
4.参数的顺序不同
public class User{
String username;
String userpwd;
int age;
public User(String username, String userpwd, int age){
this.setUsername = username;;
this.userpwd = userpwd;
this.setAge = age;
}
// 方法重载
// 重载不同的构造方法 实现不同的对象创建
public User(int userpwd, String username, String age){
this.userpwd = userpwd;
this.setUsername = username;;
this.setAge = age;
}
}
接下来介绍一个常见的设计模式——单例模式(之后会拿JavaScript和TypeScript专门写一个介绍)
单例模式的概念以及实现方法:
-
一个类在一个系统只有一个对象
-
一个王国只有一个国王,一个班级只有一个班主任,比如常见的管理系统中设置的超级管理员实际上就是单例模式的一个应用
-
不能随意可以创建新的对象,选择使用private 修饰构造方法,使其在类之外不能创建对象
-
那就需要在本类中,自己来创建一个唯一的对象,提供给外部
-
-
static 静态的 唯一性
-
由static 修饰的属性与方法,不属于对象,只属于类本身且只有一份,可以由类名直接调用
-
public class User{
private String username;
private String userpwd;
private int age;
/** 文档注释
* 私有化构造方法
* @param username 用户名
* @param userpwd 密码
* @param age 年龄
*/
private User(String username, String userpwd, int age){
this.username = username;
this.userpwd = userpwd;
this.age = age;
}
// 创建单例
private static User king = new User ("king","king123",80);
// 提供一个静态的方法来获取king对象
public static User getKing(){
return king;
}
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
public String getUserpwd(){
return userpwd;
}
public void setUserpwd(String userpwd){
this.userpwd = userpwd;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
class UserManage{
public static void main(String[] args){
// User user = new User ("admin","admin123",20);
User king = User.getKing ();// 直接调用静态方法 返回单例
}
}
欢迎各位批评指正