封装是把过程和数据包装起来,对数据的访问只能通过已定义的接口
举个例子:对于一个Man这个类来说,name、age、wife都是私有属性,对于属性的封装使用“private”
public class Man {
private String name;
private int age;
private String wife;
}
Man这个类对外界的类提供方法的封装,通过这些封装方法的调用,可以对Man这个类中的属性进行赋值set和获取get,设定姓名、年龄等,也可以获得姓名、年龄。
public class Man {
//属性封装
private String name;
private int age;
private String wife;
//行为封装
//其他类对私有属性name进行赋值,调用这个方法
public void setName(String name){
//this.name的name指得是类成员变量private String name;中的name
// = name,即等号右边的name指的是(String name)中的形参name
this.name = name;
}
//其他类获取私有属性name的值时,调用这个方法
public String getName(){
//这里的name指的就是上面private name
return name;
}
//其他类对私有属性age进行赋值,调用这个方法
public void setAge(int age){
//this.age中的age指的是类成员变量private age,中的age\
// = age,即等号右边的age指的是(int age)中的形参age
this.age = age;
}
}
public class Man {
private String name;
private int age;
private String wife;
}
public class Man {
//属性封装
private String name;
private int age;
private String wife;
//快捷键生成的方法封装
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class DemoApplication {
public static void main(String[] args) {
//利用new关键字创建一个对象man
Man man = new Man();
//调用封装的setName,属于有参无返的方法,故在括号中传入实参
man.setName("张");
//调用封装的getName,打印输出就调用这个方法
System.out.println(man.getName());
//调用封装的方法setAge,属于有参无返的情况,故在括号中传入实参
man.setAge(1);
//调用封装的方法getAge,打印输出就调用这个方法
System.out.println(man.getAge());
}
}
作用:用来访问类成员变量,用于区分类成员变量和局部变量(方法体中的变量)
例:现在有一个教师类,有三个public的类成员属性(实例变量)
public class Teacher {
public String name; //姓名
public int age; //年龄
public double salary; //工资
}
外界类想要方法这个类中的三个属性,直接访问且对这三个属性进行赋值肯定是做不到的,先需要构造器,
解决办法:为Teacher类添加一个构造方法,在方法中进行参数传递进行修改
public class Teacher {
public String name; //姓名
public int age; //年龄
public double salary; //工资
//出现有参构造时一定要定义无参构造
public Teacher() {
}
//创建有参构造器,为上面三个属性赋值做准备
public Teacher(String name, int age, double salary) {
this.name = name; //this.name 中的this指的是指向本类的成员变量, this.name中的name指的是本类中的public String name;中的name
this.age = age;
this.salary = salary;
}
}
在测试类中,先new一个对象,因为new的过程中调用了构造器,所以在new的同时在括号中传入实参,代码示例如下:
public class DemoApplication {
public static void main(String[] args) {
//利用new关键字创建一个对象,同时传入实参
Teacher teacher = new Teacher("甲",2,33.33);
//打印输出结果为甲
System.out.println(teacher.name);
//打印结果输出为2
System.out.println(teacher.age);
}
}
打印输出的内容均是new过程中传入的实参。
总结:当一个类的类成员变量名和与访问该属性的方法参数名一致时,则需要用this关键字来访问类中的类成员变量,以区分类成员变量和方法中的参数。
例如:在Dog这个类中,
代码示例如下:
public class Dog {
//定义一个jump()方法
public void jump() {
System.out.println("正在执行jump方法");
}
//定义一个run()方法
public void run() {
//通过this调用jump()方法
this.jump();
System.out.println("正在执行run方法");
}
}
在测试类中:
代码示例如下:
public class DemoApplication {
public static void main(String[] args) {
//利用new关键字new一个Dog类的对象
Dog dog = new Dog();
//通过dog对象调用了Dog类中的run()方法;这个方法
//run()方法中又通过this调用了本类方法jump()
dog.run();
}
}
注意:对于static修饰的方法而言,可以直接使用类来调用该方法,如果在ststic修饰的方法中使用this关键字,则这个关键字就会无法指向合适的对象,所以,static修饰的方法中不能用this引用,并且Java语法规定,静态成员不能直接访问非静态成员;
作用:this() 用于访问本类的构造方法(构造器是类的一种特殊方法,方法名称和类名相同,没有返回值,括号中可以有参数,如果有参数就是有参构造方法)
例:创建一个Student学生类,利用this(“实参列表”)给实例变量name赋值
Student代码示例如下:
public class Student {
public String name;
//无参构造器
public Student() {
//通过this(“实参列表")调用类中的有参构造器对name进行赋值
//this("有参构造")必须放在第一个构造器的第一行
this("甲");
}
//有参构造器
public Student(String name) {
this.name = name;
}
}
在测试类中。利用new关键字new一个对象出来后,打印输出name的值为甲
代码示例如下:
public class DemoApplication {
public static void main(String[] args) {
//利用new关键字new一个Student类的对象
Student student = new Student();
//控制台打印输出结果为甲
System.out.println(student.name);
}
}
定义一个Car类,封装其属性name和color,
对于color属性来说,不能为red,否则爆红
对于name属性来说,不能传入null,否则报错
public class Car {
private String name;
private String color;
public String getName() {
return name;
}
public void setName(String name) {
/**
* 判断 如果在启动项中赋值name为空 抛出异常
*/
if ( name == null) {
throw new IllegalArgumentException("invalid name");
}
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
/**
* 判断 如果在启动项中赋值color为red 抛出异常
*/
if ( name == null || name.isEmpty() ) {
throw new IllegalArgumentException("invalid name");
}
this.color = color;
}
}
在启动项中:
public class DemoApplication {
public static void main(String[] args) {
Car car = new Car();
car.setColor("red");
System.out.println("车子的颜色为--------------------"+car.getColor());
car.setName(" ");
System.out.println("车子的名字为---------------------"+car.getName());
}
}
控制台报错如下: