【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关键字代表的是当前对象的引用。并不是当前对象。
  • 静态数据可以直接通过类访问,也可以通过实例化的对象访问


相关文章
|
21天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
18天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
41 17
|
9天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
14天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
54 4
|
24天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
44 17
|
14天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
32 2
|
19天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
23天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
23天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
24天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。