目录
3.封装
3.1 面向对象共有三个特征:封装,继承,多态。
封装表现:
1、方法就是一个最基本封装体。
2、类其实也是一个封装体。
从以上两点得出结论,封装的好处:
1、提高了代码的复用性。
2、隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。
3、提高了安全性。
3.2 私有private
class Person {
int age;
String name;
public void show() {
System.out.println("age=" + age + ",name" + name);
}
}
public class PersonDemo {
public static void main(String[] args) {
// 创建Person对象
Person p = new Person();
p.age = -20; // 给Person对象赋值
p.name = "人妖";
p.show(); // 调用Person的show方法
}
}
描述人。Person 属性:年龄。 行为:说话:说出自己的年龄。
通过上述代码发现,虽然我们用Java代码把Person描述清楚了,但有个严重的问题,就是Person中的属性的行为可以任意访问和使用。这明显不符合实际需求。
可是怎么才能不让访问呢?需要使用一个Java中的关键字也是一个修饰符 private(私有,权限修饰符)。只要将Person的属性和行为私有起来,这样就无法直接访问。
类中不需要对外提供的内容都私有化,包括属性和方法 |
class Person {
private int age;
private String name;
public void show() {
System.out.println("age=" + age + ",name" + name);
}
}
//-----------------------------------------------------------
class Person {
// 私有成员变量
private int age;
private String name;
// 对外提供设置成员变量的方法
public void setAge(int a) {
// 由于是设置成员变量的值,这里可以加入数据的验证
if (a < 0 || a > 130) {
System.out.println(a+"不符合年龄的数据范围");
return;
}
age = a;
}
// 对外提供访问成员变量的方法
public int getAge() {
return age;
}
}
成员变量私有后,需要提供访问方式。只要对外提供可以访问的方法,让其他程序访问这些方法。
一般对成员属性的访问动作:赋值(设置 set),取值(获取 get),因此对私有的变量访问的方式可以提供对应的 setXxx或者getXxx的方法。
注意:私有仅仅是封装的体现形式而已 |
3.3 this关键字
当在方法中出现了局部变量和成员变量同名的时候,可以在成员变量名前面加上this.来区别成员变量和局部变量
//Person.java
package cn.itcast.demo05;
/*
* 私有化所有的属性(成员变量),必须写对应的set,get方法
* 凡是自定义的类,自定义成员变量必须私有化
*/
public class Person {
private int age;
private String name;
public void setAge(int a) {
if (a < 0 || a > 130) {
System.out.println("年龄不符合要求");
} else {
age = a;
}
}
public void setName(String n) {
name = n;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void show() {
int age=60;
String name="liupc";
//方法中的age,name和成员变量重名,就近原则,访问局部变量
System.out.println("访问局部变量:"+"age=" + age + ",name:" + name);
//加上this.访问成员变量
System.out.println("访问成员变量:"+"age=" + this.age + ",name:" + this.name);
}
public boolean compare(Person p) {
//自己和别人比年龄,自己是this和p
return this.age==p.age;
//p1.age==p2.age
}
}
//PersonTest.java
package cn.itcast.demo05;
public class PersonTest {
public static void main(String[] args) {
Person p= new Person();
p.setAge(50);
p.setName("月半就是胖");
p.show();//就近原则,方法自己有,不会去调用成员变量,会使用自己的局部变量,如果要使用成员变量,则使用this
System.out.println(p.getName()+"..."+p.getAge());
System.out.println("--------------------------------");
Person p1= new Person();
Person p2= new Person();
p1.setAge(15);
p2.setAge(16);
//p2参数,传递给变量p
//this是p1
boolean b= p1.compare(p2);
System.out.println(b);
}
}
注意:
this到底代表什么呢?this代表的是对象,哪个对象调用了this所在的方法,this就代表哪个对象。
4.综合案例---随机点名案例重构
分析:
1.存储全班同学信息(姓名、年龄)
2.打印全班同学每一个人的信息(姓名、年龄)
3.在班级总人数范围内,随机产生一个随机数,查找该随机数所对应的同学信息(姓名、年龄)并打印
//Student.java
package cn.itcast.demo07;
public class Student {
private String name;
private int age;
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;
}
}
//CallName.java
package cn.itcast.demo07;
import java.util.ArrayList;
import java.util.Random;
/*
*随机点名器
* 1.创建集合,将student对象存储到集合中
* 2.总览学生信息 遍历
* 3.随机点名,随机数作为索引,到集合中查找元素
*/
public class CallName {
public static void main(String[] args) {
//定义集合Arraylist,存储Student类型
ArrayList<Student> array=new ArrayList<Student>();
addStudent(array);
printStudent(array);
randomStudent(array);
}
//随机点名
public static void randomStudent(ArrayList<Student> array) {
Random ran=new Random();
int index =ran.nextInt(array.size());
Student s = array.get(index);
System.out.println("随机点名:name"+s.getName()+",age:"+s.getAge());
}
//总览学生信息
public static void printStudent(ArrayList<Student> array) {
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
System.out.println("name"+s.getName()+",age:"+s.getAge());
}
}
//创建集合:添加学生信息
public static void addStudent(ArrayList<Student> array) {
Student s1= new Student();
s1.setName("lisi1");
s1.setAge(11);
Student s2= new Student();
s2.setName("lisi2");
s2.setAge(12);
Student s3= new Student();
s3.setName("lisi3");
s3.setAge(13);
Student s4= new Student();
s4.setName("lisi4");
s4.setAge(14);
Student s5= new Student();
s5.setName("lisi5");
s5.setAge(15);
array.add(s1);
array.add(s2);
array.add(s3);
array.add(s4);
array.add(s5);
}
}