Java 基础(面向对象; 类和对象)

面向过程(POP)与面向对象(OOP) 1 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对

面向过程(POP)与面向对象(OOP)

1.二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
2.面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象,分类,继承,聚合,多态等。
面向对象: Object Oriented Programming
面向过程: Procedure Oriented Programming

面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做
面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做

面向对象的三大特征

1.封装(Encapsulation)
2.继承(Inheritance)
3.多态(Polymorphism)

面向对象的思想概述

程序员从面向过程的执行者转化成了面向对象的指挥者

面向对象分析问题的思路和步骤:

  1. 根据问题需求,选择问题所针对的现实世界中的实体
  2. 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类型
  3. 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
  4. 将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。

类和对象

类(Class)和对象(Object)是面向对象的核心概念

  • 类是对一类事物的描述,是抽象的,概念上的定义
  • 对象是实际存在的该类事物的每个个体,因而也称为实例(Instance)

万事万物皆对象

常见的类成员有:
属性:对应类中的成员变量。属性 = 成员变量 = field = 域或字段
行为:对应类中的成员方法。行为 = 成员方法 = method = 函数

类和对象的使用(面向对象思维落地的实现)

  1. 创建类,涉及类的成员
  2. 创建类的对象
  3. 通过"对象.属性"或"对象.方法"调用对象的结构

如果创建一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)。意味着如果我们修改一个对象的属性a,则不影响另外一个对象属性b的值。

内存解析

  • 堆(heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
  • 栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean, byte, char, short, int, float, long, double)对象引用(reference类型,它不同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放。
  • 方法区(Method Area),用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
public class PersonTest {
	public static void main(String[] args) {
		Person p1 = new Person();
		
		//调用对象的结构: 属性,方法
		//调用属性: "对象.属性"
		p1.name = "Tom";
		p1.isMale = true;
		System.out.println(p1.name + " " + p1.isMale);
		
		//调用方法:"对象.方法"
		p1.eat();
		p1.sleep();
		p1.talk("Chinese");
		
		//****************************************************
		Person p2 = new Person();
		System.out.println(p2.name);  //null
		System.out.println(p2.isMale);
		
		//****************************************************
		//将p1变量保存的对象地址赋值给p3,导致p1和p3指向了堆空间中的同一个对象实体。
		Person p3 = p1;
		System.out.println(p3.name);
		
		p3.age = 10;
		System.out.print(p1.age);
	}

}


class Person{
	//属性
	String name;
	int age = 1;
	boolean isMale;
	
	//方法
	public void eat() {
		System.out.println("人可以吃饭");
	}
	
	public void sleep() {
		System.out.println("人可以睡觉");
	}
	
	public void talk(String language) {
		System.out.println("人可以说话, 使用的是: " + language);
	}
}

运行结果: