目录
认识面向对象
类的定义和使用
类的定义
类的实例化
this引用
变量名与形参名相同起冲突
this引用的特点
构造方法
总结一下this
认识面向对象
面向对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象。Java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好
面向对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象。Java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好
或许看这个晦涩难懂的概念的确很抽象那我就举几个例子。
比如:洗衣服
在我们以前洗衣服的时候都要经过这10步,我们需要自己经过拿盆->放水->将衣服放进水里->放洗衣粉->手搓->换水->放洗衣粉->手搓->拧干->晾衣服。这10步都是我们洗衣服的过程,虽然我们能把衣服的污渍全部洗净,但是很消耗我们的时间并且特别的麻烦。
而我们现在洗衣服的方式
我们只需要将衣服放进洗衣机里,然后倒入充足的水,倒入洗衣粉,把衣服放进洗衣机,等待即可,我们从中可以发现,通过洗衣机洗衣服完全不需要我们自己动手自己做,只需要自己,衣服,洗衣粉,洗衣机这四个对象就可以完成某个任务。
通过上面两种方式我们可以得出结论,传统洗衣服的方式就是依靠自己取洗衣服,消耗时间成本过多,特别的麻烦,但是效率更高。
现代洗衣服的方式只经过几个对象各自完成自己相对应的任务即可。
再举一个例子:
比如我们学完变成之后一年年薪挣了很多很多钱,我们就可以给自己换一个mac电脑;
我自己去买:打开手机->打开淘宝/京东/网购软件->搜索mac电脑->查询价格->查询型号/内存/手机颜色->咨询服务人员->确认购买->付钱->下单->取快递->拿到mac进行工作。
让朋友帮买:给朋友打电话->跟朋友说我要买mac->朋友去买->到货之后给我。
上面的例子也是如果是我自己操作就会浪费很长的时间,但如果是让朋友帮买,只需要 我,朋友,mac电脑这几个对象就可以帮我买到电脑。这也就是面向对象编程。
面向对象与面向过程的本质的区别 更加细致的细节可以去看一下这篇博客。
类的定义和使用
既然是面向对象编程,那我们肯定要有对象(面向对象具体要实现这几步 定义对象,创建对象,适使用对象完成某些功能)。
第一步:怎么定义对象呢?这也就是我们第一个要讲的类。什么是类呢?
类的定义
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了
举一个例子:比如手机都会有这几个属性:颜色 ,型号 ,品牌 ,屏幕尺寸等等,手机的功能:打电话,发微信/信息,娱乐/购物/玩游戏等等功能。每个手机都会有这些属性和功能,出厂商也会根据这些属性来制造手机。所以这些由属性和方法组成的这些就像一个模板,我们就是根据这个模板来制造不同的手机(也就是对象) 在java中这个模板(这些属性和功能)就是类
那在java程序中怎么定义这个类呢?
类的定义格式
// 创建类
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}
1):class是java中的关键字用来定义一个类 。 2):Classname是类名这里要注意使用大驼峰(每个单词首字母要大写) 。 3):field是你定义的属性,也叫作成员变量。 4):method是对象能实现的功能也叫作成员方法。
我们来定义一个手机这个类:
class SmartPhone {
public String brand;//手机的品牌
public String model;//手机型号
public int measurement;//手机尺寸
public void telephone() {//打电话的功能
System.out.println("我要打电话!");
}
public void weChat() {//发微信的功能
System.out.println("我要发微信!");
}
}
我们来剖析一下:
再来举一个例子:定义一个学生类:
class Student {//定义一个学生类
//成员变量<--->属性 定义在方法的外面 类的里面
public String name;//姓名
public int id;//学号
public String sex;
public int height;//身高
public int weight;//体重
//成员方法----->学生能够实现的功能
public void eat() {//
System.out.println("我要吃饭!");
}
public void sleep() {
System.out.println("我要睡觉");
}
public void programming() {
System.out.println("我爱programming,我爱java!");
}
}
我来总结一下需要注意的点:
1):一个文件只能有一个public修饰的类,并且文件名要与类名是相同的,我们定义的类不能加public。
2):我们如果想要修改文件名可以 这样修改文件名同时类名也被自动修改。
3):成员变量一定是定义在类的里面,方法的外面。
4):定义的类名采取大驼峰。
5):类就相当于一个模板,也就是对象拥有的属性和功能。通过类可以创建多个对象。
类的实例化
前面说有类,类就像是一个模板,但是有了模板干什么用呢?那当然是创建对象了,通过这样的模板就可以创建很多的对象。就像是一张图纸就可以建设多个高楼大厦一样。
定义了一个类,就相当于在计算机中定义了一种新的类型(java中就是把c语言的结构体替换成类,java中的类不仅有c语言结构体的功能,而且还有结构体没有的功能,相当于更新),与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog类和Student类。它们都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
有了类我们怎么创建对象呢?
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
好我们接着上面手机的那个类来创建一个smartphone对象;
我们来画图理解一下(它在内存中是怎么存储的?)
我们有了这个对象就可以访问这个对象的属性和方法,也就是可以给这个对象初始化属性,实现这个对象有的功能。
刚才将了实例化对象我们来总结一下吧:
1):我们通过new关键字来创建一个对象(也叫作实例化对象),实例化对象的同时就会为对象在堆上开辟一块内存。我们通过对象的引用就可以访问到对象的属性和方法。
2):访问对象->对象的引用 . 成员变量/成员方法
3):如果不给属性/成员变量赋值的话,编译器就会自动初始化为对应的默认值。
this引用
我们来通过一个例子来讲解this引用
变量名与形参名相同起冲突
以下我定义了一个show方法用来为手机属性初始化。
大家可以注意到我的形参变量名:
如果我改成跟属性名一样呢?不是说形参名可以任意取么?
这里答案就会出现问题,为什么是默认的值呢?我不是调用show初始化了么?
原因是我们不知道到底是谁给谁赋值,这就会造成错误。
我们加上this后
再举一个例子:
多个对象传参调用show函数
出现上述情况根部就不知道先给谁传参这就会导致冲突。
就上述两种情况我们该如何解决这个问题呢?
就是使用我们的this引用就可以很好地解决这个问题。
为什么使用this就可以呢?this是干什么的呢?
this代表当前对象的引用,也就是通过地址传参。
java编译器给每个“成员方法“增加了一个隐藏的引用类型参数,该引用参数指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
一般建议是习惯使用this,加上总不会出错 -————> this.成员变量 -->记住this代表当前对象的引用。
this引用的特点
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象,具有final属性
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
构造方法
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象,具有final属性
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
对象是如何产生的?
对象的产生分为两步:1.为对象分配内存。2.调用合适的构造方法。
更深入的大致分为:
1.检测对象对应的类是否加载了,如果没有加载则加载
2.为对象分配内存空间
3.处理并发安全问题
比如: 多个线程同时申请对象,JVM要保证给对象分配的空间不冲突4. 初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值
我们这里先谈一谈现在我们知道的初始化有哪几种。
一种是在类里面就地初始化;例如:
但是这里有一个缺点,难道所有的手机都是华为 这些型号么?当然不是,所以,一般不这样初始化,只有在特定的场景才可以使用这样的初始化。
另一种是在我们创建完对象时在初始化;
但是这样的初始化如果创建多次修改就会很麻烦。
最后我们就要讲一下最好用的那就是构造方法;
在回顾一下,我们一个对象生成大致为两个过程,一是为对象分配内存,二是调用合适的构造方法。
那构造方法到底是干什么的呢?
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
构造方法其实就是在对象创建之前就已经初始化完成;也就相当于人刚出生父母就会起名字。
构造方法的要求:
1):构造方法没有返回类型,void也不行,它的名字要和类名相同。
2):一个类中至少要有一个构造方法,就算在程序中没有写构造方法,编译器会为我们自动生成一个不带有参数的构造方法(原因是一个对象生成有两步,一是为对象分配内存,而是调用合适的构造方法,所以类中肯定至少要有一个构造方法)。
3):自己写的构造方法可以不带参数可以带1,2,3多个参数。但是当你自己写构造方法的时候,编译器就不会生成构造方法,只会调用你写的构造方法。
在java程序中怎么创建一个构造方法呢?
不带有参数的构造方法
带有参数的构造方法
这里可以发现当我们写了带有参数的构造方法,它就不会调用编译器自动生成的构造方法
我们怎样在构造方法中调用构造方法呢?
答案是利用this
总结一下this
this.data——>访问成员变量
this.func()——>访问成员方法
this()——>访问本类中其他构造方法
当然在使用this在构造方法中调用另外一个构造方法的时候,只能够调用一次并且要放在第一行;
比如举个反例
this调用构造方法时只能在这个构造方法调用一次
this调用构造方法时候只能在这个构造方法的第一行调用
并且this在调用构造方法的时候不能形成环



