7 getter和setter的用法(权限控制(权限最小原则)
1 概念
类是面向对象语言的程序设计中的概念,是面向对象编程的基础。类是对现实生活中一类具有共同特征的事物的抽象,用来构造对象模板。简单来说,我们可以把具体的对象从三个层次进行解析。假设这个具体的对象是一名学生,在概念层上是学生,在逻辑层上是由学号、姓名、班级等一系列信息组成的一份档案,这些信息特征表现为属性,对其行为抽取表现为方法,在物理层上是在内存中的存储形式。
面向对象是相对于面向过程来讲的。面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统,更贴近事物的自然运行建模模式。
2 定义
假设现在有一批学生需要用身高进行排序,这时,只将身高排序是不行的,就需要将姓名和身高进行绑定,然后再进行排序。为实现这样的操作,我们需要构造以下模板(类)。
public class Student {
//构造对象的语法:在类里、方法外定义一个变量,该变量不加static,又称为属性
//属性也符合默认值语法
public String name;
public int height;
public String major = "搬砖";
}
3 对象实例化
3.1 实例化代码
//Student视为一种引用类型
//s是变量名,new Student()是利用Student这个类构造的一个新对象(对象的实例化过程)
//s指向这个新对象
Student s = new Student();
System.out.println(s.name);
System.out.println(s.height);
System.out.println(s.major);
3.2 实例化步骤
- 通过类中的信息,计算对象内存的大小。在堆区由JVM为对象分配内存空间,并且把这关内存区域全部用0进行初始化操作。
- 执行对象的初始化过程,按照初始化规则调用初始化语句,完成对象的实例化。
- 通过引用赋值来调用对象。
4 属性初始化
4.1 默认值规则
public String name; //null
public int height; // 0
4.2 构造方法规则(也称构造器)
- 构造方法的名称必须和类名称保持一致
- 没有返回值类型的声明
- 构造器的重载(方法名相同,参数列表不同)
//没有构造方法时,编译器默认构造一个无参的构造方法
//一旦定义了方法,就不会构造默认方法
//实例化时,根据参数列表选择相应的构造方法进行调用
public Student(){
name = "默认值";
major = "搬砖";
height = 180;
//System.out.println("我是无参的构造方法");
}
public Student(String a){
System.out.println("我是String参数的构造方法");
}
public Student(String n, int h, String m){
name = n;
major = m;
height = h;
// name = "lala";
// height = 180;
// major = "computer";
}
//形参的变量名和属性变量名重复了,在使用时加上this.name就可以调用属性变量\
public Student(String name ,String major,int height){
//不使用this.调用形参
// System.out.println(name);
// System.out.println(major);
// System.out.println(height);
this.name = name;
this.major = major;
this.height = height;
}
4.3 定义时初始化规则
public String major = "搬砖";
4.4 构造代码块规则
//出现在类的内部,方法的外部
{
System.out.println("我是一个构造代码块");
}
属性初始化的执行顺序:
默认值规则->定义时初始化和构造代码块(按书写顺序执行)->构造器。
下面这段代码的执行的结果为:2->3->4->5->1
public class InitOrderDemo {
public InitOrderDemo() {//构造器
System.out.println("1");
}
{
System.out.println("2");//构造代码块
}
//定义时初始化
public int a = InitA();
public int b = InitB();
public int InitA() {
System.out.println("3");
return 1;
}
{
System.out.println("5");
}
public int InitB(){
System.out.println("4");
return 2;
}
public static void main(String[] args) {
new InitOrderDemo();
}
}
注意:如果代码中有静态代码块,则首先执行静态代码块中的内容(静态代码块在类的加载过程中执行)。
5 行为
在java中以实例方法的形式体现,定义语法中不要加static,可以在实例方法中可以访问属性(和构造方法类似),必须通过引用来操作对象调用实例方法。
静态方法(类方法) | 加static修饰 | 不能访问属性,可以调用普通方法,可以直接调用 | 不能使用this |
普通方法(实例方法) | 不加static修饰 | 可以访问属性,不能调用普通方法,需要用对象的引用去调用 | 可以使用this |
方法的执行依赖于对象,同样的方法,对象不同,执行的结果也不同。类到对象的过程就是实例化的过程。在静态上下文中无法直接调用普通方法,也不能访问对象的属性。不论是方法还是变量,凡是加了static的都与当前的对象无关,不加static,和本类的对象息息相关。
6 this的作用
- (1)this是一个引用,类型就是当前类,指向当前对象。例如:class Person{this 类型为Person}
- 构造器中this指向当前正在构造的对象,例如:this.name
- (2)在一个构造方法中调用另一个构造方法。
public class UseThisCalledConstructorDemo {
UseThisCalledConstructorDemo(){
//this必须在第一行
this(18);
System.out.println("无参");
}
UseThisCalledConstructorDemo(int a){
System.out.println("1");
}
public static void main(String[] args) {
new UseThisCalledConstructorDemo();
}
}
7 getter和setter的用法(权限控制(权限最小原则)
public class Person {
//getter和setter可以通过Alt+Insert 统一生成
private String name;//只读权限
//getter:get属性名称
public String getName() {
return name;
}
private boolean alive;
public boolean isAlive() {
return alive;
}
private String sex;//读写权限并且有约束
public String getSex() {
return sex;
}
//setter:set属性名称
public void setSex(String sex) {
if (sex != "男" || sex != "女") {
return;
}
this.sex = sex;
}
}