封装
1、什么是封装?
隐藏事物的属性和实现细节,对外提供公共的访问方式。
2、封装的好处
提高了代码的安全性
隐藏了代码的实现细节
提高了代码的复用性
3、封装的原则
隐藏事物的属性
隐藏事物的实现细节
对外提供访问方式
4、private 关键字
(1)private单词:私有的。
(2)可以修饰的内容
修饰成员变量
修饰成员方法
修饰构造方法
修饰内部类
(3)修饰之后的效果
被private修饰的成员,只能在本类中访问,不能在外界其它类中访问。
private只是封装的一种体现形式,封装还可以使用其它的修饰符来完成。
5、Getter()和Setter()方法
为类中的私有属性对外提供修改和访问的方法
6、变量访问原则和this关键字
变量访问遵循就近原则
this关键字:
表示当前类型当前对象的引用
哪个来调用this所在的方法,this就代表哪个对象
作用:用于区分局部变量和成员变量同名的情况。使用this.属性名称的一定是成员变量,没有使用this.的变量,
根据就近原则来确定使用哪个变量。
public class Test1 { public static void main(String[] args) { Person p = new Person(); p.test(); } } class Person{ int age=5; public void test() { int age = 10; System.out.println(age); } }
7、构造方法
1.什么是构造方法?构造函数,构造器Constructor
2.有什么作用?用于给对象中的变量赋值,在创建对象时会自动调用构造方法,
如果没有写构造方法,会自动执行一个无参的构造方法,但只要自己定义了,无论有参无参,都不会自动调用了
3.构造方法的定义格式:
修饰符 方法名称(参数列表){方法体}
4.构造方法的格式说明:
构造方法的名称必须与类名完全一致
构造方法没有返回值,void 也不用写
构造方法没有return语句,或者直接写return;
5.注意事项
构造方法不需要手动调用,由JVM虚拟机在创建对象时候自动调用
对象本身不能调用构造方法
构造方法只能调用一次(一个对象),就在对象创建的时候
构造方法可能发生重载
6.构造方法和set的比较
1、构造方法和set方法都是用于给成员变量赋值。不希望外界直接访问私有成员变量,
通过构造方法或者set方法,间接的访问私有变量。
2、区别:
构造方法是在创建对象的同时,由jvm自动调用执行,用于给属性赋值,只能执行一次
set方法是在创建对象之后,由对象手动调用执行,用于给属性修改值,可以调用多次
3、使用场景比较:
一般set方法使用更加灵活,使用更加频繁
构造方法只能在创建对象的时候被自动调用一次,代码更加简洁。
一旦对象创建成功,就不能继续使用构造方法修改成员变量的值
8、对象创建内存理解
创建对象时有三个初始化过程:
构造方法初始化
默认初始化
显示初始化 eg:int a =3;
三者顺序:默认初始化 显示初始化 构造方法初始化
创建对象的过程:
1、将创建的对象所属类型加载到方法区
2、在栈内存中创建对象的引用,将来用于存储对象的地址
3、在堆内存中开辟内存空间,给成员变量分配内存
4、给成员变量默认初始化赋值
5、给成员变量显式初始化赋值
6、给成员变量构造方法初始化赋值
7、将对象的地址,赋值给栈内存中的引用
/* 3、设计一个类Student,该类包括姓名、学号和成绩。 设计一个方法,按照成绩从高到低的顺序输出姓名、学号和成绩信息。[选做题] */ import java.util.Arrays; class Homework3 { public static void main(String[] args) { StudentManager sm = new StudentManager(5); sm.add(new Student("h1",01,50)); sm.add(new Student("h2",02,60)); sm.add(new Student("h3",03,70)); sm.add(new Student("h4",04,30)); sm.add(new Student("h5",05,20)); sm.add(new Student("h5",05,20)); System.out.println("数组的长度为"+sm.length()); Student h5 = sm.find(05); h5.show(); sm.printAll(); System.out.println("-------------------------"); sm.paixu(); sm.printAll(); } } class StudentManager { private Student[] sdm = null; private int count = 0;//记录当前数组的元素个数 public StudentManager(int size){ if (size>0) { sdm = new Student[size]; }else { sdm = new Student[5]; } } //添加 public void add(Student a){ if (count>=sdm.length)//数组已满需扩充 { //扩充到原来的两倍 sdm.length*2 int newlen = sdm.length*2; sdm = Arrays.copyOf(sdm,newlen); } sdm[count] = a; count++; } //返回数组长度 public int length(){ return sdm.length; } //按成绩排序 public void paixu(){ for (int i=0; i<count-1;i++ ) { for (int j=0; j<count-1-i;j++ ) { /*if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp;}*/ if(sdm[j].getScore()>sdm[j+1].getScore()){ Student temp = sdm[j]; sdm[j] = sdm[j+1]; sdm[j+1] = temp; } } } } //更新数据 public void update(Student c){ Student temp = find(c.getId()); if (temp!=null) { temp.setName(c.getName()); temp.setScore(c.getScore()); } } //删除 public void delete(int id){ for (int i=0;i<count;i++ ) { if (sdm[i].getId()==id) { for (int j=i; j<count-1;j++ ) { sdm[j]=sdm[j+1]; } sdm[count-1]=null; count--; break; } } } //打印 public void printAll(){ for (int i=0;i<count;i++) { sdm[i].show(); } } //查找 public Student find(int id){ for (int i=0;i<count;i++ ) { if (sdm[i].getId()==id) { return sdm[i]; } } return null; } } class Student { private String name; private int id ; private int score;; public Student(){} public Student(String name,int id,int score){ this.name = name; this.id = id; this.score = score; } public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setId(int id){ this.id = id; } public int getId(){ return id; } public void setScore(int score){ this.score =score; } public int getScore(){ return score; } public void show(){ System.out.println("姓名:"+name+"..学号:"+id+"成绩:"+score); } }