什么是封装?
封装的本质就是让类的调用者不必太多的了解类的实质者是如何实现类的,只要知道如何使用类就行了。这样就降低了类使用者的学习和使用成本,从而降低了复杂程度。
private实现封装
被public修饰的成员变量或者成员方法,可以直接被类的调用者使用。
被private修饰的成员变量或者成员方法,不能被类的调用者直接使用。
示例
class People{
//成员变量
public String name;
public int age;
private String name1;
private int age1;
//成员方法
public void eat(){
System.out.println("吃饭!");
}
private void eat1(){
System.out.println("吃饭!");
}
public class Main {
public static void main(String[] args) {
People peo = new People();//实例化对象
peo.name = "张三";
peo.age = 21;
peo.name1 //报错
peo.age1 //报错
peo.eat1 //报错
System.out.println(peo.name + peo.age); //打印结果 张三21
peo.eat(); //打印结果 吃饭!
}
}
如果字段用private修饰,那么在mian方法中调用就需要借助类中的方法,private修饰的方法或属性只能在同一个类中被调用。但是这样就需要给private修饰的属性直接赋值
示例:
class People{
private String name = "张三";//直接赋值
private int age = 21;
public void show(){ //方法用public修饰,这样就可以被调用
System.out.println("我叫" + name + ",今年" + age + "了。");
}
}
public class Main {
public static void main(String[] args) {
People peo = new People();//实例化对象
peo.show();//调用show方法
}
}
//执行结果
我叫张三,今年21了。
这样虽然能够打印显示,但是后期得修改大量代码,不够方便。此时如果想要获取或者修改private属性,就需要使用getter/setter方法。
示例
class People{
private String name;
private int age;
//getter方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
//setter方法
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
People peo = new People();//实例化对象
peo.setName("张三");//修改名字
peo.setAge(21);//修改年龄
System.out.println(peo.getName() + " " + peo.getAge());
}
}
//执行结果:
张三 21
不是所有的字段都一定要提供setter/getter方法,而是要根据实际情况决定提供哪种方法。
在IDEA中可使用alt+insert(alt+F12) 快捷生成setter/getter方法。
构造方法
new 执行过程
为对象分配内存空间
调用对象的构造方法
语法规则
方法名称必须与类名相同
构造方法没有返回值类型声明
每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)
注意事项
如果类中没有提供任何的构造函数,那么编译器会默认生成一个不带参数的构造函数
若类中定义了构造方法,则默认的无参构造将不再生成
构造方法支持重载,规则和普通方法重载一致
示例
class People{
private String name;//实例成员变量
private int age;
//构造方法
public People(){
System.out.println("不带参的构造方法!");
}
public People(String name){
this.name = name;
System.out.println("带有一个参数的构造方法!");
}
public People(String name,int age){
this.name = name;
this.age = age;
System.out.println("带2个参数的额构造方法!");
}
//show方法 用来调用打印名字年龄
public void show(){
System.out.println(this.name + " " + this.age);
}
}
public class Main {
public static void main(String[] args) {
People peo1 = new People();//调用不带参的构造方法
peo1.show();//默认初值name = null age = 0
People peo2 = new People("李四"); //调用带有1个参数的构造方法
peo2.show();
People peo3 = new People("张三",21);//调用带有2个参数的构造方法
peo3.show();
}
}
//执行结果
不带参的构造方法!
null 0
带有一个参数的构造方法!
李四 0
带2个参数的额构造方法!
张三 21
this关键字
this.属性;//访问当前对象的属性
this.func(); //调用当前对象的方法
this(); //调用当前对象的构造方法
示例
class People{
private String name;//实例成员变量
private int age;
//构造方法 实现重载
public People(){
this("李四",21);//调用当前对象的构造方法
}
public People(String name,int age){
this.name = name;//调用当前对象的属性
this.age = age;
System.out.println("带2个参数的构造方法!");
}
//show方法
public void show(){
System.out.println(this.name + " " + this.age);
}
public void func(){
this.show();//调用当前对象的show方法
}
}
public class Main {
public static void main(String[] args) {
People peo1 = new People();//调用不带参的构造方法
peo1.show();
People peo2 = new People("张三",20);//调用带有2个参数的构造方法
peo2.func();
}
}
//执行结果
带2个参数的构造方法!
李四 21
带2个参数的构造方法!
张三 20