java面向对象基础
面向过程和面向对象
面向过程(Procedure Oriented)和面向对象(Object Oriented,OO)都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显的显示出来,出现了面向对象思想并成为目前主流的方式。两者都贯穿于软件分析、设计和开发各个阶段,对应面向对象就分别称为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)。C语言是一种典型的面向过程语言,Java是一种典型的面向对象语言。
面向过程
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
例如:婚礼筹办
-- 发请柬(选照片、措词、制作)
-- 宴席(场地、找厨师、准备桌椅餐具、计划菜品、购买食材)
-- 婚礼仪式(定婚礼仪式流程、请主持人)
- 公式:程序 = 算法 + 数据结构
- 优点:所有环节、细节自己掌控。
- 缺点:考虑所有细节,工作量大。
面向对象(Object)
思想更契合人的思维模式。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题步骤中的行为
例如:婚礼筹办
-- 发请柬:找摄影公司(拍照片、制作请柬)
-- 宴席:找酒店(告诉对方标准、数量、挑选菜品)
-- 婚礼仪式:找婚庆公司(对方提供司仪、制定流程、提供设备、帮助执行)
为了便于协作,我们找摄影公司完成拍照片、制作请柬的步骤,酒店完成提供桌椅、厨师菜品步骤;这样,发现大家可以同时来筹办这个婚礼,大大提高了效率。但是,具体到酒店给我们提供桌椅、厨师、菜品时 ,仍然是有步骤的,还是离不开面向过程思想!
因此,面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。
我们千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!
面向对象和面向过程的总结
1、都是解决问题的思维方式,都是代码组织的方式。
2、解决简单问题可以使用面向过程
3、解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程。
面向对象思考方式
遇到复杂问题,先从问题中找名词,然后确立这些名词哪些可以作为类,再根据问题需求确定的类的属性和方法,确定类之间的关系。
面向对象具有三大特征:封装性、继承性和多态性,而面向过程没有继承性和多态性,并且面向过程的封装只是封装功能,而面向对象可以封装数据和功能。所以面向对象优势更明显。
一个经典的比喻:面向对象是盖浇饭、面向过程是蛋炒饭。盖浇饭的好处就是“菜”“饭”分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是“可维护性”比较好,“饭” 和“菜”的耦合度比较低。
对象的进化史
对象说白了也是一种数据结构(对数据的管理模式),将数据的属性和行为放到了一起。在内存上,对象就是一个内存块,存放了相关的数据集合!
对象和类的概念
现实世界有很多的对象组成,基于对象抽出了类
对象:真实存在的单个的个体
类:类型/类别,代表一类个体
1.对象是具体的事物;类是对对象的抽象;
2.类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
3.类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共同的属性、行为。
一个文件中可以有多个类 ,public修饰的类只能有一个。早实际的项目中 一个文件一般只有一个类。
包、package关键字、import关键字
包的概念
包机制是Java中管理类的重要手段。 开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理。 包对于类,相当于文件夹对于文件的作用。(同一文件夹下文件名不能重名,即同一包下类名是不能相同的,包括一个java源文件有多个类的情况。)
package关键字
我们是通过package实现对类的管理的
1. package通常是类的第一句非注释性语句。
2. 作用:避免类的命名冲突
3. 包的命名:包名所有字母都小写,域名倒着写即可,再加上模块名,便于内部管理类。
如: com.baidu.test; //test为包名 。 即路径为:工作路径/com/baidu/test
com.sun.test;
import关键字
如果我们要使用其他包的类,那么就需要使用import导入,从而可以在本类中直接通过类名来调用,否则就需要书写类的完整包名和类名。import后,便于编写代码,提高可维护性。
同包中的类可以直接访问,不同包的类不能直接访问,访问时有以下两种访问方式:
1.import 类的全称(包名.类名)//只导入我们要用的类。
import 包名.* //导入全部的类 会大大影响程序执行效率。
2.每次用其他包的类时,就调用这个类的全称 //全称为包名.类名 这种比较繁琐一般不用。
注:Java会默认导入java.lang包下所有的类,因此这些类我们可以直接使用。如果导入两个同名的类,只能用包名+类名,即使用类的全称来显示调用相关类:
静态导入:JDK1.5新增加的功能,其作用是用于导入指定类的静态属性,这样我们可以直接使用静态属性。若不静态导入则使用类的属性或行为时,需要用类名. 的方式来使用静态属性和行为。
用法: import static java.lang.Math.*;//导入Math类的所有静态属性
import static java.lang.Math.PI;//导入Math类的PI属性
java中的修饰符
访问修饰符:public、protected、private
用于修饰类中的成员变量和类中的方法。
1)public //公有的。任何类都可以访问,常用于跨包访问。
2)protected //受保护的。本类、子类、同包类访问
3)啥也不写 //默认的。仅限本类、同包类访问。
4)private //私有的。仅限本类进行访问。
只有public修饰符可以修饰一个类, 其他修饰符包括public都可以修饰属性或成员方法。
public经常用来修饰类中的方法;protected经常用来修饰父类中的属性;private经常用来修饰类中的属性。
在一个类中一般都是数据私有化,行为公开化。//数据指成员变量,行为指方法。
因为成员变量在类中属于特殊的值,一般不允许在外界进行更改。所以一般数都用private修饰,父类时因为要被继承所以用protected修饰。
可以在类内部提供getName()、setName()方法 (name为成员变量),在其方法里面可以通过添加限制条件,来对成员变量进行查看更改
final关键字
单独应用率很低
1.修饰变量时:变量不能被改变。
final修饰成员变量时两种初始化:声明同时初始化、或在构造函数中初始化;final修饰局部变量时,使用之前初始化即可。
2.修饰方法时:方法不能被重写
3.修饰类:类不能被继承
String、Math、Integer、Double都是被定义为final的// 意义在于:可以保护类不会被继承和修改,从而可以避免滥用继承对系统造成危害。
public static final 常量 =0; // 通常这样去声明一个常量,如:static final MAX_VALUE=100; 很像宏变量。
1)必须声明同时初始化。
2)由类名点来访问,不能被改变。因为用到了static,所以它是属于类的只能用类名来访问。
3)建议:常量名所有字母都大写,多个单词用_分开 STUDENT_NAME。
4)编译器在编译时,会将常量直接替换成具体的值;效率会提高,修改起来也很方便。
5)何时用:数据永远不变,并且经常使用,方便管理数据。
static关键字
成员变量(属性)
可以细分为实例变量、静态变量。
实例变量:是在类中声明的,无static修饰;它是属于对象的,存储在堆内存中,即有几个对象就有几份。
静态变量:是在类中声明的,有static修饰;它是属于类的,存储在方法区中,即无论有几个对象它都只有一份。
静态变量、静态方法、静态块
静态变量:
1.有static修饰的,属于类的,存储在方法区中只有一份
2.属于类,存储在方法区中,只有一份
3.常常通过类名点来访问//也可以用对象. 但是并不这么用
4.何时用:所有对象所共享的数据(图片、地图、音频、视频)
静态方法:
1.有static修饰的,属于类的,存储在方法区中只有一份
2.属于类,存储在方法区中,只有一份
3.常常通过类名点来访问//也可以用对象. 但是并不这么用
4.静态方法没有隐式的this传递,所以静态方法不能直接访问实例成员,调用时直接用类名引用。
5.何时用:方法的操作与参数相关与对象无关。
静态方法可以调用静态方法/变量,调用非静态方法 时需要创建一个对象。
非静态方法可以调用非静态方法/变量和静态方法/变量。
静态块:
1.属于类的,在类被加载期间自动执行,发生在构造函数之前;因为类只被加载一次,所以只执行一次。
2.何时用:用于加载/初始化静态资源(如:初始化静态变量)。
语法:
static{ }
private static BufferedImage start;//启动图片
private static BufferedImage pause;
private static BufferedImage gameover;
static {//给静态变量赋值
start = FlyingObject.loadImage("start.png");
pause = FlyingObject.loadImage("pause.png");
gameover = FlyingObject.loadImage("gameover.png");
}
注:static 只能修饰 成员变量或者成员方法。不能修饰局部变量。在Java 中,用static 修饰的成员 被是为 共享的。定义在方法中,被视为局部的。显然是不能共享的。
静态变量时属于整个类的,并不属于某一个对象,即所有对象共享一个静态变量而成员函数只有在创建对象时才能进行引用,如果把静态变量定义在成员函数内,岂不是静态变量归类的某个对象所有?
与C/C++中的static不同,Java中的static关键字不会影响到变量的变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected这几个关键字。
Java修饰词书写顺序
[访问权限] [abstract] [static] [final] [transient] [volatile] [synchronized] [native] [strictfp]