1 基本思想
面向对象与面向过程的特点
面向过程,强调的是过程(动作)
,比如,把水果存进冰箱,面向过程的思想是这样的:
打开冰箱
存储水果
关闭冰箱
面向对象,强调的是对象(实体)
,是对象本身具备什么样的功能,比如,把水果存进冰箱,面向对象的思想是这样的:
冰箱打开
冰箱存储
冰箱关闭
对象对功能进行了封装,找到对象,就是找到了功能,想实现什么功能,就调用具备什么功能的对象即可。
对象的出现,是为了封装数据,数据多了,可以考虑建一个对象封装起来
2 类(Class) 与 对象(Object) 之间的关系
-
用 Java 语言,对现实生活中的事物进行描述,是通过
-
对事物的描述,通常只关注两个方面
- 属性 : 成员变量
- 行为 : 成员函数
类(Class)
的形式体现的。
怎么描述?
只要明确该事物的 属性
和 行为
, 并定义在类中即可。
对象:类的实例,在 Java 中,通过 new 来创建对象。除了8种基本类型外,还有3种引用类型,数组类型
, 类类型
,接口类型
3 对象的内存体现
堆中存的都是实体,栈中存的都是引用类型
Car c = new Car();
- 凡是 new 的对象,都存在堆中
- 堆内存中的对象,默认初始化
- 将 new Car() 的地址,赋给 c
多个引用,指向同一个对象
Car c1 = new Car();
Car c2 = c1;
c1.num = 8;
c2.color = “red”;
c1.run(); // 8, red
c1 = null; // c1 指向空,c2仍然能用
4 成员变量 和 局部变量
成员变量定义在类中,整个类中都可以访问。
局部变量定义在函数,语句,局部代码块中,只在 所属的区域有效。
成员变量存在于堆内存的对象中。
局部变量存在于栈内存的方法中。
成员变量随着对象的创建而存在,随着对象的消失而消失。
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
成员变量都有默认初始化值。
局部变量没有默认初始化值。
5 匿名对象
匿名对象,没有名字的对象。
new Car(); // 匿名对象,其实就是 定义对象的 简写格式。
1 当对象,对方法仅进行一次调用的时候,就可以简化成匿名对象。匿名对象没有任何引用和指向,运行完就结束了。
Car c = new Car();
c.run();
new Car().run();
new Car().num = 5;
new Car().color = "green";
new Car().run();
// 分析:其实这是3个对象,
// new Car().num = 5; new Car()是创建一个新对象 .num=5; 是为新对象赋值
// 在运行第二句话new Car().color = "green";的时候,第一句话就已经成了垃圾;
2 匿名对象可以作为实参进行传递
Car c1 = new Car();
// show(c1);
show(new Car()); // 作为实参进行传递,不变垃圾
6 数据传递
1 成员变量和局部变量的同名&显示初始化
class Car
{
int num;
String color; // Java中,所有的关键字都是小写的,这里的String,是类
void run()
{
int num = 10;
System.out.println(num+"..."+color);
}
}
class CarDemo
{
public static void main(String[] args)
{
Car c = new Car();/
c.num = 4;
c.run();
}
运行结果是 10
怎么分析程序:
c.run(); 执行run方法,run()方法在栈中,栈里面有值,10,那么就输出10,如果栈里面没有值,再去堆里面找。
2 基本数据类型参数传递
class Demo
{
public static void main(String[] args)
{
int x = 3;
show(x); // 运行完出栈,离开内存,被释放了
System.out.println("x="+x);
}
public static void show(int x)
{
x = 4;
// return; // 有个默认的 return
}
}
分析:输出结果 x=3;
执行过程:虚拟机先执行主函数,在栈中,x=3;
接着执行 show(x); show()进栈,show()函数里有自己的x; 主函数的x,赋值给了show()方法的x, 虽然都叫x,但是属于不同的区间, 一开始 x=3,show()方法执行代码。代码里给x赋值,赋值完后,x=4;
执行完后,show()方法结束了,出栈。
3 引用数据类型参数传递
class Demo
{
int x = 3;
public static void main(String[] args)
{
Demo d = new Demo();
d.x = 9;
show(d);
System.out.println(d.x);
}
public static void show(Demo d)
{
d.x = 4;
}
}
这个函数,是在类里面,写入了主方法,写成下面的形式,更规范,更好理解
class Demo{
int x = 3;
public static void show(Demo d)
{
d.x = 4;
}
}
public static void main(String[] args)
{
// 在堆里新建一个Demo对象,对象属性x默认为0,在 int x=3后,x被初始化为3
Demo d = new Demo();
// x变为9
d.x = 9;
/*
执行 show(d),在执行 show()方法的时候,传参,d变为9,在show()方法内,d变为4,show(d)方法执行完,出栈
*/
show(d); //show()执行完出栈
// 打印d,d是在堆中,属性是成员变量,现在d的属性 x 值为4,所以输出结果为4
System.out.println(d.x);
}