数据封装
保护数据的一种方法,将对象的属性和方法隐藏起来。
私有属性
使用 private 代替 public 使属性变为私有属性
private int age;
private String name;
私有属性在其它类里面不能访问,可以通过 get/set 方法给私有属性赋值
private int age;
public void setAge(){
//设置属性代码;
}
public int getAge(){
//获取属性代码;
}
方法封装
用于隐藏一个方法
public class Demo{
private void method1(){
//私有方法代码;
}
public void method2(){
//公开方法代码;
}
}
应用场景
正常情况下,所有属性都应该设置为私有,除非确保外部不能访问
构造方法
创建对象的时候都会自带一个方法,叫做构造方法,如:
Student s = new Student();
Person p = new Person();
该构造方法没有返回类型,与类名相同,在new对象的时候会被自动调用,并且每个对象的构造方法最多只会被调用一次。
空构造方法
也叫默认构造方法
- 默认构造方法没有任何参数
- 默认构造方法不会执行任何具体操作
- 一旦手动设置构造函数后,那么这个默认构造函数将不再存在
如果想用构造方法初始化一些属性,调用一些方法,可以手动定义一个空构造函数,用来覆盖这个默认构造函数
public class Student(){
// 构造方法
public Student(){
System.out.println("...")
}
}
// 使用构造方法
Student s = new Student();
构造方法名与类名必须保持一直,并且没有返回类型
构造方法参数
因为对象创建时只会调用构造方法一次,可以在构造方法中对对象的属性进行初始化操作
public class Studnet{
private String name;
//带参构造方法
public Student(String name){
this.name = name;
}
//写方法
public void setName(String name){
this.name = name;
}
//读方法
public String getName(){
return this.name;
}
}
上述构造方法中,实例化对象时需要传递一个参数给构造方法;
Student s = new Student("学生1")
也可以使用多个参数,如:
public class 类名{
// 带参构造方法
public 类名(参数类型1 参数名1, 参数类型2 参数名2 ...)
}
// 创建对象
类名 对象名 = new 类名((参数类型1 参数名1, 参数类型2 参数名2 ...)
多个构造方法
有时候我们可以想使用多种方式来构造一个对象,比如只初始化一部分属性,另一部分使用默认值,这种需求可以通过定义多个构造函数实现:
public class Player{
private String name;
private int age;
// 第一个构造函数
public Player(){
name = "无名氏";
age = 18;
}
// 第二个构造函数
public Player(String name){
this.name = name;
age = 18;
}
// 第三个构造函数
public Player(String name, int age){
this.name = name;
this.age = age;
}
}
// 使用构造函数
Player p1 = new Player(); // 使用的是第一个构造函数
Player p1 = new Player("玩家1"); // 使用的是第二个构造函数
Player p1 = new Player("玩家1", 18); // 使用的是第三个构造函数
多个构造函数的价值和特点:
- 多种初始化手段,提供给使用者
- 类似方法的重载
- 可以使用 this() 优化
this关键字
this关键字可以指明使用的是当前类的属性或方法,可用于区分属性和方法传递的参数
public class Teacher(){
private int age;
public void setAge(int age){
this.age = age; //this.age为属性, age为参数
}
}
this构造方法
一个类可以有多个构造方法,这些构造方法之间的代码一般能够复用,这就需要使用 this() 构造方法调用了。
public class Player{
private String name;
private int age;
// 第一个构造函数
public Player(){
this("无名氏");
System.out.print("->1 ");
}
// 第二个构造函数
public Player(String name){
this(name, 18);
System.out.print("->2 ");
}
// 第三个构造函数
public Player(String name, int age){
this.name = name;
this.age = age;
System.out.print("->3 ");
}
}
// 调用
new Player(); // ->3 ->2 ->1
new Player("s"); // ->3 ->2
new Player("b", 38); // ->3
主要作用是可以通过 this(参数) 将多个构造串联起来,该形式并不是必须的,主要是为了简化代码