目录
Java作为一种广泛使用的编程语言,以其强大的面向对象特性而闻名。面向对象编程(Object-Oriented Programming,简称OOP)是一种软件开发方法,通过将系统中的实体抽象为对象并定义它们之间的关系,以解决复杂问题。
学习面向对象内容的三条主线
- Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类
- 面向对象的特征:封装、继承、多态、(抽象)
- 其他关键字的使用:this、super、package、import、static、final、interface、abstract等
1.面向对象编程概述
面向对象,是软件开发中的一类编程风格、开发范式。除了面向对象,还有面向过程、指令式编程和函数式编程。在所有的编程范式中,我们接触最多的还是面向过程和面向对象两种。
早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的 弊端越来越明显,出现了面向对象思想并成为目前主流的方式。
1、面向过程的程序设计思想(Process-Oriented Programming),简称 POP
- 关注的焦点是过程:过程就是是操作数据的步骤。如果某个过程的实现代码重复出现,那么就可以把这个过程抽取为一个函数。这样就可以大大简化冗余代码,便于维护。
- 典型的语言:C语言
- 代码结构:以函数为组织单位
- 是一种“执行者思维”,适合解决简单问题。扩展能力差,后期维护难度较大
2、面向对象的程序设计思想( Object Oriented Programming),简称 OOP
- 关注的焦点是类:在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽 象出来,用类来表示。
- 典型的语言:Java、C#、C++、Python、Ruby和PHP等
- 代码结构:以 类 为组织单位。每种事物都具备自己的属性和行为(功能)
- 是一种“设计者思维”,适合解决复杂问题。代码扩展性强、可维护性高。
2.Java语言的基本元素:类与对象
2.1 类和对象的概述
类(Class)和对象(Object)是面向对象的核心概念。
类:具有相同特征的事物的抽象类描述,是抽象的、概念上的定义
对象:实际存在的该类食物的每个个体,是具体的,因而也成为实例(instance)。
2.2 类的成员概述
面向对象程序设计的重点是类的设计
类的设计,其实就是类的成员的设计
类,是一组相关属性和行为的集合,这也是类的最基本的两个成员
- 属性:该类事物的状态信息。对应类中的成员变量
成员变量<=>属性<=>Field - 行为:该类食物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法
(成员)方法<=>函数<=>Method - 举例:
2.3 面向对象完成功能的三步骤(重要)
1、类的定义
类的定义使用关键字:class。格式如下:
[修饰符]class 类名{
属性声明;
方法声明;
}
2、对象的创建
创建对象,使用关键词:new
创建对象语法:
//方式1:个创建的对象命名
//把创建的对象用一个引用书类型的变量保存起来,这样可以反复使用这个对象了
类名 对象名=new 类名();
//方式2:
new 类名()//也称为匿名对象
3、对象调用属性或方法
1.对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。
2.使用“对姓名.属性”或“对象名.方法”的方式访问对象成员(包括属性和方法)。
2.4 匿名对象
1、我么也可以不定义对象的句柄,而直接调用这个对象的方法。这样叫做你那个对象。
如:new Person().shout();
2、使用情况:
如果一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
我们经常将匿名对象作为实参传递给一个方法调用
3、对象的内存解析
3.1 JVM内存结构划分
HotSpot Java虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分(Runtime Data Area)。
其中:
堆(Heap):此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一 点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
栈(Stack):是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各 种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类 型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。
方法区(Method Area) :用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的 代码等数据。
3.2 对象内存解析
举例:
class Person{ //类:人
String name;
int age;
boolean isMale;
}
public class PersonTest{
public static void main(String[] args){
Person p1=new Person();
p1.name="赵同学";
p1.age=20;
p1.isMale=ture;
Person p2=new Person();
p2.age=10;
Person p3=p1;
p3.name="郭同学"
}
}
内存解析图:
1、堆:凡是new出来的结构(对象、数组)都放在堆空间中。
2、对象的属性存放在堆空间中。
3、创建一个类的多个对象(比如p1、p2),则每个对象都拥有当前类的一套"副本"(即属 性)。当通过一个对象修改其属性时,不会影响其它对象此属性的值.
4、当声明一个新的变量使用现有的对象进行赋值时(比如p3 = p1),此时并没有在堆空间中创 建新的对象。而是两个变量共同指向了堆空间中同一个对象。当通过一个对象修改属性时, 会影响另外一个对象对此属性的调用。
4.类的成员之一:成员变量(field)
4.1 如何声明成员变量
语法格式:
[修饰符1] class 类名{
[修饰符2] 数据类型 成员变量名 [= 初始化值];
}
说明:
1、位置要求:必须在类中,方法外
2、修饰符2(暂不考虑)
常用的权限修饰符有:private、缺省、protected、public
其他修饰符:static、final
3、数据类型 任何基本数据类型(如int、Boolean) 或 任何引用数据类型。
4、成员变量名
属于标识符,符合命名规则和规范即可。
5、初始化值
根据情况,可以显式赋值;也可以不赋值,使用默认值
4.2成员变量 vs 局部变量
1、变量的分类:成员变量与和局部变量
在方法体外,类体内声明的变量称为成员变量
在方法体内部等位置生命的变量成为局部变量
其中,static可以将成员变量分为两大类,静态变量和非静态变量。其中静态变量又称为类变量, 非静态变量又称为实例变量或者属性。接下来先学习实例变量。
2、成员变量与局部变量的对比
相同点:
1、变量声明的格式相同: 数据类型 变量名 = 初始化值
2、变量必须先声明、后初始化、再使用。
3、变量都有其对应的作用域。只在其作用域内是有效的
不同点:
1、声明位置和方式 (1)实例变量:在类中方法外 (2)局部变量:在方法体{}中或方法的形参列表、代 码块中
2、在内存中存储的位置不同 (1)实例变量:堆 (2)局部变量:栈
3、生命周期 (1)实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消 亡, 而且每一个对象的实例变量是独立的。 (2)局部变量:和方法调用的生命周期一样,每一次方法 被调用而在存在,随着方法执行的结束而消亡, 而且每一次方法调用都是独立。
4、作用域 (1)实例变量:通过对象就可以使用,本类中直接调用,其他类中“对象.实例变量” (2)局 部变量:出了作用域就不能使用
5、修饰符(后面来讲) (1)实例变量:public,protected,private,final,volatile,transient等
(2)局部变 量:final
6、默认值 (1)实例变量:有默认值 (2)局部变量:没有,必须手动初始化。其中的形参比较特殊, 靠实参给它初始化。
3、对象属性的默认初始化赋值
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。
成员变量 | 初始值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
char | 0或写为:‘\u0000’ |
boolean | false |
引用类型 | null |