前言
在前面博客中,我们从面向过程和面向对象的编程思想谈起,阐述了类和对象在Java中的编程中的应用,此外,对于对象的内存,变量作用域,参数传递等进行了阐述。
Java进阶 之 再论面向对象(1)——面向对象的编程思想 & Java中的类和对象 & 深入认识对象,内存图解+变量作用域+参数传递
然后,介绍类的定义和对象的使用方法,并分析对象的内存图,此外阐述了Java三大特性(Encapsulation 封装,inheritance 继承,polymorphism多态)之一的封装,封装究竟是什么,并引出了两个关键字,this关键字和private关键字。
Java进阶 之 再论面向对象(2)——类的定义及对象的使用 & 封装Encapsulation & 关键字private,this
本篇博客围绕对象的初始化方法,构造方法进行阐述,分析构造方法调用和内存以及实现细节,介绍了JavaBean的概念,描述了this关键字在构造函数中的使用。
其他相关的Java进阶相关的博客文章合集如下:
【合集】Java进阶——Java深入学习的笔记汇总 & JVM底层、多线程、类加载 …
引出
1.围绕对象的初始化方法,构造方法进行阐述;
2.分析构造方法调用和内存以及实现细节;
3.介绍JavaBean的相关内容;
4.描述this关键字在构造函数中的使用;
构造方法
问题引入
我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法。
但是我们当创建人对象的时候,人对象一创建就要明确其姓名和年龄,那该怎么做呢?
构造方法概述
在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名、年龄等属性信息。
那么,创建对象就要明确属性值,那怎么解决呢?也就是在创建对象的时候就要做的事情,当使用new关键字创建对象时,怎么给对象的属性初始化值呢?这就要学习Java另外一门小技术,构造方法。
那什么是构造方法呢?从字面上理解即为构建创造对象时用的方法,即就是对象创建时要执行的方法。既然是对象创建时要执行的方法,那么只要在new对象时,知道其执行的构造方法是什么,就可以在执行这个方法的时候给对象进行属性赋值。
构造方法的使用
语法格式
修饰符 构造方法名(参数列表){
// 方法体
}
- 1
- 2
- 3
特点
- 构造方法没有返回值类型。也不需要写返回值。因为它是为构建对象的,对象创建完,方法就执行结束。
- 构造方法名称必须和类名保持一致。
- 构造方法没有具体的返回值,甚至不需要void。
示例
class Person {
// Person的成员属性age和name
private int age;
private String name;
// Person的构造方法,拥有参数列表
Person(int age, String name) {
// 接受到创建对象时传递进来的值,将值赋给成员属性
this.age = age;
this.name = name;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
构造函数的作用
构造方法是一种特殊的方法,主要是创建对象,并且完成对象数据的初始化。
其他说明
- 如果没有显示的定义类的构造方法的话,则系统默认提供一个空参的构造方法。
- 一个类中定义的多个构造器,彼此构成重载,既可以定义参数,也可以不定义参数。
- 一旦显示的定义了类的构造器之后,系统不再提供默认的空参构造器。
- 一个类中,至少会有一个构造器。
- 如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法。
- 无论是否使用,都手工书写无参数构造方法,这个是推荐的做法。
案例
// 学生类
class Student {
private String name;
private int age;
public Student() {
}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name + "," + age);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
// 测试类
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s1 = new Student();
s1.show();
//public Student(String name)
Student s2 = new Student("林青霞");
s2.show();
//public Student(int age)
Student s3 = new Student(30);
s3.show();
//public Student(String name,int age)
Student s4 = new Student("林青霞",30);
s4.show();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
构造方法调用和内存图解
代码
class Person {
// Person的成员属性age和name
private int age;
private String name;
// Person的构造方法,拥有参数列表
Person(int a, String nm) {
// 接受到创建对象时传递进来的值,将值赋给成员属性
age = a;
name = nm;
}
public void speak() {
System.out.println("name=" + name + ",age=" + age);
}
}
class PersonDemo {
public static void main(String[] args) {
// 创建Person对象,并明确对象的年龄和姓名
Person p2 = new Person(23, "张三");
p2.speak();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
即在创建对象时,会调用与参数列表对应的构造方法。
图示
解释
- 首先会将main方法压入栈中,执行main方法中的 new Person(23,”张三”);
- 在堆内存中分配一片区域,用来存放创建的Person对象,这片内存区域会有属于自己的内存地址(0x88)。然后给成员变量进行默认初始化(name=null,age=0)。
- 执行构造方法中的代码(age = a ; name = nm;),将变量a对应的23赋值给age,将变量nm对应的”张三赋值给name,这段代码执行结束后,成员变量age和name的值已经改变。执行结束之后构造方法弹栈,Person对象创建完成。将Person对象的内存地址0x88赋值给p2 。
默认构造方法和细节
问题引入
在没有学习构造方法之前,我们也可以通过new关键字创建对象,并调用相应的方法,同时在描述事物时也没有写构造方法。这是为什么呢?
在之前学习的过程中,描述事物时,并没有显示指定构造方法,当在编译Java文件时,编译器会自动给class文件中添加默认的构造方法。如果在描述类时,我们显示指定了构造方法,那么,当在编译Java源文件时,编译器就不会再给class文件中添加默认构造方法。
class Person {
//如果没有显示指定构造方法,编译会在编译时自动添加默认的构造方法
//Person(){} //空参数的默认构造方法
}
- 1
- 2
- 3
- 4
说明
当在描述事物时,要不要在类中写构造方法呢?这时要根据描述事物的特点来确定,当描述的事物在创建其对象时就要明确属性的值,这时就需要在定义类的时候书写带参数的构造方法。若创建对象时不需要明确具体的数据,这时可以不用书写构造方法(不书写也有默认的构造方法)。
- 构造方法的细节:
- 一个类中可以有多个构造方法,多个构造方法是以重载的形式存在的
- 构造方法是可以被private修饰的,作用:其他程序无法创建该类的对象
示例
class Person {
private int age;
private String name;
// 私有无参数的构造方法,即外界不能通过new Person();语句创建本类对象
private Person() {
}
// 多个构造方法是以重载的形式存在
Person(int a) {
age = a;
}
Person(String nm, int a) {
name = nm;
age = a;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
构造方法和一般方法区别
到目前为止,学习两种方法,分别为构造方法和一般方法,那么他们之间有什么异同呢?
- 构造方法在对象创建时就执行了,而且只执行一次。
- 一般方法是在对象创建后,需要使用时才被对象调用,并可以被多次调用。
问题:
有了构造方法之后可以对对象的属性进行初始化,那么还需要对应的set和get方法吗?
答案:需要相应的set和get方法,因为对象在创建之后需要修改和访问相应的属性值时,在这时只能通过set或者get方法来操作。
JavaBean
说明
JavaBean 是 Java语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的 set 和 get 方法。
总结
所谓 javaBean,是指符合如下标准的 Java 类:
- 类是公共的
- 有一个无参的公共的构造方法
- 有属性,是私有的,且有对应的 get、set 方法
案例
实体类
public class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() {
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//成员方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
publicint getAge() {
return age;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
public class TestStudent {
public static void main(String[] args) {
//无参构造使用
Student s= new Student();
s.setName("柳岩");
s.setAge(18);
System.out.println(s.getName()+"‐‐‐"+s.getAge());
//带参构造使用
Student s2= new Student("赵丽颖",18);
System.out.println(s2.getName()+"‐‐‐"+s2.getAge());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
构造函数中的this使用
说明
在之前学习方法时,我们知道方法之间是可以相互调用的,那么构造方法之间能不能相互调用呢?若可以,怎么调用呢?
在之前学习方法之间调用时,可以通过方法名进行调用。可是针对构造方法,是无法通过构造方法名来相互调用。
this调用构造方法
解决
构造方法之间的调用,可以通过this关键字来完成。
格式
this(参数列表);
构造方法的调用
class Person {
// Person的成员属性
private int age;
private String name;
// 无参数的构造方法
Person() {
}
// 给姓名初始化的构造方法
Person(String name) {
this.name = name;
}
// 给姓名和年龄初始化的构造方法
Person(String name, int age) {
// 由于已经存在给姓名进行初始化的构造方法 this.name = name;因此只需要调用即可
// 调用其他构造方法,需要通过this关键字来调用
this(name);
// 给年龄初始化
this.age = age;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
this的原理图解
了解了构造方法之间是可以相互调用,那为什么他们之间通过this就可以调用呢?
通过上面的学习,简单知道使用this可以实现构造方法之间的调用,但是为什么就会知道this调用哪一个构造方法呢?接下来需要图解完成。
class Person {
private int age;
private String name;
Person() {
}
Person(String nm) {
name = nm;
}
Person(String nm, int a) {
this(nm);
age = a;
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("张三", 23);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
解释说明:
1、先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);
2、堆内存中开辟空间,并为其分配内存地址0x33,紧接着成员变量默认初始化(name=null age = 0);
3、拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中有一个隐式的this,因为构造方法是给对象初始化的,那么哪个对象调用到这个构造方法,this就指向堆中的哪个对象。
4、由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为0x33,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)构造方法弹栈。
5、程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造方法(Person(String nm , int a)弹栈。
6、当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值给main方法中的p引用变量。
this到底代表什么呢?this代表的是对象,具体代表哪个对象呢?哪个对象调用了this所在的方法,this就代表哪个对象。
调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行。
成员变量和局部变量同名问题
通过上面学习,基本明确了对象初始化过程中的细节,也知道了构造方法之间的调用是通过this关键字完成的。但this也有另外一个用途,接下来我们就学习下。
当在方法中出现了局部变量和成员变量同名的时候,那么在方法中怎么区别局部变量成员变量呢?
可以在成员变量名前面加上this.来区别成员变量和局部变量
class Person {
private int age;
private String name;
// 给姓名和年龄初始化的构造方法
Person(String name, int age) {
// 当需要访问成员变量是,只需要在成员变量前面加上this.即可
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("张三", 23);
p.speak();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
案例
需求:在Person类中定义功能,判断两个人是否是同龄人。
class Person {
private int age;
private String name;
// 给姓名和年龄初始化的构造方法
Person(String name, int age) {
// 当需要访问成员变量是,只需要在成员变量前面加上this.即可
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
// 判断是否为同龄人
public boolean equalsAge(Person p) {
// 使用当前调用该equalsAge方法对象的age和传递进来p的age进行比较
// 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替
return this.age == p.age;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
小结
- ① 我们可以在类的构造方法中,显式的使用”this(形参列表)”的方式,调用本类中重载的其他的构造方法!
- ② 构造方法中不能通过”this(形参列表)”的方式调用自己。
- ③ 如果一个类中声明了n个构造方法,则最多有n -1个构造方法中使用了”this(形参列表)”。
- ④ “this(形参列表)”必须声明在类的构造器的首行!
- ⑤ 在类的一个构造器中,最多只能声明一个”this(形参列表)”。
总结
1.围绕对象的初始化方法,构造方法进行阐述;
2.分析构造方法调用和内存以及实现细节;
3.介绍JavaBean的相关内容;
4.描述this关键字在构造函数中的使用;
目录
1.概述
人工智能(AI)技术在过去几十年中经历了显著的发展和演变,成为推动现代社会变革的关键力量之一。随着计算能力的提升、数据获取的便利以及算法的不断优化,AI技术的应用范围和复杂程度不断扩大。在这篇分析中,我们将探讨AI技术的当前趋势、未来发展方向以及其在各个领域的潜在影响。
2.当前趋势
2.1. 深度学习的持续进化
深度学习,尤其是神经网络技术,仍然是AI研究的核心。近年来,Transformer架构的出现(如GPT和BERT等模型)极大地提升了自然语言处理(NLP)的能力。这些模型不仅在语言生成和理解上表现出色,还被应用于图像处理、语音识别等领域。
2.2. 大模型与多模态AI
大规模预训练模型的兴起,例如OpenAI的GPT-4和Google的PaLM,展示了AI在处理复杂任务上的潜力。多模态AI的发展使得模型能够同时处理文本、图像、音频等不同类型的数据,实现更为自然和智能的人机交互。
2.3. AI的可解释性与透明性
随着AI系统在决策中扮演越来越重要的角色,可解释性和透明性成为研究热点。用户和开发者需要理解AI模型的决策过程,以确保其公平性和可靠性。这推动了XAI(可解释AI)技术的发展,致力于揭示AI决策的内在机制。
2.4. 边缘AI与物联网(IoT)的融合
随着物联网设备的普及,边缘AI技术逐渐受到重视。通过在设备本地处理数据,边缘AI可以降低延迟、节省带宽,并提高数据隐私性。这一趋势在智能家居、自动驾驶和工业自动化等领域尤其明显。
2.5. 强化学习与自主系统
强化学习在机器人控制、游戏AI等领域显示出强大的能力。自适应、自主学习的AI系统正在逐步实现,这些系统能够在动态环境中进行实时决策和优化。
3.跨领域技术融合与创新实践
3.1. AI与物联网(IoT)
- 智能家居与城市:AI与IoT的结合使得智能家居和智能城市成为现实。通过传感器网络和数据分析,城市管理者可以优化资源分配,提高公共服务效率。
- 工业4.0:在制造业,AI与IoT结合实现了智能制造,设备之间的互联互通和数据驱动的决策极大地提升了生产效率。
3.2. AI与大数据
- 精准医疗:AI和大数据的结合在医疗领域实现了精准医疗,通过分析大量的患者数据,AI能够提供个性化的治疗方案和疾病预测。
- 市场分析与预测:在商业领域,AI利用大数据进行消费者行为分析和市场趋势预测,帮助企业制定更有效的策略。
3.3. AI与区块链
- 数据安全与隐私:区块链技术提供了安全的数据存储和交易方式,结合AI可以提高数据处理的透明性和安全性,特别是在金融和供应链管理中。
- 智能合约:AI可以增强区块链智能合约的功能,通过自动化和智能决策实现更复杂的应用场景。
3.4. AI与机器人技术
- 自动化与无人系统:AI赋能机器人,使其在无人驾驶、无人机配送等领域取得突破性进展。这些技术改变了交通运输和物流行业的格局。
- 服务机器人:在服务行业,AI驱动的机器人能够提供个性化的客户服务,提高用户体验。
3.5. AI与生物技术
- 基因编辑与合成生物学:AI加速了基因编辑技术的发展,通过大数据分析和预测模型,科学家能够更精准地进行基因操作。
- 药物研发:AI在药物研发中用于筛选化合物和模拟药物反应,大幅缩短了新药上市的时间。
4.对社会与人文的影响
4.1. 就业与劳动市场
- 工作自动化:AI技术的广泛应用可能导致某些行业的工作自动化,传统职业受到冲击。同时也创造了新的就业机会,特别是在AI开发、维护和管理等领域。
- 技能转型:随着AI技术的普及,劳动力市场对技能的需求发生变化,需要大规模的职业培训和教育来帮助工人适应新的技术环境。
4.2. 伦理与隐私
- 数据隐私:AI技术依赖于大量的数据,引发了关于数据隐私和安全的伦理问题。如何在技术进步与个人隐私之间取得平衡成为社会关注的焦点。
- 决策透明性:AI在决策过程中可能存在偏见和不透明性,如何确保AI系统的公平性和透明性是一个重要的伦理挑战。
4.3. 社会公平与包容
- 数字鸿沟:AI技术的应用可能加剧社会的数字鸿沟,技术资源的分配不均可能导致社会不平等。有必要采取措施确保技术的普惠性。
- 文化影响:AI在内容生成和传播中的作用可能影响文化的多样性和包容性,需谨慎管理以避免文化同质化。
4.4. 教育与人类发展
- 个性化教育:AI技术使得个性化教育成为可能,学生可以根据自己的学习风格和进度接受教育,提高学习效果。
- 终身学习:AI推动了终身学习的理念,通过在线平台和智能辅导系统,人们可以随时随地获取新知识,提升个人能力。
4.5. 社会治理与公共政策
- 智能治理:AI在公共管理中的应用提升了政府的治理能力,通过数据分析和智能决策,公共服务更加高效和精准。
- 政策制定:AI帮助政府预测社会趋势和评估政策影响,支持科学决策和长远规划。
5.未来发展方向
5.1. 通用人工智能(AGI)的探索
尽管当前的AI系统在特定任务上表现优异,但距离实现具有全面认知能力的通用人工智能(AGI)仍有很长的路要走。未来的研究将继续探索如何使AI具备更广泛的理解和推理能力。
5.2. 人机协作的深化
AI将更加注重与人类的协作,成为人类能力的扩展而非替代。这包括在医疗、教育和创意产业中,AI作为辅助工具帮助人类完成复杂任务,提升效率和创新能力。
5.3. AI伦理与治理
随着AI在社会各个方面的影响力增加,伦理和治理问题变得尤为重要。如何确保AI技术的开发和应用符合人类的价值观,并防止其被滥用,将是未来的重要课题。
5.4. 绿色AI与可持续发展
AI模型的训练和运行需要大量的计算资源,对环境的影响不容忽视。绿色AI倡导通过优化算法、提升硬件效率和采用可再生能源,减少AI技术对环境的负面影响。
5.5. 个性化与定制化AI
未来的AI将更加注重个性化服务,能够根据用户的需求和偏好进行调整和优化。在智能助手、推荐系统和教育科技中表现尤为突出。
6.总结
人工智能跨领域技术的融合与创新实践正在深刻改变我们的世界。不仅在经济和技术层面带来变革,也对社会结构、文化习惯和人类价值观产生了重要影响。在拥抱技术进步的同时,社会各界需要共同努力,确保AI的发展符合人类的伦理标准和社会价值,推动技术为人类福祉服务。
人工智能技术正处于快速发展的阶段,影响着社会的各个层面。尽管面临诸多挑战和不确定性,AI的潜力无疑是巨大的。未来,随着技术的不断进步和应用的深入,AI将进一步改变我们的生活方式和工作模式。为了实现这一愿景,学术界、产业界和政府需要携手合作,共同推动AI技术的健康发展。
评论记录:
回复评论: