面向过程&面向对象
- 面向过程思想(线性思维)
- 步骤清晰简单,第一步做什么,第二步做什么……
- 面对过程适合处理一些较为简单的问题。
- 面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题。
- 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
- 记录:
- 面向对象(oo)
- 面向对象编程(oop)
- Java的核心思想就是oop
- 属性+方法就是一个类
什么是面向对象
- 面向对象编程(Object Oriented Programming)—OOP
- 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
- 核心思想
- 抽象
- 举例理解:学生管理系统,对于学生来说只需要了解班级、学号、成绩等信息,我们可以把学生的共同点剥离抽取出来,变成一个类。可以理解为抽取像的部分、共同点。(抽像)
- 三大特征
- 封装
- 举例理解:给数据封装包装起来。对外提供一个口子,提供访问。
- 继承
- 举例理解:子类继续父类,A继承B,A就拥有了B的所有信息。
- 多态
- 举例理解:小红和小明都会去学习,成绩可能各有所好坏,学出来的东西完全不一样。(同一个事物,会有多种形态)
- 封装
- 抽象
- 从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象。
- 从代码运行角度考虑是先有类后有对象。类是对象的模板。
回顾方法及加深
方法的定义
package com.landray.object;
public class Demo01 {
public static void main(String[] args) {
}
/*
* 修饰符 返回值类型 方法名(...){
* //方法体
* return 返回值;
* }
*/
public String sayHello() {
return "Hello,World";
}
// 注意
public void hello() {
return;// 可以默认不写,如果要写的话可以直接return空就行了。
}
// 比较大小
public int max(int a, int b) {
return a > b ? a : b;// 三元运算符
}
// break 和 return 的区别
// break:跳出switch,结束循环。
// return:代表方法结束,返回一个结果。(在return后不能再写其他代码或者输出语句。会报错-无法访问的代码)
// 方法名:注意规范 驼峰命名 见名知意
// 参数列表:(参数类型 参数名称)
}
方法的调用
- 静态方法和非静态方法
package com.landray.object;
//学生类
public class Student {
// 非静态方法
public void say() {
System.out.println("非静态方法");
}
// 静态方法
public static void talk() {
System.out.println("静态方法");
}
}
package com.landray.object;
public class Demo02 {
public static void main(String[] args) {
// 非静态方法 实例化这个类-new
Student student = new Student();
student.say();
// 静态方法 static可以通过类名.方法名访问
Student.talk();
}
// 都是非静态方法;a方法可以直接调用b方法
public void a() {
b();
}
public void b() {
}
// 都是静态方法;c方法可以直接调用d方法
public static void c() {
d();
}
public static void d() {
}
// e是静态方法,f是非静态方法;e方法无法调用f方法
// 为什么:
// static和类一起加载的,类存在的时候static的方法就存在了。
public static void e() {
// f();
}
// 跟对象有关的,对象创建之后才存在。(类实例化之后才存在)
public void f() {
}
}
- 形参和实参
- 实际参数和形式参数的类型要对应。
- 值传递和引用传递
- Java中都是值传递
package com.landray.object;
//值传递
public class Demo03 {
public static void main(String[] args) {
// Java中都是值传递
int a = 1;
System.out.println(a);// 输出 1
Demo03.change(a);
System.out.println(a);// 输出 1
}
// 返回值为空
public static void change(int a) {
a = 10;
}
}
package com.landray.object;
//引用传递:一般是传递对象,本质还是值传递。
//对象 内存
public class Demo04 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);// null
Demo04.change(person);
System.out.println(person.name);// 盖伦
}
public static void change(Person person) {
// 修改的是Person类中的name值
// Person是一个对象:指向的是Person类(Person person = new Person();)
// 这是一个具体的人,可以改变属性
person.name = "盖伦";
}
}
//一个类中只能有一个 public class,但是可以有多个class。
//定义了一个Person类,有一个属性:name
class Person {
String name;// null
}
类与对象的关系
-
类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。
- 动物、植物、手机、电脑…
- Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
-
对象是抽象概念的具体实例
- 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例。
- 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。
创建与初始化对象
- 使用new关键字创建对象。
- 使用new关键字创建的时候,除了分配内存空间之外,还会给 创建好的对象 进行默认的初始化以及对类中构造器的调用。
- 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:
- 1.必须和类的名字相同。
- 2.必须没有返回类型,也不能写void。
package com.landray.object;
//学生类
//一个类中只可能存在属性和方法,不会有其他的。
public class Student {
// 属性:字段
String name;// 默认的初始化值 null
int age;// 默认的初始化值 0
// 方法
public void study() {
// 因为学习的人名字不固定,所以这里用this.name指代
// this代表当前这个类
System.out.println(this.name + "在学习");
}
}
package com.landray.object;
//一个项目应该只存在一个main方法
public class Demo05 {
public static void main(String[] args) {
// 类是抽象的一个模板,不能给模板赋值,不然就都是一样的值了。
// 类是抽象的,对象是一个具体的实例。
// 理解:类是一些拥有共同特征的事物归类的一个模板,比如说桌子类,他们都拥有共同的特征桌脚和桌面。
// 我们把这类共同的事物归为桌子类,当这个桌子类去实例化的时候,可以是餐桌、书桌、麻将桌、办公桌等。
// 类是抽象的,需要实例化。
// 把类实例化成为一个对象。
// new 之后对象就被实例化了。
// 类实例化后会返回一个自己的对象。
// student对象就是一个Student类的具体实例。
Student student = new Student();
// 学生类实例,这个人可以是“xiaohong”也可以是“xiaoming”。他们都是属于学生一类。
// 同一个类下面可以产生不同的对象。
// 但是这些人都拥有共同的特性,都具有“name”、“age”、“study()”
Student xiaoming = new Student();
Student xiaohong = new Student();
// 使用new关键字创建的时候,除了分配内存空间之外,还会给 创建好的对象 进行默认的初始化。所以会输出以下的默认值:
System.out.println(xiaoming.name);// 输出 null
System.out.println(xiaoming.age);// 输出 0
// 赋值后重新输出
xiaoming.name = "小明";
xiaoming.age = 18;
System.out.println(xiaoming.name);// 输出 小明
System.out.println(xiaoming.age);// 输出 18
// 给小红赋值
xiaohong.name = "小红";
xiaohong.age = 18;
}
}
构造器详解
- 创建一个名为Person的类:
package com.landray.object;
public class Person {
}
- 这个Person类中什么都不存在,但是在main方法中也能去new实例化:
- 这是为什么?
package com.landray.object;
public class Application {
public static void main(String[] args) {
// new 实例化了一个对象
Person persion = new Person();
}
}
- 查看Person类生成的class文件:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.landray.object;
public class Person {
public Person() {
}
}
- 得出:
- 编译后的class文件默认的增加了一个Person()的方法。并且这个方法的名称和类的名字相同;没有返回值。
- 构造器事项:
package com.landray.object;
public class Person {
// 一个类即使什么都不写,它也会存在一个方法(构造方法)
// 显示的定义构造器:
// 1.必须和类的名字相同
// 2.必须没有返回类型,也不能写void
// 作用:
// 1.使用new关键字(必须要有构造器),本质是在调用构造器
// 2.用来初始化对象的值
// 注意点:
// 定义了有参构造之后,如果想要使用无参构造,显示的定义一个无参的构造
String name;
// 无参构造方法
public Person() {
// this.name = "盖伦";
}
// 有参构造方法
// 一旦定义了有参构造之后,无参构造就必须显示定义。
public Person(String name) {
this.name = name;
}
/*
* public static void main(String[] args) {
*
* new 实例化了一个对象
* Person persion = new Person();
* System.out.println(persion.name);
* Person persion1 = new Person("德玛西亚");
* System.out.println(persion.name);
* 根据是否有无参数来调用上面对应的重载方法
*
* }
*/
}
创建对象内存分析
- 创建一个Pet类(拥有“姓名”、“年龄”属性以及“呼喊”的行为),在main方法中进行实例化赋值的过程。在内存中的过程分析。
package com.landray.object;
public class Pet {
public String name;
public int age;
// 无参构造(默认隐藏)
public void shout() {
System.out.println("叫了一声");
}
}
package com.landray.object;
public class Application {
public static void main(String[] args) {
Pet dog = new Pet();
dog.name = "旺财";
dog.age = 3;
dog.shout();
System.out.println(dog.name);
System.out.println(dog.age);
Pet cat = new Pet();
}
}
- 说明:
- 第一步加载Application类代码信息,加载类中的main方法以及存在的常量池(字符串)
- 第二步在栈的最下面会执行main方法
- 第三步在main方法中Pet dog = new Pet()的操作,会加载我们的Pet类。加载对象的模板,模板中的信息都为默认值name = null;age = 0;
- 第四步加载模板生成具体的dog()对象,会在栈中生成一个dog变量,栈中的dog变量会引用指向堆中的对象。拥有属性 name = null;age = 0;并且已经能输出“System.out.println(“叫了一声”);”这个字符串。
- 第五步执行dog.name = “旺财”;dog.age = 3;赋值操作。拿到常量池中的“旺财”进行赋值。
- 第二个对象开始Pet cat = new Pet();又会在栈中生成一个cat变量,栈中的cat变量会引用指向堆中的具体对象…
- 静态方法区:
- 和类一起加载,方便大家调用的操作会放在这里,和类一起加载的作用就是所有的对象都会掉到它。
- 方法区也属于堆。
简单小结类与对象
- 类与对象
- 类是一个模板,是抽象的
- 对象是一个具体实例
- 方法
- 方法的定义与调用
- 对象的引用
- 基本类型:八大基本类型
- 引用类型:除了基本类型以外,其他都是引用类型
- 对象是通过引用来操作的(指向堆中的对象地址)。引用是指栈中的变量指向的是堆中的地址(栈->堆)
- 属性(字段、成员变量)
- 会默认初始化
- 数字默认值:0/0.0(浮点)
- char默认值:u0000
- boolean默认值:false
- 引用类型:null
- 属性定义
- 修饰符 属性类型 属性名 = 属性值
- 会默认初始化
- 对象的创建和使用
- 必须使用new关键字创造对象,还需要有构造器。
- Person person = new Person();
- 对象的属性调用:person.name
- 对象的方法调用:person.sleep()
- 一个类中只具有两种东西
- 静态的属性(属性)
- 动态的行为(方法)