面向对象(POP)与面向过程(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常的思维逻辑种采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
.面向对象的三大特征:
封装(Encapsulation)
继承(Inheritance)
多态(Polymorphism)
1.Java类及类的成员:
* 属性、方法、构造器、代码块、内部类
* 2.面向对象的三大特征:
* 封装性、继承性、多态性、(抽象性)
* 3.其它关键字:
* this、super、static、final、abstract、interface、package、import等
面向对象的思想概述:
程序员从面向过程的执行者转化成了面向对象的指挥者
面向对象分析方法分析问题的思路和步骤:
>根据问题需要,选择问题所针对的现实世界的实体
>把实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类
>把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构
>将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
类(Class)和对象(Object)是面向对象的核心概念。
>类是对一类事物的描述,是抽象的、概念上的定义
>对象是实际存在的该类事物的每个个体,因而也成为实例(Instance)。
“万事万物皆对象”
>可以理解为:类=抽象概念的人;对象=实实在在的某个人
>面向对象程序设计的重点是类的设计
>类的设计,其实就是类的成员的设计
Java类及类的成员:
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由基本的细胞构成的。同理Java代码世界石油诸多个不同功能的类构成的
现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、……那么,Java中用类class来描述事物也是如此。常见的类的成员有:
>属性:对应类中的成员变量
>行为:对应类中的成员方法
Field = 属性 = 成员变量,Method = (成员)方法 = 函数
生活中描述事物无非就是描述事物的属性和行为。如:人有身高,体重等属性,有说话,打球等行为。
/*
* 一、设计类,其实就是设计类的成员
*
* Field = 属性 = 成员变量 = 域、字段
* Method = (成员)方法 = 函数
*
*
* 二、类和对象的使用(面向对象思想落地的实现)
* 1.创建类,设计类的成员
* 2.创建类的对象
* 3.通过“对象.属性”或“对象.方法”调用对象的结构
*
* 三、如果创建了一个类的多个对象,
* 则每个对象都独立的拥有一套类的属性。(非static的)
*
* 意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。
*
*
*/
//测试类
public class PersonTest {
public static void main(String[] args) {
//创建person类的对象
Person p1 = new Person();
//Scanner scanner = new scanner(System.in);
//调用对象的结构:属性、方法
//调用属性:“属性.方法”
p1.name = "Tom";
p1.isMale = true;
p1.age = 12;
System.out.println(p1.name + "\t" + p1.age);//Tom 12
//调用方法:“对象.方法”
p1.eat();
p1.sleep();
p1.talk("Chinese");
//*****************************
Person p2 = new Person();
System.out.println(p2.name);//null
//*****************************
/*将p1变量保存的对象地址值赋给p3,
导致p1和p3指向了堆空间中的一个对象实体*/
Person p3 = p1;
System.out.println(p3.name);//Tom
p3.age = 10;
System.out.println(p1.age);//10
}
}
class Person{
//属性
String name;
int age;
boolean isMale;
//方法
public void eat() {
System.out.println("人可以吃饭");
}
public void sleep() {
System.out.println("人可以睡觉");
}
public void talk(String language) {
System.out.println("人可以说话,使用的是" + language);
}
}
内存解析:
堆(Heap):
此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配
栈(Stack):
通常所说的栈,是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放
方法区(Method Area):
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。