Java的面向对象
01-面向对象基础-1
2021-06-01 116 2
简介 主要介绍Java语言中面向对象学习的主线,面向过程和面向对象的区别,类和对象是使用说明,对象的内存解析,属性和局部变量的区别,类中方法的使用。
1. 面向对象的主线
Java面向对象学习的三条主线:
1.Java类及类的成员:属性、方法、构造器;代码块、内部类
2.面向对象的三大特征:封装性、继承性、多态性、(抽象性)
3.其它关键字:this、super、static、final、abstract、interface、package、import等
学习的方法:
大处着眼,小处着手,先把知识学厚,然后一点点的变薄,一点点消化。
2. 面向过程和面向对象
面向过程(POP) 与 面向对象(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。
面向过程, 强调的是功能行为,以函数为最小单位,考虑怎么做,考虑做事情自上而下的流程。
面向对象,将功能封装进对象, 强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
面向对象的三大特征
封装 (Encapsulation)
继承 (Inheritance)
多态 (Polymorphism)
面向对象: Object Oriented Programming
面向过程: Procedure Oriented Programming
3.面向对象思想的理解
程序员从面向过程的执行者转化成了面向对象的指挥者
面向对象分析方法分析问题的思路和步骤:
根据问题需要,选择问题所针对的现实世界中的实体。
从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
把抽象的实体用计算机语言进行描述, 形成计算机世界中类的定义。即借助某种程序
语言,把类构造成计算机能够识别和处理的数据结构。
将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
类(Class)和对象(Object)是面向对象的核心概念。
类是对一类事物的描述,是抽象的、概念上的定义
对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
“万事万物皆对象”
可以理解为: 类 = 抽象概念的人; 对象 = 实实在在的某个人
面向对象程序设计的重点是类的设计
类的设计, 其实就是类的成员的设计
属 性:对应类中的成员变量 field (字段、 域)
行 为:对应类中的成员方法 method
创建类的对象 = 类的实例化 = 实例化类
4. 类和对象的使用
面向对象思想落地的实现
1. 创建类,设计类的成员
2. 创建类的对象
3. .通过“对象.属性”或“对象.方法”调用对象的结构
如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。
//PersonTest.java package com.ylaihui.oop1; public class PersonTest { public static void main(String[] args) { Person p1 = new Person(); p1.name = "John"; p1.age = 22; p1.talk("中文"); } } // 设计类 class Person{ String name; int age; boolean isMale; public void eat() { System.out.println("人吃..."); } public void talk(String language) { System.out.println("人使用" + language + "交流"); } }
//PersonTest2.java package com.ylaihui.oop1; public class PersonTest2 { public static void main(String[] args) { Person p1 = new Person(); p1.name = "John"; p1.age = 22; p1.talk("中文"); // 将 p1 地址值赋值给 p2, p1 和 p2 指向了堆空间的同一个内存区域 Person p2 = p1; p1.name = "Londy"; System.out.println(p2.name); } }
5. JVM内存结构初步介绍
首先介绍下两个比较常见的名词: 虚拟机栈和堆
虚拟机栈就是我们所说的栈,存放局部变量(方法中的定义的变量都是局部变量,方法的形参等也是局部变量)
堆 存放对象实例,存放 new出来的结构
首先介绍下两个比较常见的名词: 虚拟机栈和堆
虚拟机栈 就是我们所说的栈,存放局部变量(方法中的定义的变量都是局部变量,方法的形参等也是局部变量)
堆 存放对象实例,存放 new出来的结构
堆(Heap Area) , 此内存区域的目的就是存放对象实例, 几乎所有的对象实例都在这里分配内存。 这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
虚拟机栈(Java Stack) ,虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、 byte、char 、 short 、 int 、 float 、 long 、double) 、 对象引用(reference类型它不等同于对象本身, 是对象在堆内存的首地址) 。 方法执行完, 自动弹出栈空间。
方法区(Method Area) , 用于存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器译后的代码等数据。
6. 对象的内存解析
7. 类中属性和局部变量
属性(成员变量) vs 局部变量
1.相同点:
1.1 定义变量的格式:数据类型 变量名 = 变量值
1.2 先声明,后使用
1.3 变量都有其对应的作用域
2.不同点:
2.1 在类中声明的位置的不同
属性:直接定义在类的一对{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量(构造器也可看做是方法)
2.2 关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符。
常用的权限修饰符:private、public、缺省、protected --->封装性
目前,大家声明属性时,都使用缺省就可以了。
局部变量:不可以使用权限修饰符。
2.3 默认初始化值的情况:
属性:类的属性,根据其类型,都有默认初始化值。---- 与数组的默认初始化值一样
整型(byte、short、int、long):0
浮点型(float、double):0.0
字符型(char):0 (或'\u0000')
布尔型(boolean):false
引用数据类型(类、数组、接口):null
局部变量:没有默认初始化值。
意味着,我们在调用局部变量之前,一定要显式赋值。 一定要初始化
特别地:形参在调用时,我们赋值即可。
2.4 在内存中加载的位置:
属性:加载到堆空间中 (非static的属性)
局部变量:加载到栈空间
8 类中方法的使用
方法:描述类应该具有的功能。
比如:Math类:sqrt()\random() \...
Scanner类:nextXxx() ...
Arrays类:sort() \ binarySearch() \ toString() \ equals() \ ...
1.举例:
public void eat(){}
public void sleep(int hour){}
public String getName(){}
public String getNation(String nation){}
2. 方法的声明:
权限修饰符 返回值类型 方法名(形参列表){
方法体
}
特例:
> 形参列表 可以1个或多个
>static、final、abstract 来修饰的方法,之后详细介绍
3. 说明:
3.1 关于权限修饰符:默认方法的权限修饰符先都使用public
Java规定的4种权限修饰符:private、public、缺省、protected -->面向对象的封装性
3.2 返回值类型: 有返回值 vs 没有返回值
3.2.1 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用
return关键字来返回指定类型的变量或常量:“return 数据”。
如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不需要
使用return.但是,如果使用的话,只能“return;”表示结束此方法的意思。
3.2.2 我们定义方法该不该有返回值?
① 方法的功能要求
② 凭经验:具体问题具体分析
3.3 方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
3.4 形参列表: 方法可以声明0个,1个,或多个形参,还支持可变参数的形参。
3.4.1 格式:数据类型1 形参1,数据类型2 形参2,...
3.4.2 我们定义方法时,该不该定义形参?
① 方法的功能要求
② 凭经验:具体问题具体分析
3.5 方法体:方法功能的实现。
4.return关键字的使用:
1.使用范围:使用在方法体中
2.作用:
① 结束方法
② 针对于有返回值类型的方法,使用"return 数据"方法返回所要的数据。
③.注意点:return关键字后面不可以声明执行语句。 与之前介绍的 break continue关键字类似
5. 方法的使用中,可以使用当前类的属性或方法
特殊的:方法A中又调用了方法A:递归调用
方法中,不可以定义方法。
//CustomerTest.java package com.ylaihui.oop1; public class CustomerTest { public static void main(String[] args) { Customer cust = new Customer(); System.out.println(cust.getName()); } } class Customer{ String name; int age; boolean isMale; public void eat(){ System.out.println("Customer eat!"); } public String getName() { return name; } }
思考题
1. 面向对象思想编程内容的三条主线分别是什么
2. 谈谈你对面向对象中类和对象的理解,并指出二者的关系?
3. 面向对象思想的体现一:类和对象的创建和执行操作有哪三步?
4. 画出如下代码在执行时的内存分配情况
class Car{
String color = "red";
int num = 4;
void show(){
int a = 10;
System.out.println("color="+color+",num="+num);
}
}
class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car();
c1.color = "blue";
c1.show();
c2.show();
} }
5. 类的方法内是否可以定义变量?是否可以调用属性?是否可以定义方法?是否可以调用方法?
答案:
1. 面向对象思想编程内容的三条主线分别是什么
① 类及类的成员:属性、方法、构造器;代码块、内部类
② 面向对象的三大特征:封装、继承、多态
③ 其它关键字:this,super,abstract,interface,static,final,package,import
学习的过程总结:什么是面向对象的编程思想?
2. 谈谈你对面向对象中类和对象的理解,并指出二者的关系?
类:抽象的、概念上的内容
对象:实实在在存在的一个个体,new出来的结构
对象是由类派生出来的
3. 面向对象思想的体现一:类和对象的创建和执行操作有哪三步?
① 创建类
② 类的实例化
③ 调用对象的结构:”对象.属性” “对象.方法”
4. 画出如下代码在执行时的内存分配情况
5. 类的方法内是否可以定义变量?是否可以调用属性?是否可以定义方法?是否可以调用方法?
是;是;否;是