宏观上:通过面向对象进行整体设计;
微观上:执行和处理数据,仍然是面向过程。
面向过程
面向对象
区别
事物比较简单,可以用线性的思维去解决
事物比较复杂,使用简单的线性思维无法解决
共同点
面向过程和面向对象都是解决实际问题的一种思维方式
二者相辅相成,并不是对立的。解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间复杂的关系、方便我们分析整个系统;具体到微观操作,仍然使用面向过程方式来处理
类可以看做是一个模版,或者图纸,系统根据类的定义来造出对象。我们要造一个汽车,怎么样造?类就是这个图纸,规定了汽车的详细信息,然后根据图纸将汽车造出来。
类:我们叫做class。 对象:我们叫做Object,instance(实例)。以后我们说某个类的对象,某个类的实例。是一样的意思。
英雄联盟、王者荣耀中的类和对象
英雄就是类,具体的英雄,盖伦、提莫是对象。
总结:
类可以看成一类对象的模板,对象可以看成该类的一个具体实例。类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共同的属性、方法。1 属性(field 成员变量):
属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。
在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
2. 方法
方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。
方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。
方法的作用:重用代码,封装功能,便于修改
方法定义格式:
[修饰符] 方法返回值类型 方法名(形参列表) {
// n条语句
}
总结1:如何创建对象
Scanner input = new Scanner(System.in);
Person person1 = new Person();
new 后面是构造方法
总结2:如何操作属性:对象名.属性名
person1.name="zhangsan";
person1.age = 23;
总结3:如何调用方法: 对象名.方法名(实参列表)
person1.eat();
person1.work();
person1.rest("宿舍");
3.内存分配
栈内存
stack memory存放局部变量、数组名,没有默认值每调用一个方法会开辟一个栈帧,方法执行完立刻回收该栈帧,后进先出堆内存
heap memory存放真正的数组元素/对象内容,有默认值方法执行完毕后不会立刻释放资源,由垃圾回收器负责回收;程序员不用操心 但时间不确定类中定义的变量是成员变量,而方法中定义的变量,包括方法的参数,代码块中定义的变量被称为局部变量。两个的区别主要表现在以下几方面:
成员变量
局部变量
代码中位置不同
类中定义的变量
方法或代码块中定义的变量
内存中位置不同
堆内存
栈内存
是否有默认值
有
没有
代码作用范围(空间)
当前类的方法
当前一个方法或代码块
作用时间不同
当前对象从创建到销毁
定义变量到所属方法或代码块执行完毕
对于一个类来说
一般有三种常见的成员:属性field、方法method、构造器constructor。
这三种成员都可以定义零个或多个。
声明格式:
[修饰符] 类名(形参列表){
//n条语句
}
构造方法的4个要点:
构造方法的方法名必须和类名一致!构造方法通过new关键字调用!!构造方法虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。如果我们没有定义构造方法,则编译器会自动定义一个无参的构造方法。如果已定义则编译器不会自动添加!构造方法也是方法,只不过有特殊的作用而已。与普通方法一样,构造方法也可以重载。
需要注意
对象的创建完全是由构造方法实现的吗?
不完全是。构造方法是创建Java对象重要途径,通过new关键字调用构造器时,构造器也确实返回了该类对象,但这个对象并不是完全由构造器负责创建的。创建一个对象分为如下四步:
1. 分配对象空间,并将对象成员变量初始化为0或空
2. 执行属性值的显示初始化
3. 执行构造方法
4. 返回对象的地址给相关的变量
雷区
如果方法构造中形参名与属性名相同时,需要使用this关键字区分属性与形参。
例如:
this.id 表示属性id;id表示形参id
方法调用是Java开发中的基本操作,方法参数分为基本数据类型和引用数据类型两种,传递参数有着实质的区别。
public class TestPrimaryArgs { public static void main(String[] args) { //定义两个变量 int num1 = 10; int num2 = 20; //输出交换前两个变量的值 System.out.println("交换前:num1="+num1+",num2="+num2); //交换两个变量的值 swap(num1,num2); //输出交换后两个变量的值 System.out.println("交换后:num1="+num1+",num2="+num2); } public static void swap(int num1,int num2){ int temp; temp = num1; num1 = num2; num2 = temp; System.out.println("交换后1:num1="+num1+",num2="+num2); } }
引用数据类型的方法调用
public class Point { int x; int y; } public class TestRefArgs { public static void main(String[] args) { //定义两个变量 Point p = new Point(); p.x = 10; p.y = 20; //输出交换前两个变量的值 System.out.println("交换前:p.x="+p.x+",p.y="+p.y); //交换两个变量的值 swap(p); //输出交换后两个变量的值 System.out.println("交换后:p.x="+p.x+",p.y="+p.y); } public static void swap(Point p){ p = new Point(); int temp; temp = p.x; p.x = p.y; p.y = temp; } }注意:基本数据类型的参数是值传递,引用数据类型的参数传递是引用(地址),本质上也是值传递。