【Java】终于可以给自己new对象了——Java类和对象(三)

简介: 【☕Java】,千呼万唤始出来,终于可以给自己new对象了——Java类和对象

⭐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.每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)

1688a63610984ffa82a8707a1ebe1e30.png


注意事项

  • 如果类中没有提供任何的构造函数,那么编译器会 默认 生成一个不带有参数的构造函数
  • 若类中定义了构造方法,则默认的无参构造将不再生成.
  • 构造方法支持重载. 规则和普通方法的重载一致.

代码示例

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关键字

dd326ed979a34f6baaab725f560e73d6.png

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();//静态代码块是否还会被执行?
} 
} 

运行结果:静态代码块只运行了一次

278a8c44de7c450e97f3e87a92236e1e.png

注意事项:

静态代码块只能操作静态数据
静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的,即使不被实例化。
静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。

🗽类和对象内容总结

  • 一个类可以产生无数的对象,类就是模板,对象就是具体的实例。
  • 类中定义的属性,大概分为几类
  • :类属性,对象属性。其中被static所修饰的数据属性称为类属性, static修饰的方法称为类方法,特点是不依赖于对象,我们只需要通过类名就可以调用其属性或者方法。
  • 类变量也叫静态变量,也就是在变量前加了static 的变量;
    实例变量也叫对象变量,即没加static 的变量;
    区别在于:

类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;

  • 而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;
  • 静态代码块优先实例代码块执行,实例代码块优先构造函数执行。
  • this关键字代表的是当前对象的引用。并不是当前对象。
  • 静态数据可以直接通过类访问,也可以通过实例化的对象访问


相关文章
|
16小时前
|
SQL Java 数据库连接
15:MyBatis对象关系与映射结构-Java Spring
15:MyBatis对象关系与映射结构-Java Spring
12 4
|
17小时前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
7 1
|
2天前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别
|
2天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
9 1
|
3天前
|
Java 编译器
【Java探索之旅】解密构造方法 对象初始化的关键一步
【Java探索之旅】解密构造方法 对象初始化的关键一步
8 1
|
3天前
|
Java
Java对象和类研究
Java对象和类研究
7 0
|
3天前
|
XML Java 测试技术
Java异常处理神器:Guava Throwables类概念与实战
【4月更文挑战第29天】在Java开发中,异常处理是保证程序稳定性和可靠性的关键。Google的Guava库提供了一个强大的工具类Throwables,用于简化和增强异常处理。本篇博客将探讨Throwables类的核心功能及其在实战中的应用。
12 2
|
3天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
4天前
|
存储 安全 Java
聊聊Java中的常用类String
聊聊Java中的常用类String
9 0
|
4天前
|
机器学习/深度学习 人工智能 算法
java对象的比较
java对象的比较
15 0
java对象的比较