一、面向对象的基本概念
编程两种思维方式:
(1)面向过程的编程方式根本具体的操作步骤去实现程序
缺点:不通用,只指对一个程序(事情)
不利于维护(不能适应变化)
(2)面向对象的编程方式
解决程序适应变化的能力(可维护性强)降低功能之间的相互依赖
(1)先整体,后局部
(2)先抽象,再具体
(3)能做什么,怎么做
考虑粒度的问题
如何抽象:
考虑事物的共同点(共性)
JAVA 里是:一切皆对象
二、类与对象
对象:一切具体的事物类:同有相同特征(属性)和行为(方法)的事物集合
分类,类别
程序的组织结构就是类
(1)new关键字:表示向内存申请空间,也表示实例化一个对象,
创建一个对象。
(2)一个对象在内存中的大小,由该对象的所有属性所占的内存
大小的总和。引用类型变量在32位系统上占4个字节,在64位
系统上占8个字节。加上而外的对象隐性数据所占的大小。
(2)相同的类型才可以赋值
(3)不同的引用,指向同一个对象,任何一个引用改变对象的值,
其它引用都会反映出来。
(4)编程时要注意的问题,在确定不使用对象时,要尽早释放对象
:引用=null
(5)当一个堆中的对象没有被任何引用变量所指向时,该对象会被
JVM 的 GC 程序认为是垃圾对象,从而被回收。
三、封装性
面向对象的特征是什么:封装、继承、多态、抽象
面向对象的三大特征:封装、继承、多态
封装性:
封装的概念:隐藏实现细节,提供对外访问的接口
好处:
隐藏细节
安全性
模块化
代码重用
插件化易于调试
利于维护
封装:
属性的封装,方法的封装,类的封装,组件的封装,模块化封装
系统级封装
封装缺点:
会影响执行效率
四、构造方法
是在创建对象时自动调用。构造 方法的特点:
(1)构造方法名称与类名相同,没有返回值声明(包括 void)
(2)构造方法用于初始化数据(属性)
(3)每一个类中都会有一个默认的无参的构造方法
(4)如果类中有显示的构造方法,那么默认构造方法将无效
(5)如果有显示的构造方法,还想保留默认构造 方法,需要
显示的写出来。
(6)构造方法可以有多个,但参数不一样,称为构造方法的重载
(7)在构造方法中调用另一个构造方法,使用this(...),该句代码
必须在第一句。
(8)构造方法之间的调用,必须要有出口。
(9)给对象初始化数据可以使用构造方法或setter方法,通常情况
下,两者都会保留。
(10)一个好的编程习惯是要保留默认的构造方法。
(为了方便一些框架代码使用反射来创建对象)
(11)private Dog(){},构造方法私有化,当我们的需求是为了
保正该类只有一个对象时。
什么时候一个类只需要一个对象?比如,工具类
(没有属性的类,只有行为)并且该工具
对象被频繁使用。权衡只用一个对象与产生多个对象的内存
使用,来确定该类是否要定义为只需要一个对象。
//操作文件
public class FileUtils{
private FileUtils(){}
public void save(){
//..
}
public void read(){
//...
}
}
FileUtils fu = new FileUtils();
fu.save();
fu.read();
//FileUtils fu = new FileUtils();
fu.save();
fu.read();
//FileUtils fu = new FileUtils();
fu.save();
fu.read();
五、方法的重载(overloading)
方法的重载是发生在同一个类中,多个方法,方法名相同,参数列表不同,返回值不能作为重载的条件
什么时候用重载?
当我们的业务类型类似,参数不一样,就可以使用重载,比如:
public void save(String path){} //把数据保存到文件中
public void save(Cat cat){}//把对象保存到数据库中
//public boolean save(Cat cat){}
六、String类
(1)String类的两种赋值方式:
1、String s1 = "小黄";
2、String s2 = new String("小黄");
直接赋值:检查字符串中的常量池(堆内存)是否存在该对象,如果存在,则直接指向
该对象,如果不存在,就在常量池中创建并指向该对象。(最少不用创建
对象,最多只创建一个对象)
使用new关键字:在堆内存中创建一个字符串对象,并指向该对象,然后检查常量池中
是否存在该字符串对象,如果存在,则结束;如果不存在,就在常量池中创建一个
字符串对象,以供其它直接赋值时使用。(最少创建一个对象,最多创建两个对象)
在 JAVA 中,我们推荐使用直接赋值的方式,有助于节省内存空间。
面试题:String s2 = new String("abc"); 创建了几个对象?
String类真正用于存储数据是使用char[]
在 String字符串相加时,是在常量池中创建对象还是在堆中创建新对象?
如果字符串的值在编译期可以被确定,那么会在常量池中创建
否则在运行期时在堆中创建对象
结论:
字符串常量相加,不会产生垃圾对象
字符串与变量相加,加的越多,垃圾对象越多
String s = "6"+ "abc" + "b" +"677" + "x";