7.面向对象
MODULE 7 面向对象
1.知道为啥使用面向对象思想编程
2.知道怎么使用面向对象思想编程
3.知道什么时候使用面向对象思想编程
4.会利用代码去描述世间万物的分类
5.会在一个类中访问另一个类中的成员 -> new对象
6.成员变量和局部变量的区别
一、类和对象
(一)面向对象的介绍
1.面向过程:自己的事情自己干,代表语言c语言
2.面向过程:自己的事情别人去干,代表语言java语言
3.为啥要使用面向对象思想:懒
很多功能别人都给我们实现好了,我们只需要直接拿过来使用即可,简化了我 们自己的编写过程,减少了我们的代码量
4.什么时候使用面向对象思想编程:
调用别人的功能时
在一个类中想使用别的类中的成员时,就使用面向对象思想编程
至于我们使用的功能怎么去实现的,我们不关心,我们只要知道怎么使用即可
5.怎么使用面向对象思想编程:
(1)new一个 -> 点代表调用
(2)特殊:如果调用的成员带static关键字,我们不需要new,我们直接类 名点即可
(二)类和对象
1.类(实体类)class
(1)测试类:待main方法的类,主要是运行代码的
(2)实体类:是一类事物的抽象表现形式
组成部分:
A.属性(成员变量):这一类事物有啥
(a)定义位置:类中方法外
(b)作用范围:作用于当前位置
(c)定义格式:数据类型 变量名
(d)默认值:
整数:0
小数:0.0
字符:’\u0000’
布尔:false
引用:null
B.行为(成员方法):这一类事物都能干啥
将module6中方法的static去掉,其他都一样
2.对象
(1)概述:一类事物的具体表现
(2)使用:
A.导包:import 包名.类名
如果两个类在同一个包下,想要使用对方的成员不需要导包
不在同一个包下,需要导包
特殊包:java.lang -> 使用lang包下的类不需要导包 -> String
友提:在学习四种权限修饰符之前,尽量让两个类在同一个包 下
B.创建对象:想要使用哪个类中的成员,就new哪个类的对象
类名 对象名 = new 类名() -> 比如Person p = new Person()
C.调用成员(成员变量,成员方法) -> 想要使用哪个类中的成 员,就用哪个类的对象去点那个成员
对象名.成员变量名 = 值
对象名.方法名() -> 调用的是无参无返回值方法
对象名.方法名(实参) -> 调用的是有参无返回值方法
数据类型 变量名 = 对象名.方法名() -> 调用的是无参有 返回值方法
数据类型 变量名 = 对象名.方法名(实参) -> 调用的是有 参有返回值方法
(三)匿名对象的使用
1.int i = 10
(1)int:是数据类型
(2)i:变量名
(3)等号右边的10:真正的数据
2.Person p = new Person()
(1)等号左边的Person:对象的类型,好比是int
(2)p:对象名
(3)等号右边的new Person():真正的数据,是一个Person对象,将这个 对象真正创建出来了
3.所谓的匿名对象:其实就是没有等号左边的部分,只有等号右边的部分(对象)
4.使用:
new 对象().成员
5.注意:
(1)如果我们只想单纯的调用一个方法,让方法执行,我们可以考虑使用匿 名对象
(2)但是如果涉及到赋值,千万不要使用匿名对象
(四)一个对象的内存图
(五)两个对象的内存图
phone1和phone2都是新new出来的对象,所以在堆内存中开辟了两个不同的空 间,修改自己空间中的数据不会影响其他空间中的数据
(六)两个对象指向同一空间内存图
phone2是phone1给的,phone1在内存中保存的是地址值,所以此时phone2和 phone1地址值一样,操作同一片空间中的数据,所以修改一个对象的数据会影响 另一个对象
二、成员变量和局部变量的区别
1.定义位置不同(重点)
(1)成员变量:类中方法外
(2)局部变量:定义在方法之中或者参数位置
2.初始化值不同(重点)
(1)成员变量:有默认值的,所以不用先手动赋值,就可以直接使用
(2)局部变量:是没有默认值的,所以需要先手动赋值,再使用
3.作用范围不同(重点)
(1)成员变量:作用于整个类
(2)局部变量:只作用于自己所在的方法,其他方法使用不了
4.内存位置不同
(1)成员变量:在堆中,跟着对象走
(2)局部变量:在栈中,跟着方法走
5.生命周期不同
(1)成员变量:随着对象的创建而产生,随着对象的消失而消失
(2)局部变量:随方法的调用而产生,随着方法的调用完毕而消失
package com.shujia.d_object_neicun;
public class Person {
String name;// 成员变量
public void eat(){
int i = 10;// 局部变量
System.out.println(i);
System.out.println(name);// 成员变量不用手动赋值可以直使用,因为 有默认值
}
public void drink(){
int j;
System.out.println(j);// 局部变量没有默认值,所以需要手动赋值再 使用
System.out.println(name);
System.out.println(i);// i是eat方法的局部变量,在drink中使用 不了
}
}
三、练习
自定义类型(引用数据类型)
这种数据类型操作之前必须要赋值
需要new对象赋值(String比较特殊,可以直接=赋值)