文章目录
面向对象概述
面向过程
分析解决问题的所需要的步骤,然后我们用函数来一步一步的调用实现。
举例:把大象放入冰箱
(1)打开冰箱门
(2)放入大象
(3)关闭冰箱
面向过程的思想是注重做事的过程。需要我们亲力亲为,我们必须自己实现每个细节,对我们来说很“累”,面向过程关注每个步骤。
面向对象
OOP(Object Oriented Programming)面向对象编程,
同样是把大象放入冰箱:
分析:
冰箱:具体功能有开冰箱门,关冰箱门
大象:走路
面向对象关注的是谁有打开冰箱关闭冰箱的功能,谁有进入冰箱的功能。
面向对象注重的是哪些事物有什么样的功能,强调的是具体的事物。
面向对象是以功能和属性来划分,而不是步骤。
编程就是模拟现实生活,我们使用面向对象的思想可以认为“万物皆对象”。
面向对象不需要我们亲力亲为,我们只需指挥别人去干。面向对象关注结果。
面向对象思维的好处
1、面向对象思维方式是一种更符合人们思考习惯的思想
2、面向过程思维方式更多的体现的是执行者(自己做事情),面向对象更多的体现是指挥者(指挥对象做事情)
3、面向对象思维方式将复杂的问题简单化,因为我们不再关注细节,只关注结果。
类和对象
类和对象在现实生活中的映射
类:对现实生活中具有共同的属性(特征/特点)和行为(活动)的事物的统称
例如人类:具有姓名、年龄、身高等属性,以及吃饭、睡觉等行为
对象:代表现实生活中的具体事物。例如:名叫张三的人
类不代表现实生活中任何事物,只是一个统称而已。
一个对象代表一个现实生活中一个具体的事物。
我们把某些具有相同的属性和行为的事物抽象成一类。
狗:狗是一类,所以类是一个概念,类中的一个具体的对象如:金毛犬,牧羊犬,八哥犬,京吧犬等等。
类和对象的关系:犹如模板和样本的关系,通过一个模板可以创建多个当前模板下的样例。
注意:类是概念,对象才是真正的实例。
类的定义
定义类的语法:
[访问修饰符]class 类名{
属性
方法
}
java中的引用数据类型包括3种:数组、类、接口。
类名:首字母大写的驼峰模式XxxYyy 我们可以根据类来创建对象
属性:体现在代码中就是成员变量
定义属性的语法:[访问修饰符] 数据类型 属性名;
方法(行为):体现在代码中就是成员方法
定义方法的语法:
[访问修饰符] 返回类型 方法名(参数类型 参数名1,参数类型 参数名2,···){}
public class Person {//定义人类
public String name;//姓名
public String gender;//性别
public int age;//年龄
//工作的行为
public void work(){
System.out.println("工作");
}
}
在内存中创建对象:
创建对象的语法:类名 变量名 = new 类名();
右边的类名()称为类的构造方法
对象都是存储在堆中,然后在栈中存储局部变量,这个变量所存储的值就是想要的堆内存中的地址
当使用new 创建的两个对象时会开辟两个不同的内存空间所有他们是相互隔离的。
只要在代码中new几次,就会在堆中产生几个对象,我们具体使用哪个对象,通过“.”前面的引用变量名来区分
我们可以在栈内存中创建两个变量都指向都一个堆内存中的地址,所以其中一个变量修改了堆内存中的数据,另一个变量就会读取到修改后的数据。
使用对象
在java中,引用对象的属性和方法,需要使用“.”
语法格式:
对象名.属性名;//引用对象的属性
对象名.方法名;//引用对象的方法
public static void main(String[] args) {
Person person = new Person();
person.name = "张三";
person.age = 18;
person.gender = "男";
person.work();
//打印:工作
}
注意:一个类中只能有一个main方法。
局部变量
局变量是定义在方法中或语句块中。如:
public static void printArray(int [] array){
int sum = 0;
for(int i = 0; i < array.length; i++){
sum + = i;
}
}
作用范围:只限于所定义的大括号。
存储的位置:存储在栈内存中。
默认值:无,局部变量必须赋值。
生命周期:所属的大括号结束就消失。
成员变量(类的属性)
成员变量:定义在类中,方法的外部。也可以叫类的属性。
作用域是整个类,因此我们可以在类中的任意位置使用。
作用范围:根据权限修饰符来定
存储位置:堆内存或者数据共享区
默认值:有
生命周期:由jvm通过垃圾回收机制来自动回收。
匿名对象
匿名对象由于没有栈中的变量来引用,所以就会被回收掉,所以匿名对象是无意义的
构造器(构造方法)
语法格式:[访问修饰符] 方法名 ([参数列表]){}
作用:创建对象,给对象赋初始值;
构造器本身是一个方法:
没有返回值,也没有void。
构造器的方法名必须和类名一致
在方法中定义要初始化的参数列表在构造器中通过this(…)可以来调用其他的构造器,而且this必须放在方法的第一行
默认构造器,如果在类中没有带有参数的构造器,默认构造器是隐式存在的,如果类中定义了有参数的构造器,那么默认构造器就被覆盖了,如果想要使用默认构造器,只需要把它显示的定义出来即可。
public class Person {//定义人类
public String name;//姓名
public int age;//年龄
//构造方法
public Person(){//无参构造
this.name = "Tom";
}
public Person(String name, int age) {//带参构造
this.name = name;
this.age = age;
}
//这两个构造方法构成重载关系
}
对象数组
每个数组元素就是一个对象
对象数组的数据类型就是具体的类名,对象数组内存储的就是这个类的对象,
当根据下标找到某个元素时,可以按照对象的使用方法来使用该元素。
public class Person {//定义人类
public String name;//姓名
public int age;//年龄
//构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Person[] person = {new Person("张三",18),
new Person("李四",19),
new Person("王五",20)};
for (int i = 0;i<person.length;i++) {
System.out.println("姓名:"+person[i].name+","+"年龄:"+person[i].age);
}
//姓名:张三,年龄:18
//姓名:李四,年龄:19
//姓名:王五,年龄:20
}
}
this关键字
在每一个方法中都包含一个this关键字,代表调用当前调用方法的对象的自身。this在set方法中可以区分同名的变量,加this是成员变量,没有this就是局部变量。
this关键字是对一个对象的默引用。每个实例方法内部都有一个this引用变量,指向调用这个方法的对象。
this的使用
- 使用this调用成员变量,解决成员变量与局部变量的同名冲突。
public void name(String name){
this.name = name;//成员变量与局部变量同名,必须用this
}
public void name(String xm){
name = xm;//成员变量与局部变量不同名,可以省略
}
- 使用this调用成员方法
public class Person {//定义人类
public String name;//姓名
public int age;//年龄
public void play(){}
public void print(){
this.play();//this可以省略,直接调用play()
play();
}
}
- 使用this调用重载的构造方法,只能在构造方法中使用,且必须是构造方法的第一条语句。
public class Person {//定义人类
public String name;//姓名
public int age;//年龄
//构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}