封装
封装就是将一些细节信息隐藏起来对于外界不可见,在Java中的体现
- 方法就是一种封装
- 关键字private也是一种封装
1 private关键字的作用及使用
private关键字可以提高代码的安全性
- 创建一个Person类
/*
问题描述:定义Person的年龄的时候,无法阻止不合理的数组被设置进来
解决方法:用private关键字将需要保护的成员变量进行修饰,在本类当中依然可以随意访问,但是超出了本类范围不能直接访问
但是可以间接访问
间接访问private成员变量,就是定义一对getxxx和setxxx方法
getXxx:不可以有参数,返回值类型和成员变量对应
setXxx:不能有返回值,参数类型和成员变量对应
*/
public class Person {
String name;//姓名
//int age;//年龄
private int age;//年龄
public void show() {
System.out.println("我叫:"+ name + ", 年龄:" + age);
}
//成员方法
//方便外部间接访问age
//1 对age进行设置
public void setAge(int num) {//方法名固定
if (num < 100 && num >= 0) {
age = num;
} else {
System.out.println("数据不合理");
}
}
//2. 获取age中的数字
public int getAge() {
return age;
}
}
- 使用
public class Demo02Person {
public static void main(String[] args) {
Person person = new Person();
person.show();//我叫:null, 年龄:0
person.name = "赵丽颖";
//person.age = -20;私private成员变量不可直接访问
//间接访问如下
person.setAge(-20);//数据不合理
person.show();//我叫:赵丽颖, 年龄:0
person.setAge(20);
person.show();//我叫:赵丽颖, 年龄:20
}
}
2 练习使用private关键字定义一个学生类
- 定义
public class Student {
private String name;//姓名
private int age;//年龄
private boolean male;//是否为男性
public void setName(String str) {
name = str;
}
public String getName() {
return name;
}
public void setAge(int num) {
age = num;
}
public int getAge() {
return age;
}
public void setMale(boolean b) {
male = b;
}
public boolean isMale() {//对于基本类型中的Boolean值,getXxx方法要写成isXxx的形式
return male;
}
}
- 使用
public class Demo04Student {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("鹿晗");
stu.setAge(20);
stu.setMale(true);
System.out.println("姓名:" + stu.getName());
System.out.println("年龄:" + stu.getAge());
System.out.println("是否为男性:" + stu.isMale());
}
}
3 this关键字的作用
- 定义
//只要不在一个包中,就可以有同名的类
public class Person {
String name;//我自己的名字
//who是对方的名字,成员变量name是我自己的名字
public void sayHello(String who) {
System.out.println(who + ", 你好。我是" + name);
}
}
- 使用
public class Demo01Person {
public static void main(String[] args) {
Person person = new Person();
//设置我自己的名字
person.name = "王健林";
person.sayHello("王思聪");//王思聪, 你好。我是王健林
}
}
现在将定义的类稍作修改:将对方的名字who也修改成name
- 定义
/*
当方法的局部变量和类的成员变量重名的时候,根据就近原则,优先使用局部变量
*/
public class Person {
String name;//我自己的名字
//name是对方的名字,成员变量name是我自己的名字
public void sayHello(String name) {
System.out.println(name + ", 你好。我是" + name);
}
}
- 使用
public class Demo01Person {
public static void main(String[] args) {
Person person = new Person();
//设置我自己的名字
person.name = "王健林";//成员变量没用上
person.sayHello("王思聪");//王思聪, 你好。我是王思聪
}
}
那如何解决重名分不开的问题呢?this
- 定义
/*
当方法的局部变量和类的成员变量重名的时候,根据就近原则,优先使用局部变量
如果非要使用成员变量就需要使用一个格式:this.成员变量
记住: 通过谁调用的方法谁就是this.
比如:本例中在sayHello()方法的内部写了this.而person调用了该方法,person(是Person类的一个实例),那么this.name
就等于person.name
*/
public class Person {
String name;//我自己的名字
//who是对方的名字,成员变量name是我自己的名字
public void sayHello(String name) {
System.out.println(name + ", 你好。我是" + this.name);
System.out.println(this);//与person是同一个地址cn.itcast.day05.demo04.Person@6e8dacdf
}
}
- 使用
public class Demo01Person {
public static void main(String[] args) {
Person person = new Person();
//设置我自己的名字
person.name = "王健林";//成员变量没用上
person.sayHello("王思聪");//王思聪, 你好。我是王健林
System.out.println(person);//与this是同一个地址cn.itcast.day05.demo04.Person@6e8dacdf
}
}
4 构造方法
- 定义
public class Student {
public Student() {
System.out.println("构造方法被执行啦!");
}
}
- 使用
public class Demo02Student {
public static void main(String[] args) {
//当通过new创建一个对象的时候,其实就是在掉用构造方法(这和普通方法的调用有所不同)
Student stu = new Student();//运行该程序会自动打印 构造方法被执行啦!
}
}
对构造方法进一步说明:
- 定义
/*
构造方法专门用来创建对象的方法,当我们通过关键字new来创建对象的时候,其实就是在调用构造方法
格式:
public 类名称(参数类型 参数名称) {
//方法体
}
注意事项:
1. 构造方法的名称必须与所在类的名称完全一致,就连大小写也一样
2. 构造方法不要写返回值类型,连void都不要写
3. 构造方法不可以return一个具体的返回值
4. 如果没有编写任何构造方法,那么编译器会默认赠送一个构造方法,没有参数,方法体什么事情都不
做,就像这样: public Student(){}
5. 一旦编写了至少一个构造方法编译器将不再赠送
6. 构造方法也是可以被重载的(方法名称相同,参数列表不同)
*/
public class Student {
private String name;
private int age;
//构造函数
public Student(String name, int age) {
System.out.println("全参构造方法被执行啦!");//全参:成员变量都被使用了
this.name = name;
this.age = age;
}
public Student() {
System.out.println("无参构造方法被执行啦!");
}
}
- 使用
public class Demo02Student {
public static void main(String[] args) {
//当通过new创建一个对象的时候,其实就是在掉用构造方法(这和普通方法的调用有所不同)
Student stu1 = new Student();//无参构造方法被执行啦!
Student stu2 = new Student("赵丽颖",20);//全参构造方法被执行啦!
}
}
虽然通过全参数的构造方法可以对某个对象的name和age进行赋值,但是怎么修改和取出来呢
- 定义
public class Student {
//成员变量
private String name;
private int age;
//构造函数
public Student(String name, int age) {
System.out.println("全参构造方法被执行啦!");//全参:成员变量都被使用了
this.name = name;
this.age = age;
}
public Student() {
System.out.println("无参构造方法被执行啦!");
}
//get方法和set方法
public void setName(String str) {
name = str;
}
public String getName() {
return name;
}
public void setAge(int num) {
age = num;
}
public int getAge(){
return age;
}
}
- 使用
public class Demo02Student {
public static void main(String[] args) {
//当通过new创建一个对象的时候,其实就是在掉用构造方法(这和普通方法的调用有所不同)
Student stu1 = new Student();//无参构造方法被执行啦!
Student stu2 = new Student("赵丽颖",20);//全参构造方法被执行啦!
System.out.println("姓名是:" + stu2.getName() + ", 年龄是:" + stu2.getAge() + "岁。");//姓名是:赵丽颖, 年龄是:20岁。
//如果需要修改对象中成员变量数据类容,仍然需要使用setXxx方法
stu2.setAge(21);
System.out.println("姓名是:" + stu2.getName() + ", 年龄是:" + stu2.getAge() + "岁。");//姓名是:赵丽颖, 年龄是:21岁。
}
}
5 调用一个标准的学生类
- 定义
/*
一个标准的类通常拥有以下四个部分
1. 所有的成员变量都要使用private关键字
2. 为每一个成员变量写一对setter和getter方法
3. 编写一个无参数的构造方法
4. 编写一个有参数的构造方法
这样标准的类也叫做Java Bean
*/
public class Student {
private String name;
private int age;
//无参数的构造方法:菜单栏Code-->Generate--->选择Constructor--->Select None
public Student() {
}
//全参数的构造方法:菜单栏Code-->Generate--->选择Constructor--->都选上后点击OK
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//Getter和Setter方法:菜单栏Code-->Generate--->选择Getter and Setter--->都选上后点击OK 可以自动生成方法
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 Demo01Student {
public static void main(String[] args) {
Student stu1 = new Student();
stu1.setName("迪丽热巴");
stu1.setAge(20);
System.out.println("姓名:" + stu1.getName() + ",年龄:" + stu1.getAge());//姓名:迪丽热巴,年龄:20
Student stu2 = new Student("古力娜扎",21);
System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());//姓名:古力娜扎,年龄:21
stu2.setAge(22);
System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());//姓名:古力娜扎,年龄:22
}
}