JAVA学习_07 面向对象的思想、类和对象、类的定义和对象的创建、成员变量和局部变量

1、面向对象。(其实就是JDK中已经有被封装好的类,我们可以直接调用相应功能的方法)

面向过程:当需要实现一个功能时,每一个具体的步骤都需要亲历亲为,详细处理每个细节。

面向对象:当需要实现一个功能时,不关心具体的实现步骤,而是找一个具有该功能的人,来帮我完成。

特点:封装(将一些细节信息隐藏起来,对外界不可用)、继承和多态

封装性的体现:(1)方法就是一种封装。(2)private也是一种封装。

2、类和对象。

类:是一组属性和行为的集合,可以看成是一类事物的模板,使用事物的属性特征和行为来描述该类事物。(属性:该事物的状态信息;行为:该事物能做什么)

对象:一类事物的具体体现。对象是类的一个实例,是具体的。

关系:(1)类是对一类事物的描述,是抽象的。(2)对象是一类事物的实例,是具体的。(3)类是对象的模板,对象是类的实体。(例如:手机图纸和真实手机)

3、类的定义。

类的定义格式:

public class ClassName{

//成员变量:对应事物的属性,和定义变量基本相同,只不过位置发生变化,在类中,方法外。

//成员方法:对应事物的行为,去掉了static。

}

4、创建对象。(通常情况,一个类是不能被直接使用的,需要根据类创建一个对象,才能使用)

步骤:

(1)导包。也就是指出需要使用的类,在什么位置。

(2)创建,格式:类名称 对象名 = new 类名称();

(3)使用,分为两种情况:

         使用成员变量:对象名.成员变量名;

         使用成员方法:对象名.成员方法名(参数);

下图是定义类并创建对象的过程:

       

定义类,创建一个对象,对应的内存图:

(1)main方法入栈(压栈),声明Phone one,然后new了一个新的对象,所以在堆中分配内存给新对象(地址:0x666.),成员变量从方法区获得,并赋默认值,成员方法就直接赋予方法区中的地址值(地址:0x333)

(2)当调用成员变量赋值时,通过地址找到堆中的对应成员变量,并直接修改。

(3)当调用成员方法时,先从栈->堆->方法区->让call方法入栈->调用方法->call方法出栈(sendMessage方法相同)

定义类,创建两个不同的对象,对应的内存图:(与上面不同的是,堆中会有两个不同地址的对象被创建,其实就是每个对象引用指向了一个,与下面形成对比)

定义类,创建两个对象引用指向同一个对象空间,对应的内存图:(第二个对象引用是一个对象直接赋值的,所以指向的都是同一个对象,也就是在栈中存放的对象地址是相同的)

使用对象类型作为方法的:左边是代码实现,右边是内存分配。首先method方法是和main方法一同定义在Demo04PhoneParam类中的。而Phone class是已经在其他java文件中定义好的类。(当一个对象作为参数,传递到方法中时,实际上传递的就是对象的地址值

使用对象类型作为方法的返回值:跟传参一样,其实就是getPhone中的one获取了传参来的对象的地址值,然后就可以找到对应的对象,然后返回时依然把对象所在地址值返回。使main方法中的two也得到了对象的地址值(0x666)。

注意事项:

(1)如果成员变量没有赋值,那么将会有一个默认值,规则和数组是一样的。

5.成员变量和局部变量的不同。

局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。

成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。

类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

(1)定义的位置不一样。(局部变量:在方法内部;成员变量:在方法外部,在类中)

(2)作用范围。(局部变量:只有方法中可以使用,出了方法就不能用了;成员变量:整个类都可以通用)

(3)默认值不一样。(局部变量:没有默认值,需要手动赋值;成员变量:有默认值,规则和数组一样)

(4)内存的位置不一样。(局部变量:位于栈内存;成员变量:位于堆内存)

(5)生命周期不一样。(局部变量:随着方法入栈而诞生,随着方法出栈而消失;成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失。)

6.private的用法

一旦使用private进行修饰,那么本类当中仍然可以随意访问,但是,超出本类之后就不能直接访问。

不能直接访问,但是还有间接访问的方法。首先在private修饰的自定义类中,定义setter/getter方法(如下)。然后用声明好的 类名.setter/getter来设置(获取)变量。(命名规则必须是:setXxxx / getXxxx)

注意:

对于 getXxxx,不能有参数,返回值类型和成员变量对应。

对于 setXxxx,不能有返回值,参数类型和成员变量对应。

对于基本数据类型的boolean值,Getter方法一定要写成isXxxx的形式,setter形式不变。

7.this关键字(解决重名,适用类的成员变量)

应用场景:当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。

如果要使用本类中的成员变量,需要使用格式: this.成员变量名

注意:“通过谁调用的方法,谁就是this”   (在main方法中声明People类的引用 people,然后调用了People类中的某方法,其实就是people在调用方法,那这里的this其实就是people)

8.构造方法(创建对象,当我们new一个对象时,其实就是在调用构造方法)

格式:

public 类名称(参数类型 参数名称){

方法体

}

注意:

(1)构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样。

(2)构造方法不要写返回值类型,连void也不写。

(3)构造方法是不能return一个返回值的。0

(4)如果没有编写任何构造方法,编译器会赠送一个没有参数,方法体什么事都不做的构造方法。

(5)一旦编写至少一个构造方法,那么编译器就不会赠送了。

(6)构造方法也是可以重载的。会根据不同的参数列表选择对应的构造方法,

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值