目录
1、面向对象的初步认知
1.1 什么是面向对象
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
1.2面向对象和面向过程
面向过程:迄今为止,从C语言开始,我们所写的代码都是面向过程程序设计,他的重点是过程,就例如洗衣服,用手洗衣服,注重的是洗衣服的过程,如果你换一个比如洗鞋子,那么就会有不同的清洗方式,就是另一种代码形式,维护和调整起来就会特别麻烦。
面向对象:面向对象程序设计,重点是对象,就例如如何把大象放进冰箱?首先,打开冰箱门,其次把大象装进去,最后关闭冰箱门即可,但是我们并没有考虑大象能否放进冰箱,我们只关注里面所涉及的对象。
2、类的定义和使用
2.1什么是类,什么是对象
- 类:类是用来对一个实体(对象)来进行描述的,用通俗的语言来讲,他是一个描述,就比如:人类,我么就知道人类的一些基本特征,两个眼睛、一张嘴、一个鼻子、两张耳朵…他并不是一个真实存在的个体。
- 对象:对象很简单,他就是一个真实存在的个体。
2.2类的定义格式
在java中定义类时需要用到class关键字,具体语法如下
// 创建类
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}
class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法
class WashMachine{
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
}
注意事项
- 类名注意采用大驼峰定义
- 成员前写法统一为public,后面会详细解释
- 此处写的方法不带 static 关键字. 后面会详细解释
2.3定义一个学生类
public class Student{
public String name;
public String gender;
public short age;
public double score;
public void DoClass(){}
public void DoHomework(){}
public void Exam(){}
}
注意事项:
- 一般一个文件当中只定义一个类
- main方法所在的类一般要使用public修饰
- public修饰的类必须要和文件名相同
- 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改(如下图)
3.类的实例化
3.1什么是实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:WashMachine类和Student类。它们都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
class WashMachine{
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
public static void main(String[] args){
WashMachine washmachine = new WashMachine();// 实例化对象/产生一个对象
}
}
为什么通过关键字new就能产生一个对象呢?这个对象在底层又是怎么存储的呢?
我们每通过new关键字,都可以快速实例化一个对象,这个对象的地址就保存在对象名当中,就例如washmachine1和washmachine2当中,对象名存放在栈区,分别保存,真正new出来的成员变量是存放在堆区。
注意事项
- new 关键字用于创建一个对象的实例.
- 使用 . 来访问对象中的属性和方法.
- 同一个类可以创建对个实例.
3.2 类和对象的说明
- 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
- 类是一种自定义的类型,可以用来定义变量.
- 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
- 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
4.this的引用
4.1为什么要有this的引用
我们先看下面的一个代码
public class Date {
public int year;
public int month;
public int day;
public void setDay(int y, int m, int d){
year = y;
month = m;
day = d;
}
public void printDate(){
System.out.println(year + "/" + month + "/" + day);
}
public static void main(String[] args) {
// 构造三个日期类型的对象 d1 d2 d3
Date d1 = new Date();
Date d2 = new Date();
Date d3 = new Date();
// 对d1,d2,d3的日期设置
d1.setDay(2020,9,15);
d2.setDay(2020,9,16);
d3.setDay(2020,9,17);
// 打印日期中的内容
d1.printDate();
d2.printDate();
d3.printDate();
}
}
我们知道上面创建了多个对象,但是每一次的调用,Java是怎么知道这次调用的对象是谁呢?
并且,按照我们平时的编程习惯,setData里面的形参我们一般都会用对应的英文例如:(int year,int month,int day)而不是一些简陋的字母,十分影响可读性,但是当我们改成英文字母之后程序就会有异常,在Java语法里面对于形参都是优先使用的(就近原则),所以左边是形参,右边也是形参,这就无法给本对象的成员变量赋值,我们要让等号左边是成员变量才行,综上,为了解决以上问题,我么就推出了this关键字
this.成员变量:就能表示当前对象的成员变量,所以左边是当前对象的成员变量,右边是形参,就可以给本次对象的成员变量,赋值。如果你是data1来调用setData构造方法那么this就表示data1的地址,如果你是data2来调用setData构造方法,this就表示data2的地址。
其实没有用static修饰的成员方法都隐藏了一个this形参,你可以写也可以不写,这是编译器自己隐藏的,
4.2this引用的特性
- this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
- this只能在"成员方法"中使用
- 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
5对象的构造及初始化
5.1如何初始化对象
通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
public static void main(String[] args) {
int a;
System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a
但是,在类当中,成员变量没有初始化是不会报错的,Java是会帮你完成对应的初始化的
那么,我们怎么去手动给我们对象去进行初始化呢?
我们可以通过 对象名.成员变量 来进行初始化(前提是成员变量必须是public修饰,后面会讲解原因)
class WashMachine{
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
public static void main(String[] args){
WashMachine washmachine = new WashMachine();// 实例化对象/产生一个对象
washmachine.brand = "美的";//初始化成员变量
washmachine.color = "白色";//初始化成员变量
}
}
其次 我们也可以用构造方法来进行初始化
5.2构造方法
5.2.1概念
构造方法是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
我们来看下面的例子
class WashMachine{
public String brand; // 品牌
public String type; // 型号
public String color; // 颜色
public WashMachine(){
//无参构造方法
}
public WashMachine(String brand,String type,String color){
//有参构造方法
this.brand = brand;
this.type = type;
this.color = color;
}
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
public static void main(String[] args){
WashMachine washmachine = new WashMachine();// 实例化对象/产生一个对象
washmachine.brand = "美的";//初始化成员变量
washmachine.color = "白色";//初始化成员变量
}
}
5.2.2特性
- 名字必须与类名相同
- 没有返回值类型,设置为void也不行
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
- 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
构造方法分为:有参构造和无参构造,当我们去new WashMachine()的时候,其实就是调用了无参构造方法,但是我们之前,并没有写无参构造方法呀,为什么一样能行呢?这是因为Java帮我们写过了无参构造方法,只是隐藏了而已,如果你需要有参构造方法,那么你写上去之后,Java就会把他之前的无参构造方法移除,这个时候你的new WashMachine()就会报错!你就必须按照你自己写的有参构造方法去创建对象,例如:**new WashMachine(“美的”,“JPO841”,“白色”);**所以我们一般有参和无参都写上去。
构造方法中,可以通过this调用其他构造方法来简化代码
前面我们知道this关键字可以用来表示对象的地址(对象的身份),在构造方法里面,也可以用this来实现其他构造方法的调用
但是这个用法,this()必须写在方法的第一行,否则就会报错
到这里,类和对象的基本语法就讲完了,但是,类和对象远不止于此,我们知道,面向对象程序设计的三大特点:封装、继承、多态,我们都还没有涉及到,后面的文章也会逐步涉及,希望大家多多关注,批评指正!