JavaLearning_4

面向对象

“面向对象”是编程的一种思想,是java基础中最重要的一部分。下面让我们来仔细体会这种思想。


重点:何为“面向对象”的编程思想?

文章目录

  • 面向对象
  • 比较
  • 一、“面向对象”的核心概念
  • 二、java类和类的成员
    • 1.属性和行为
    • 2.对象的创建和使用
    • 3.内存解析
    • 4.匿名对象
  • 三、类的成员:
    • 1.属性
    • 2.方法
    • 3.构造器
    • 4.补充:
  • 四、面向对象特征
    • 1.封装性
    • 2.继承性
    • 3.多态性


比较

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

面向对象:Object Oriented Programming
面向过程:Procedure Oriented Programming


“思想”较为抽象,通常要辅以例子与代码来理解:

一、“面向对象”的核心概念

类(Class)和对象(Object)
类是对一类事物的描述,是抽象的、概念上的定义;
对象是实际存在的该类事物的每个个体,因而也称为
实例(instance)。

在面向对象程序设计中。类的设计是重点,而类的设计就是要设计类的成员。

二、java类和类的成员

1.属性和行为

属 性:对应类中的成员变量
行 为:对应类中的成员方法

Field = 属性 = 成员变量,Method = (成员)方法 = 函数

2.对象的创建和使用

要使用java类(抽象),需要实例化,即创建类的对象:

创建对象语法: 类名 对象名 = new 类名();
使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)


3.内存解析

JavaLearning_4_第1张图片堆(Heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char 、 short 、 int 、 float 、 long 、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。
方法区(Method Area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

就目前类和对象来看:创建的对象在栈里,指向堆空间中对象的地址值,通过“入口”来调用属性和方法。

4.匿名对象

如果我们不定义一个新的对象,而直接调用这个对象的方法:
new.XXX().XXX;
使用情况
如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
我们经常将匿名对象作为实参传递给一个方法调用。

三、类的成员:

1.属性

语法格式:

**修饰符 数据类型 属性名 = 初始化值 ;** 

	 常用的权限修饰符有:private、缺省(default)、protectedpublic 
一般来说,私有和公共的最常用,权限要么最大要么最小
 	其他修饰符:staticfinal 

2.方法

方法的声明格式:

**修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2,.){
		   方法体程序代码
return 返回值;**
其中:
修饰符:public,缺省,private, protected等

没有返回值:void。 
有返回值,声明出返回值的类型。与方法体中“return 返回值”搭配使用

返回值:方法在执行完毕后返还给调用它的程序的数据

如何确定是否需要返回值?

3.构造器

语法格式:

修饰符 类名 (参数列表) {
	初始化语句;

构造器的作用:初始化属性

系统会提供一个默认构造器;但是如果我们自己已经定义了一个构造器后,就不会提供空参构造器,需要自己再创建一个。

4.补充:

在构造器中,我们也设置了一个初始化值;在定义类的属性时,我们有时候也会进行赋值,现指明赋值的顺序

赋值的位置:

① 默认初始化
② 显式初始化
③ 构造器中初始化
④ 通过“对象.属性“或“对象.方法”的方式赋值

靠后的方法会覆盖掉前面赋值的内容

四、面向对象特征

1.封装性

1、隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

2、程序设计追求“高内聚,低耦合”。
 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
 低耦合 :仅对外暴露少量的方法用于使用。

我们不希望出现使用者对类内部定义的属性(对象的成员变量)的直接操作,这样会导致数据的错误、混乱或安全性问题。所以会有private,声明为私有的方法对外不可见。只能通过一些public的set和get方法来进行赋值和获取。

2.继承性

为什么要有继承?

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

类继承语法规则:

class Subclass extends SuperClass{
}
作用:

继承的出现减少了代码冗余,提高了代码的复用性。
继承的出现,更有利于功能的扩展。
继承的出现让类与类之间产生了关系,提供了多态的前提。

注意:继承性不影响封装性,即父类中的私有属性,子类仍然是不能直接访问,还需通过调用公共的方法(如set、get)来获取。但子类是确实继承了父类的这些属性,只是对外不暴露。

3.多态性

多态性,是面向对象中最重要的概念,在Java中的体现:
对象的多态性:父类的引用指向子类的对象

多态性的应用

例如:创建一个Object类、Person,创造一个Person的子类Student
可以写:
Person p1 = new Student();
Object o1 = new Person();
子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向上转型(upcasting)

而如果这样定义,变量就不能访问子类中独有的属性和方法。

作用:

虚拟方法调用(Virtual Method Invocation)
正常的方法调用
Person p1 = new Person();
p1.eat();
Student s1 = new Student();
s1.eat();

而有了多态性后:
1、一个引用类型变量如果声明为父类的类型,但实际引用的是子类
对象,那么该变量就不能再访问子类中添加的属性和方法
Student S1 = new Student();
S1.learn (); //合法,Student类有learn方法
Person P1 = new Student();
e.learn= ??; //非法,Person类没有learn方法

2、方法声明的形参类型为父类类型,可以使用子类的对象作为实参调用该方法
前提:
Person类中定义了eat()方法,各个子类重写了eat()。
执行:
多态的情况下,调用对象的eat()方法,实际执行的是子类重写的方法。

多态作用:

提高了代码的通用性,常称作接口重用
前提:
需要存在继承或者实现关系
有方法的重写
成员方法:
编译时:要查看引用变量所声明的类中是否有所调用的方法。
运行时:调用实际new的对象所属的类中的重写方法。

接触面向对象后,Java也逐渐变得抽象和难以理解起来。我觉得在这段时间应该放慢进度,多敲代码来理解这部分内容。

你可能感兴趣的:(学习计划,java)