一、面向对象程序设计的概述
面向对象编程OOP(Object oriented Programming),在java中,一切皆对象,与面向过程对比来说,面向过程是对一条条的语句编程,每一步都需要很清楚,编写起来非常复杂。
面向对象则是由对象组成的,在编写程序的过程中,只要对象能够满足要求,就不必关心其功能的具体实现过程。不必担心对象的具体实现,只要能满足用户的需求即可。
1、类
类是构造对象的模板或者版图,由类构造的对象称之为类的实例。
类之间关系有
①依赖:在一个类中引用了另一个类
②聚合:类A的对象包含类B的对象
③继承:类B继承类A,则类B拥有类A中所有的属性和方法。
2、对象与对象变量
new Date()//表示构造了一个新对象
Date a = new Date()// a就是对象变量
一个对象变量并没有实际包含这个对象,仅仅是引用了这个对象。
3、更改器和访问器
set和get方法分别用于构造和访问
三、用户自定义类
源文件名必须与public类的名字相匹配,这是因为在一个源文件中,只能有一个公有类,公有类太多会导致虚拟机找不到入口,但是可以由任意数目的非公有类。
1、构造器
构造器要与类同名
每个类可以由一个以上的构造器、构造器可以由0、1或者多个参数
构造器没有返回值
构造器总是伴随着new操作一起调用
2、隐式参数和显式参数
隐式参数是出现在方法名前的类的对象,显示参数就是括号内的参数
在每一个方法中,关键字this表示隐式参数。
4、封装
为了获得设置实例域的值,需要有一个私有的数据域、一个公用的域访问器方法,一个公有的域更改器方法。
一个方法可以访问所属类的所有对象的私有数据。
为什么需要将实例域(类变量)设置为私有的?
将属性设为私有的,为 类内部可见,即该类的方法才可直接调用,如果不开放get,set方法,则即使实例化了该类的对象,也是不可调用到这个属性的,而将属性设为公有的,只要实例化了该类的对象,既可通过该对象调用此属性。一般只在类中使用的变量或者不想被外部调用的变量设为私有
5、final实例域
private final String name;
在对象被构建之后,被final修饰的类变量不可在修改,不可修改的是对象的引用,对象内的值可以改变。
四、静态域与静态方法
1、静态域
private static int nextId = 1;
被static修饰的类变量称为静态域,对于所在类的每一个对象对这个静态域都有自己的一份拷贝,且各个对象之间是共享的,任何对象通过方法对其可以修改(通过反射修改)。
这个域属于类,不属于任何对象。
2、静态常量
private static final int nextId = 1;
被static和final修饰的类变量称为静态常量。静态常量被所有对象共享且一旦被初始化就不可被修改。
System.out就是一个静态常量。
静态常量修改一处,全处可用。
修改静态常量:通过本地方法可绕过JAVA语言的存储控制机制。
3、静态方法
public static int getNextId(){
}
静态方法除访问自身类的实例域外,不能访问本类的其它实例域(因为不能操作对象)。
静态方法可以调用静态方法。
非静态方法即可调用静态方法,也可调用非静态方法。
静态方法是一种不能向对象操作的方法(可以认为没有this参数的方法)
类名.静态方法
4、main方法
main方法被任何对象操作,Main方法是程序的起点,当JVM运行这个程序的时候,首先会调用Main方法,调用时不实例化这个类的对象,而是通过类名(类.main()),因此需要限制为public static, main方法将执行并创建程序所需要的对象。
五、方法参数
程序设计语言中将参数传递的方法有值调用和引用调用两种方法。
java中的方法参数传递的方式有以下三种情况来使用值调用和引用调用。
1、基本数据类型参数的传递采用值调用。(即不能修改一个基本数据类型的参数)
2、一个方法可以改变对象参数的状态(引用调用)
可以通过对象本身的方法法修改对象的状态。
3、一个方法不能让对象参数引用另一个对象。
六、对象构造
java提供了多种编写构造器的机制
1、重载
多个方法名相同,参数的个数、数据类型不同,Java允许重载任何方法,而不只是构造器方法。
2、默认域初始化
如果在构造器中没有显示地给赋予初始值,那么就会被自动的赋予默认值,如0,true/false,null
3、无参数构造器
如果在编写一个类时没有编写构造器,那么系统就会提供一个无参数的构造器,这个构造器将所有的实例域设置为默认值。
4、显示域初始化
保证构造器中含有由意义的参数
5、参数名
构造器中的参数名可以和域变量相同
String name;
Double salary;
Public Employee(String name,Double Salary){
this.name=name;
this.Salary=Salary;
}
七.在构造器中调用另一个构造器
八、初始化块
代码块和静态代码块。
在构造器构造对象时,首先运行初始化块,然后才运行构造器中的主体部分。
Note:初始化语句调用顺序
①静态变量、静态块
②成员变量、普通方法块
③构造方法
静态变量的声明、静态块的执行顺序与定义的顺序有关
成员变量的声明、普通方法块的执行顺序与定义的顺序有关。
九、类设计技巧
1、一定要保证数据的私有
2、一定要对数据初始化
3、不要在类中使用过多的基本类型
4、不是所有的域都需要独立的域访问器和域构造器
5、将职责过多的类进行分解
6、类名和方法名要能够体现它们的职责
7、优先使用不可变类。