⭐getter 和 setter方法
当我们使用 private 来修饰字段的时候, 就无法直接使用这个字段了.
代码示例
class Person { private String name = "张三"; private int age = 18; public void show() { System.out.println("我叫" + name + ", 今年" + age + "岁"); } } class Test { public static void main(String[] args) { Person person = new Person(); person.age = 20; person.show(); } } // 编译出错 Test.java:13: 错误: age可以在Person中访问private person.age = 20; ^ 1 个错误
此时如果需要【获取或者修改这个 private
属性】, 就需要使用 getter / setter
方法
代码示例
class Person { private String name;//实例成员变量 private int age; public void setName(String name){ //name = name;//不能这样写 this.name = name;//this引用,表示调用该方法的对象 } public String getName(){ return name; } public void show(){ System.out.println("name: "+name+" age: "+age); } } public static void main(String[] args) { Person person = new Person(); person.setName("caocao"); String name = person.getName(); System.out.println(name); person.show(); } // 运行结果 caocao name: caocao age: 0
注意事项
1. getName 即为 getter 方法, 表示获取这个成员的值.
2.setName 即为 setter 方法, 表示设置这个成员的值.
3.当set方法的形参名字和类中的成员属性的名字一样的时候,如果不使用this, 相当于自赋值. this 表示当前实例的引用.
4.不是所有的字段都一定要提供 setter getter 方法, 而是要根据实际情况决定提供哪种方法.
5.在 IDEA 中可以使用 alt + insert (或者 alt + F12) 快速生成 setter / getter 方法. 在 VSCode 中可以使用鼠标右键菜单 -> 源代码操作 中自动生成 setter / getter 方法.
🗽构造方法
⭐基本语法
构造方法是一种特殊方法, 使用关键字new实例化新对象时会被自动调用, 用于完成初始化操作.
new 执行过程
- 为对象分配内存空间
- 调用对象的构造方法
语法规则
- 1.方法名称必须与类名称相同
- 2.构造方法没有返回值类型声明
- 3.每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)
注意事项
- 如果类中没有提供任何的构造函数,那么编译器会 默认 生成一个不带有参数的构造函数
- 若类中定义了构造方法,则默认的无参构造将不再生成.
- 构造方法支持重载. 规则和普通方法的重载一致.
代码示例
class Person { private String name;//实例成员变量 private int age; private String sex; //默认构造函数 构造对象 public Person() { this.name = "caocao"; this.age = 10; this.sex = "男"; } //带有3个参数的构造函数 public Person(String name,int age,String sex) { this.name = name; this.age = age; this.sex = sex; } public void show(){ System.out.println("name: "+name+" age: "+age+" sex: "+sex); } } public class Main{ public static void main(String[] args) { Person p1 = new Person();//调用不带参数的构造函数 如果程序没有提供会调用不>带参数的构造函数 p1.show(); Person p2 = new Person("zhangfei",80,"男");//调用带有3个参数的构造函数 p2.show(); } } // 执行结果 name: caocao age: 10 sex: 男 name: zhangfei age: 80 sex: 男
⭐this关键字
this表示当前对象引用(注意不是当前对象). 可以借助 this 来访问对象的字段和方法.
private String name;//实例成员变量 private int age; private String sex; //默认构造函数 构造对象 public Person() { //this调用构造函数 this("bit", 12, "man");//必须放在第一行进行显示 } //这两个构造函数之间的关系为重载。 public Person(String name,int age,String sex) { this.name = name; this.age = age; this.sex = sex; } public void show() { System.out.println("name: "+name+" age: "+age+" sex: "+sex); } } public class Main{ public static void main(String[] args) { Person person = new Person();//调用不带参数的构造函数 person.show(); } } // 执行结果 name: bit age: 12 sex: man
我们会发现在构造函数的内部,我们可以使用this关键字,构造函数是用来构造对象的,对象还没有构造好,我们就使用了this,那this还代表当前对象吗?当然不是,this代表的是当前对象的引用,对象虽然还没构造好,但是系统在new过程的第一步时已经为对象分配好了内存空间,所以有是地址可以引用的。
🗽认识代码块
字段的初始化方式有:
1. 就地初始化
2. 使用构造方法初始化
3. 使用代码块初始化
前两种方式前面已经学习过了, 接下来我们介绍第三种方式, 使用代码块初始化.
⭐什么是代码块
使用 {} 定义的一段代码.
根据代码块定义的位置以及关键字,又可分为以下四种:
- 普通代码块
- 构造块
- 静态块
- 同步代码块(后续讲解多线程部分再详细介绍)
⭐普通代码块
这种用法较少见
普通代码块:定义在方法中的代码块. public class Main{ public static void main(String[] args) { { //直接使用{}定义,普通方法块 int x = 10 ; System.out.println("x1 = " +x); } int x = 100 ; System.out.println("x2 = " +x); } } // 执行结果 x1 = 10 x2 = 100
⭐构造代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
class Person{ private String name;//实例成员变量 private int age; private String sex; public Person() { System.out.println("I am Person init()!"); } //实例代码块 { this.name = "bit"; this.age = 12; this.sex = "man"; System.out.println("I am instance init()!"); } public void show(){ System.out.println("name: "+name+" age: "+age+" sex: "+sex); } } public class Main { public static void main(String[] args) { Person p1 = new Person(); p1.show(); } } // 运行结果 I am instance init()! I am Person init()! name: bit age: 12 sex: man
注意事项:
实例代码块优先于构造函数执行。
⭐静态代码块
使用static定义的代码块。一般用于初始化静态成员属性。
class Person{ private String name;//实例成员变量 private int age; private String sex; private static int count = 0;//静态成员变量 由类共享数据 方法区 public Person(){ System.out.println("I am Person init()!"); } //实例代码块 { this.name = "bit"; this.age = 12; this.sex = "man"; System.out.println("I am instance init()!"); } //静态代码块 static { count = 10;//只能访问静态数据成员 System.out.println("I am static init()!"); } public void show(){ System.out.println("name: "+name+" age: "+age+" sex: "+sex); } } public class Main { public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person();//静态代码块是否还会被执行? } }
运行结果:静态代码块只运行了一次
注意事项:
静态代码块只能操作静态数据
静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的,即使不被实例化。
静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。
🗽类和对象内容总结
- 一个类可以产生无数的对象,类就是模板,对象就是具体的实例。
- 类中定义的属性,大概分为几类
- :类属性,对象属性。其中被static所修饰的数据属性称为类属性, static修饰的方法称为类方法,特点是不依赖于对象,我们只需要通过类名就可以调用其属性或者方法。
- 类变量也叫静态变量,也就是在变量前加了static 的变量;
实例变量也叫对象变量,即没加static 的变量;
区别在于:
类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;
- 而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;
- 静态代码块优先实例代码块执行,实例代码块优先构造函数执行。
- this关键字代表的是当前对象的引用。并不是当前对象。
- 静态数据可以直接通过类访问,也可以通过实例化的对象访问