1. 概述
- 面向过程:当需要实现一个功能的时候,每一个具体的步骤都需要亲历亲为,详细处理每一个细节
- 面向对象:当需要实现一个功能的时候,不关心具体步骤,而是找一个已经具有该功能的人来帮我做事。
package cn.itcast.day05.demo01;
import java.util.Arrays;
public class Demo01PrintArray {
public static void main(String[] args) {
int[] array = {10,20,3,5,11,666};
//面向对象 打印数组
//JDK已经为我们提供了Arrays类,其中有一个是toString方法,直接就可以把数组变成想要的格式的字符串
System.out.println(Arrays.toString(array));
}
}
面向对象的语言中包含了3大特征:封装、继承、多态
2. 类和对象的关系
- 类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类的事物。
- 类是对一类事物的描述
- 对象是一类事物的实例
- 类是对象的模板,对象是类的实体
2.1 类的定义
public class Student {
//成员变量(属性):直接定义在类当中,在方法外面。
//之前所学的定义在方法(包括main方法)中的变量都是局部变量
String name;
String age;
//成员方法(行为):与普通方法最显著的区别是没有关键字static
public void eat(){
System.out.println("吃饭饭");
}
public void sleep(){
System.out.println("吃觉觉");
}
public void study(){
System.out.println("学习!");
}
}
2.2 对象的创建及使用
/*
通常情况下 一个类并不可以直接使用,需要根据类创建一个对象,才可以使用
1. 导包:也就是指出需要使用的类在什么位置
import 包名称.类名称;
import cn.itcast.day05.demo01.Student
对于和当前类同属于一个包的情况,可以省略包语句不写
2. 创建,格式:
类名称 对象名 = new 类名称();
Student stu = new Student();
3. 使用
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名([参数])
注意事项:
如果成员变量没有赋值, 那么将会有一个默认值,规则和数组一样。
*/
public class Demo02Student {
public static void main(String[] args) {
//1. 导包 省略
//2. 创建对象
Student stu = new Student();
//3. 使用
System.out.println(stu.name);//null
System.out.println(stu.age);//0
//改变对象中成员变量的内容
stu.name = "赵丽颖";
stu.age = 18;
System.out.println(stu.name);//赵丽颖
System.out.println(stu.age);//18
//4. 使用对象的成员方法
stu.eat();
}
}
2.3 手机类练习
- 定义
public class Phone {
//成员变量
String brand;
double price;
String color;
//成员方法
public void call(String who) {
System.out.println("给"+who+"打电话");
}
public void sendMessage () {
System.out.println("群发短信");
}
}
-使用
public class Demo01PhoneOne {
public static void main(String[] args) {
Phone one = new Phone();
System.out.println(one.brand);
System.out.println(one.price);
System.out.println(one.color);
one.brand="苹果";
one.price=8388.5;
one.color="黑色";
System.out.println(one.brand);
System.out.println(one.price);
System.out.println(one.color);
one.call("乔布斯");
one.sendMessage();
}
}
2.4对象对应的内存图
- 方法区最先有数据,保存的是.class信息。两个.class相关信息都在方法区应该先从main方法开始执行。
- main方法进栈(压栈),进栈之后做了一些事情:创建了一个对象(等号左边局部变量)Phone one。同时等号右边new Phone()在堆中开辟一段内存空间,并将其地址0x666,赋值给栈中的变量Phone one。
- 同时栈中new Phone()创建出的这个类里面所存放的内容由方法区告知(内容包括成员变量和成员方法),将成员变量拿过来,并为其赋上默认值。而里面的成员方法保存的是一个地址值0x333。即成员方法的地址值保存在堆当中。
- 访问one.brand中的内容:通过one知道地址0x666,根据地址找到one.brand的当前值。
- 修改one.brand中的内容: 通过one知道地址0x666,根据地址找到one.brand的当前位置,并将其原先的值替换掉。
- 执行one.call("乔布斯"):通过one知道地址0x666,在根据0x333找到方法(两步走),之后在方法区找到了一个call(String who)方法。
- 若想运行call(String who)方法,也需要进栈(注意:它是后进栈的,所以压着main方法,也叫压栈),之后根据参数“乔布斯”,得出给乔布斯打电话
- call(String who)方法该方法完成后,打上×,代表出栈,也叫弹栈。
- 之后运行one.sendMessage(),该方法进栈。。。出栈。。。
- main方法出栈