面向对象

面向对象思想介绍
1、面向对象:编程使用的一种编程思路,编程思想
2、面向对象和面向过程比较:都是编程思想,面向过程是面向对象的基础,面向对象是基于面向过程的。
面向过程:更强调解决问题的基本步骤,强调问题的解决方式,更强调的是方法。面向过程的编程思路:自顶向下、不断分解
面向对象:更强调解决问题的主体,更强调谁来解决这个问题,更强调的是数据,更强调的是对象,更强调的是谁拥有数据和操作数据的权力。面向对象的编程思路:自底向上,不断拼装
洗衣服:
面向过程:准备盆子、放洗衣粉、放水、搅匀、泡衣服、揉一揉、涮一涮,晾出来
面向对象:找到可以洗衣服的机器,衣服放进去,按按钮,拿出来
3、面向对象好处:
1、更符合人类的思想习惯:凡事喜欢找对象、找工具、找人,而不是找方法
2、复杂的问题简单化
3、由执行者变成了指挥者
4、面向对象的特征:
封装
继承
多态
5、面向对象是面向过程更高层次的编程思想、面向过程是面向对象的基础。面向对象基于面向过程。
类和对象
类和对象的比较
1、类:类型,对具体事物的一个抽象认识,是抽象出来的结果,其实就是一个概念
抽象:抽取事物中,像的相同的相似的内容出来,在人脑中形成一个概念
2、对象:事物的具体体现。
类的说明
1、类就是一组相关属性和行为定义的集合。
2、属性:对于事物特征的描述,一般是名词或者形容词
Java语言中,就是一个成员变量,和以前定义的方式一样,只不过位置发生变化
以前定义在方法中,现在定义在类中方法外
3、行为:对于事物功能的描述,一般是一个动词或者动宾结构
Java语言中,就是一个成员方法,和以前定义的方式一样,只不过修饰符发生变化
以前修饰符是public static,现在将static去掉
4、举例:
人类
属性:姓名、年龄
功能:吃饭、睡觉、工作
5、说明:
自定义类编译之后,也会生成一个.class的字节码文件
在一个源文件中,可以定义多个类,一旦编译该文件,就会将所有的类型进行编译
对象的创建和使用
1、对象创建的格式:
类名 对象名 = new 类名();
2、格式内容解释:
类名:要创建的对象所属的类型,例如Scanner、Person
对象名:是一个合法的标识符即可,用于表示创建的对象
=:将对象的地址,赋值给对象名
new:在堆内存中开辟一段空间,用于存储该类型的数据
类名:和前面声明引用的类名一样。
():表示调用一个方法,构造方法。
3、访问属性:
对象名.属性名(访问)
对象名.属性名 = 属性值;(修改)
4、访问方法:
对象名.方法名();
代码示例
class Demo01_PersonTest {
public static void main(String[] args) {
Person p = new Person();//创建对象
System.out.println(p.name + “…” + p.age);
p.eat();
p.sleep();
}
}

//人类
class Person {
//成员变量
//姓名属性
String name = “zhangsan”;
int age = 23;

//定义方法
public void eat() {
	System.out.println("人吃饭");
}

public void sleep() {
	System.out.println("人睡觉");
}

}
练习
定义一个汽车类,有颜色(color)、轮胎个数(num),跑(run:显示当前汽车的颜色和轮胎个数)
在测试类中,创建汽车对象,修改成员变量的值,调用run方法,查看当前汽车对象的各种属性
代码示例
class Demo02_CarTest {
public static void main(String[] args) {
Car c = new Car();
c.color = “black”;
c.num = 4;
c.run();
}
}
/*
定义一个汽车类
有颜色(color)、轮胎个数(num)
跑(run:显示当前汽车的颜色和轮胎个数)
在测试类中,创建汽车对象
修改成员变量的值
调用run方法,查看当前汽车对象的各种属性
*/
class Car {
String color;
int num;

public void run() {
	System.out.println(color + "..." + num);
}

}
创建对象的内存理解
创建两个对象的内存图
1、图示、

2、创建对象的步骤:
1、将要创建的对象所属的类型加载到方法区,形成Car.class的字节码
2、在栈内存中创建一个Car类型的引用,将来用于存储堆内存中对象的地址
3、在对内存中开辟空间,给各个成员变量分配内存
4、给对象中的成员变量进行默认的初始化赋值
5、将对象的地址,赋值给栈内存中的引用
3、内存图示的说明:
1、第一次使用某个类型的时候,会将该类型的字节码加载到方法区,第二次使用的时候,不需要重复加载
2、在创建的对象中,默认隐含了一个字节码的地址,将来可以通过对象找到创建自己的字节码
3、哪个对象调用方法,方法的栈帧中,就默认隐含了该对象的地址
4、每次使用new关键字,都会在堆内存中开辟一段新的空间。
代码示例
class Demo03_创建两个对象的内存图 {
public static void main(String[] args) {
Car c1 = new Car();
c1.color = “black”;
c1.num = 4;
c1.run();

	Car c2 = new Car();
	c2.run();
	c2.color = "red";
	c2.num = 8;
	c2.run();
}

}
/*
定义一个汽车类
有颜色(color)、轮胎个数(num)
跑(run:显示当前汽车的颜色和轮胎个数)
在测试类中,创建汽车对象
修改成员变量的值
调用run方法,查看当前汽车对象的各种属性
*/
class Car {
String color;
int num;

public void run() {
	System.out.println(color + "..." + num);
}

}
两个引用指向同一个对象的内存图

代码示例
class Demo04_两个引用指向同一个对象 {
public static void main(String[] args) {
Car c1 = new Car();
c1.color = “black”;
c1.num = 4;

	Car c2 = c1;
	c2.run();
	c2.color = "red";
	c2.run();

	c1.run();
}

}
面向对象中的其他内容
成员变量和局部变量的比较
1、成员变量:定义在类中的成员位置的变量,就是成员变量;局部变量,定义在方法中的变量,就是局部变量。
2、不同点:
代码层面:定义位置不同
局部变量:定义在方法中,或者方法声明上(方法的形式参数)
成员变量:定义在类中方法外。
内存层面:空间不同
局部变量:属于方法,和方法的位置相同,在栈内存的方法的栈帧中
成员变量:属于对象,和对象的位置相同,在堆内存的对象中
内存层面:时间不同,生命周期不同
局部变量:随着方法的调用而存在,随着方法的调用结束而消失
成员变量:随着对象的创建而存在,随着对象的消失而消失(栈内存中没有任何引 用指向该对象时,该对象就变成了垃圾,片刻之后就会被垃圾回收线程回收掉)
初始化状态不同:
局部变量:没有默认的初始化值,必须先手动赋值,才能使用
成员变量:有默认的初始化值
引用数据类型:null
基本数据类型:
整数类型:0
小数类型:0.0
布尔类型:false
字符类型:’\u0000’
代码示例
class Demo05_局部变量和成员变量的区别 {
public static void main(String[] args) {
Demo d = new Demo();
System.out.println(d.str + “…” + d.i + “…” + d.d + “…” + d.b + “…” + d.c);
}
}

class Demo {
String str;
int i;
double d;
boolean b;
char c;
}
方法的形式参数是引用数据类型
1、方法的形式参数,既可以是基本数据类型,也可以是引用数据类型
2、引用数据类型:类、接口、枚举、数组
3、当方法的形式参数是引用数据类型时,其实在调用的时候,需要传递的是一个对象的内存地址,在方法的内部可以通过这个内存地址,访问方法外创建的对象。
4、图示:

5、理解:
在多个方法中,有不同的引用,记录着相同的对象的内存地址。多个引用指向了同一个对象
代码示例
class Demo06_方法的形式参数是引用数据类型 {
public static void main(String[] args) {
Mobile m1 = new Mobile();
m1.brand = “华为”;
m1.price = 4321;
useMobile(m1);
updateMobile(m1);
useMobile(m1);
}

public static void useMobile(Mobile m) {//m = m1
	m.show();
}

public static void updateMobile(Mobile m) {
	m.brand = "华为";
	m.price = 4320;
}

}

class Mobile {
String brand;
int price;

public void show() {
	System.out.println(brand + "..." + price + "...很好用");
}

}
方法的返回值类型时引用数据类型
1、方法的返回值类型,既可以是基本数据类型,也可以是引用数据类型
2、如果方法的返回值类型时引用数据类型,那么在return语句中,一定要返回该类型的一个对象。
3、图示:

代码示例
class Demo07_方法的返回值类型是引用类型 {
public static void main(String[] args) {
Mobile m = makeMobile();
m.show();
}

//定义一个方法,用于生产华为、4321价格的手机
public static Mobile makeMobile() {
	Mobile m = new Mobile();
	m.brand = "华为";
	m.price = 4321;
	return m;
}

}
匿名对象的理解和使用
1、匿名对象:没有名字的对象。
2、定义格式:
new 类名();
3、匿名对象的使用场景:
1、如果某个对象在创建之后,其方法只调用一次,那么就可以使用匿名对象来调用。这种写法会节省一些内存空间。
2、可以作为某个方法的实际参数。这种调用形式,在主方法中,可以将该对象看做匿名对象,但是在被调用的方法中,这个对象是有引用的对象,不是匿名对象。
3、可以作为某个方法的返回值。这种调用形式,在被调用方法中,这个对象是匿名对象,但是在调用者,这个对象可能不是匿名对象。
4、注意事项:
匿名对象可以给成员变量赋值,但是这样做没有任何意义。因为匿名对象一旦被赋值,匿名对象就变成了垃圾,很快被回收掉。即使没有被回收,我们也无法使用这个匿名对象。
代码示例
class Demo08_匿名对象 {
public static void main(String[] args) {
new Mobile().show();//匿名对象调用方法一次

	useMobile(new Mobile());//匿名对象作为方法的实际参数

	Mobile m = createMobile();//匿名对象作为方法的返回值

	//匿名对象给成员变量赋值
	new Mobile().brand = "huawei";
	new Mobile().price = 4321;
	System.out.println(new Mobile().brand + "..." + new Mobile().price);
}

public static void useMobile(Mobile m) {//Mobile m = new Mobile()
	m.show();
}

public static Mobile createMobile() {
	/*Mobile m = new Mobile();
	return m;*/
	return new Mobile();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值