目录
一:什么是面向对象
1.面向对象
面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
面向对象的编程的主要思想是把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在解决问题的过程中经历的步骤和行为。对象作为程序的基本单位,将程序和数据封装其中,以提高程序的重用性,灵活性和可扩展性。类是创建对象的模板,一个类可以创建多个对象。对象是类的实例化。
2.面向过程
举个例子:洗衣服
传统洗衣服的方式:拿个盆子----放水----放衣服----放洗衣粉或洗衣液----揉搓----换水----加水----揉搓----拧干----晾衣服(将洗衣服这件事分成好多个步骤,有次序的完成)
将这些动作封装成函数直接调用
面向对象:
1.对场景进行分析---抽离出对象
2.再让对象去进行交互
再回到洗衣服这件事上
新式洗衣服的方法:
能涉及到的对象:衣服,人,洗衣机,洗衣液(由这几个对象交互完成目的)
以面向对象方式进行处理,人可以不关心洗衣服的过程,只需要将衣服放进洗衣机里,与传统的方法不同,传统的人参与了整个过程。
面向对象和面向过程并不是编程语言,而是一种解决问题的方法论-----一种思想
3.面向对象之封装:类和对象
举个例子:
谜语:年纪不大 胡子一把 客人来了 就喊妈妈(打一物)
谜底:羊
这里的谜语就像类,谜底就像对象,谜语就是在对谜底进行描述。通俗的说:类就是用来描述的,而对象就是实际存在的
二:简单认识类
1.认识类
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能,描述完成后计算机就可识别了。
2.类的定义格式
在java中定义类时需要用到class关键字
//创建类
class ClassName{
field; //字段(属性)或者成员变量
method; //行为或者成员方法
}
class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
//洗衣机类
public class WashMachine{
//成员变量(字段)
//字段:修饰符 类型 字段名;
public double length;
public double height;
public double weight;
public String color;
public String brand;
public String type;
//功能(成员方法)
public void washClothes(){
System.out.println("洗衣服功能");
}
public void dryClothes(){
System.out.println("烘干功能");
}
}
采用java语言将洗衣机类在计算机中定义完成,经过javac的编译之后形成.class文件,在JVM的基础上计算机就可以识别了。
注意事项:
1. 类名注意采用大驼峰
2. 成员前写法统一为public(后面解释)
3.此处写的方法不带static关键字(后面解释)
3.类的实例化
用类类型创建对象的过程,称为类的实例化。在java中采用new关键字,配合类名来实例化对象。
注意:
1.类之中方法不能直接调用,必须要通过对象来进行调用
例: 狗.eat() 猫.eat()
2.new关键字用于创建一个对象的实例
3.使用 . 来访问对象中的属性与方法
4.同一个类可以实例多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
4.说明
1.类:是一种自定义类型,用来定义变量。类型是描述某种类别(群体)的属性+行为。
类没有实际的空间
2.对象:用类类型new出来的变量就将其称为对象,对象就是对类实际的一个体现,是实实在在存在的,可以使用类创建相同类型的好多个对象
三:this引用
public class Date{
public int year;
public int month;
public int day;
public void setDate(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){
Date d1 = new Date;
d1.setDate(2021,9,20);
d1.printDate;
}
}
1.为什么需要有this引用
通过对this的引用来区分在一些成员方法中到底操作的是哪个对象
public class Date{
public int year;
public int month;
public int day;
public void setDate(int y,int m, int d){
year = y;
month = m;
day = d;
}
public void setYear(int year){
year = year;
}
}
由上代码发现,一不小心函数的形参与成员变量的名字重名,有以下四种可能性
1.形参给成员变量赋值
2.形参给形参赋值
3.成员变量给成员变量赋值
4.成员变量给形参赋值
到底是哪一个也说不清了。
2.什么是this引用
java编译器给每个“成员方法”增加了一个隐藏的引用类型参数,该引用参数指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
public class Date{
public int year;
public int month;
public int day;
//在成员方法中,有一个隐藏的this引用,this引用的是当前对象----调用这个方法的对象
public void setDate(int y,int m, int d){
this.year = y;
this.month = m;
this.day = d;
}
3.this引用的特性
1.this的类型:对应类类型引用(学生类,日期类......),即哪个对象调用就是哪个对象的引用类型。
2.this只能在“成员方法”(非静态成员方法)中使用。
3.在“成员方法”中,this只能引用当前对象(调用当前方法的对象),不能再引用其他对象,具有final属性。
4.this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给成员方法,this负责接收。
5.this可以为空吗?
Date d4 = null;
d4.printDate;
结果为空指针异常,所以在java中this引用一定不能为空。必须要给一个有效的对象,方法才能执行起来。
四:对象的初始化
1:构造方法
1.1:构造方法/构造器的概念
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
1.2:特性
1.2.1:名字必须与类名相同。
1.2.2:没有返回值类型,即使设置成void也不行。
虽然代码可以通过编译,但是编译器不认为它是构造方法,因为在创建对象时该方法没有执行。
1.2.3:调用的时机:只有在创建对象时由编译器自动调用,而且在整个对象的生命周期内只调用一次。
1.2.4:构造方法可以重载(方法名相同,参数列表不同)。
1.2.5:如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的构造方法一定是无参的(参数列表当中没有参数,实际上有一个隐藏的this)。一旦用户显示定义了,则编译器不会再生成无参的构造方法了。
1.2.6:经过javac编译之后,构造函数的名字会被修改为<init>。
1.2.7: 构造方法中,可以通过this调用其他构造方法来简化代码。
注意:不要调用成环了
1.2.8: 绝大多数情况下使用public来修饰,特殊场景下会被private修饰。
注意:构造方法只负责初始化对象,不负责给对象开辟空间
2:默认初始化
在方法体中局部变量在使用时必须要初始化,而成员变量可以不用。
初始化所分配的空间:
对象空间被申请好之后,对象中包含的成员已经设置好了初始值
数据类型 | 默认值 |
byte | 0 |
char | '\u0000' |
short | 0 |
int | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
reference | null |
3:就地初始化
定义成员变量期间,可以把值直接给出来。
构造方法在执行时:先执行就地初始化的代码,再执行构造方法中的语句。