目录
6-1 面向对象思想
程序设计思路:面向对象OOP与面向过程POP
面向过程:重点在过程,把每一步抽象成函数
面向对象:重点在类,参照现实把所有事物的属性与行为抽象出来,以类为单位
面向对象更适合复杂场景
6-2 类的成员与实例化
Java的基本元素:类与对象
类是抽象的,对象是具体的(也可叫做实例)
对象是类的实例化。
类是一组属性与行为的集合。对应成员变量与成员方法。
面向对象完成的步骤:
1、类的定义:使用class定义。
public class Person{……}
并且在里面设置变量与方法。
2、对象的创建:使用new创建。
类名 对象名 = new 类名();
3、对象调用属性与方法
对象名.成员变量
对象名.方法
后面可以加多个,可能有类的成员变量为类,其自身包含变量与方法
6-3 内存解析与匿名对象
匿名对象:直接调用对象的方法不单独创建有对象名的实例
只能使用一次,后面其他的与本次使用的不会是一个。
只使用方法时常用
eg. new Person().speak();
这里new出来的Person是没有名字的。
内存解析:重点关注Runtime Data Area
堆:new出来的内容,存放对象实例(栈中的类名实际上是地址,地址指向类存储的位置也就是堆里面)
栈:方法内定义的变量,存储局部变量,结束会自动释放
方法区:类的模版,存储类信息、常量、静态变量
6-4 类的成员之一:成员变量
声明:
eg. public class Person{
private int age = 20;
}
修饰符:常用有private、缺省(default)、protected、public
变量包括:成员变量与局部变量
前者在类体内声明,后者在方法体内部声明
二者存储的位置不同:成员变量在堆中,局部变量在栈中
修饰符:成员变量有很多种,局部变量只有final
对于默认值,实例变量有,而局部变量灭有必须手动初始化(必须赋值)
前者的默认值与普通类型相同。
6-5 类的成员之二:方法
声明:
eg. public int getAge{
return this.age;
}
完整的方法 = 方法头 + 方法体
方法修饰符是可选的,有很多种。返回值类型可以是void表示无返回。形参列表,里面属于局部变量。
return后不能接执行语句,return返回给调用的地方(通常为main而不是实例本身)
6-6 类的实例化与内存解析
调用方法时:调用前在字节码文件.class中存储着。调用时进入栈内存,入栈动作开辟一块独立运行的区域。
方法执行结束时:释放内存,出栈。
6-7 对象数组
数组的元素为对象时,称为对象数组。
调用方法、变量时:
数组名[index].方法/变量
默认初始化中,元素均为null。
6-8 方法的重载
同类中,方法名、标识符、返回值一样,但是参数列表不一样(唯一的不同)
顺序不同也算方法的重载,也算不同。
如何判别:其他的全一样,只有参数列表不一样。
6-9 可变个数形参的使用
当传入方法的参数的类型确定,但是数量不确定时使用可变个数形参。
eg. public int a(int b, String...books);
可变个数形参可以用在同名方法中,彼此构成重载。
可变个数形参只能放到参数列表的最后。
一个方法只能声明一个可变个数参数形参。
实际上是用了一个数组来存储着几个形参。
6-10 方法的值传递机制
形参与实参:
形参:定义方法时括号内的。
实参:调用方法时括号内容。
传递方法:值传递(只传递值过去,也就是复制)
6-11 递归方法(难点)
自己调用自己。或者几个方法循环调用。
容易造成栈溢出。(一直在入栈而没有出栈)
6-12 关键字package与import
package:包,指明文件中定义的类、接口等结构所在的包
主要用来写明该代码所在的位置,有助于工程构建
package 顶层包名.子包名;
一个包里面一般有很多java文件(相当于一个集合)
一个源文件只有一个package语句,只能在第一条出现,如果没有则认为是无名包
取名时不要用java.xx
JDK常见的包:java.lang核心类,java.net网络操作,java.io输入输出类,java.util实用工具,java.sql数据库编程
import:为了定义其他包下的类所使用的引入
import 包名.类名;
a.*表示导入所有结构
java.lang会默认导入不用重复写
如果使用不同包的同名类则需要用全类名分清楚(从顶层包开始都要标出)
6-13 面向对象的特征之一:封装性
面向对象开发原则:高内聚,低耦合
封装性:把物体抽象成概念的类,把需要隐藏的内容隐藏,需要暴露的内容暴露(理解)
如何实现?使用权限修饰符。
包括:private、protected、缺省/default、public
每个的访问范围都不同:
private | protected | 缺省 | public | |
本类内部 | √ | √ | √ | √ |
同包下 | × | √ | √ | √ |
其他包下的子类 | × | × | √ | √ |
其他包下的非子类 | × | × | × | √ |
这些也就是封装性的体现
但是修饰类的时候只有public或者缺省,修饰成员变量、方法、构造器、内部类时四种都有
成员变量/属性私有化:用get/set方法
变量设置为私密的,get、set设置为公开的(提供getXXX/setXXX方法)
让用户按要求进行获取与修改变量而不是直接更改。
私有化方法:直接用private
6-14 权限修饰符的使用
如上。
6-15 类的成员之三:构造器
(构造方法)
new完对象时进行,可以直接进行赋值。
构造器格式:
[修饰符] class 类名{
[修饰符] 构造器名(){}
[修饰符] 构造器名(){}
}
构造器名必须与类名相同,无返回值
没有显式构造器时(人为写构造器),会自动创建一个无参空构造器,权限修饰符与类的相同。
如果自己写了构造器则不提供(可以写一个空的加一个自己需要的,写两个构造器)
6-16 属性赋值过程、JavaBean与UML
类创建过程属性赋值顺序:
默认初始化 -> 显式初始化 -> 构造器中初始化 -> 通过属性/方法外部赋值
JavaBean是一个标准的java类(类似模版)
要求:为public,有无参的公共构造器,有属性与对应get、set方法
UML:统一建模语言,描述软件模型与架构的图形语言。
通常看这个图形语言来写代码。
+表示public、-表示private、#表示protected
斜体表示抽象方法或类
方法的写法:方法类型(+、-) 方法名(参数名:参数类型):返回值类型