面向对象程序设计概述
类
- 类的封装关键在于,绝对不能让类中的方法直接访问其他类的实例字段。程序只能通过对象的方法与对象进行交互,给对象赋予了“黑盒”特征,是提高重用性和可靠性的关键。
对象
对象的3个特性:行为,状态,标识
- 行为:对象可以提供的操作和被调用的方法
- 状态:每个对象都保存着描述当前状况的信息。对象的状态必须通过调用方法实现(如果不经过方法调用就可以改变对象状态,只能说明破坏了封装性)
- 标识:每个对象都有一个唯一的标识,作为同一个类的实例,每个对象的标识总是不同的,状态也往往存在着差异。
对象的关键特性会彼此相互影响。
类之间的关系
类之间的关系有:依赖(usea-a),聚合(has-a),继承(is-a)
- 依赖:一个类的方法使用或操作另一个类的对象,就说一个类依赖于宁一个类。应该经可能将相互依赖的类减至最少。(如果类A不知道B的存在,它就不会关心B的任何改变,意味着B的改变不会导致A产生任何BUG,尽可能减少类之间的耦合)
- 聚合:类A的对象包含类B的对象。
- 继承:一个更特殊的类与一个更一般的类之间的关系。
##使用预定义类
java预定义类可以直接使用而不不必了解它具体是如何实现的,只需要知道方法名和参数。
对象与变量
- 想使用对象,必须先构造对象(构造器名字应与类名相同),并指定其初始状态。然后对对象应用方法。
更改器方法与访问器方法
- 更改器方法:调用对象的方法后,对象的状态会改变。
- 访问器方法:调用对象的方法后,只访问对象而不改变其状态。
用户自定义类
- 一个源文件中只能由一个公共类,但可以由任意数目的非公共类。
关于类属性(实例字段)
- 实例字段即对象属性强烈建议用private修饰,不建议用public修饰。 public修饰的字段允许程序中的任何方法对其进行读取和修改,完全破坏了封装。
构造器
- 总是用new运算符来调用,不能对已存在的对象调用构造器来达到重新设置实例字段的目的。
- 不能在构造器中定义与实例字段相同的局部变量
//该构造器申明了局部变量name和salary。这些变量会遮蔽同名的实例字段。
public Employee(String n,double s,. . .)
{
String name =n ; //ERROR
double salary =s ; //ERROR
}
var声明局部变量
- 从java10开始,如果可以从变量的初始值推导出它们的类型,那么可以用 var 关键字声明局部变量,而无须指定类型。
var 关键字只适用于方法中的局部变量。参数和字段的类型必须声明。
var harry =new Employee("Harry Hacker",50000,1989.10,1)
封装的优点
public String getName(){
return name;
}
public double getSalary(){
return salsry;
}
public void raiseSalary(double byPercent){
double raise=salary * byPercent / 100 ;
salary += raise;
}
public LocalDate getHireDay(){
return hireDay;
}
该段代码name,salary,hireDay字段为private。这样设置可以确保name只能在构造器中设置,一旦确定就无法更改,不会收到外界的破坏。
salary只能通过raiseSalary方法修改。一旦这个值出现错误只需要调试这个方法就可以了。 如果salary字段是public,则破坏这个字段的值可能会出现在任何地方
- 优点:
1.可以改变累内部实现,而除了该类的方法之外,不会影响其他代码。
2.可以通过get和set方法检查对象是否有错误。
私有方法
private方法作用:
- 将一个计算代码分解成若干个独立的辅助方法。而这些赋值方法不应该称为公共接口的一部分
- 只要方法是private,就可以确定除了该类外不会在别的地方使用,可以将其删除。而public方法是公用的不能简单地将其删除。
final实例字段
- 将实例字段定义为final。
- final修饰符对于类型为基本类型或者不可变的字段尤其有用(String)。
- final修饰可变的类可能会造成混乱(StringBuilder)。
静态字段和静态方法
被static修饰符修饰
静态字段
- 将一个字段定义为static,每个类只有一个这样的字段。(该处指的是改类实例化的改字段的值都相同,而不是一个类只能有一个static字段)。
而非静态字段可以有多个副本,所以访问非静态字段必须通过类的对象来访问,静态字段可以通过类直接访问,不需要通过类对象副本
在一些面向对象的语言中,静态字段被称为类字段。术语“静态”沿用了C++的叫法,并无实际意义。
// 静态字段可以修改,为了安全必须要修饰private
private static int nextId=1;
// 静态常量不可修改,可以修饰为public
pubic static final double PI=3.141592654;
静态方法
- 将一个方法修饰为static,静态方法是不在类对象上执行的方法, 故静态方法不能访问实例字段,但可以访问静态字段
- 静态方法可以通过2种方法访问:
1.通过类调用静态方法(建议使用)
2.通过类对象调用静态方法(不建议使用,因为静态方法只与类相关,而与类实例无关) - 方法不需要访问对象状态,方法只需要访问类的静态字段时可以将方法定义为静态字段。
- 静态方法可以与工厂方法一起使用,静态工厂方法用来构造对象(java的类LocalDate,NumberFormat)。
main方法
- 每一个类都可以有一个main方法,static main方法可以直接调用而不需要类或者类对象。main方法不对任何类对象进行操作,静态的main方法将执行并构造程序所需的对象。
方法参数
传递参数方法:直接调用和按引用调用。
- 直接调用:方法接收的是调用者提供的值。 java总是采用按值调用,方法得到的是所有参数值的一个副本,即方法不能修改传递给它的任何参数变量的内容。
- 按引用调用:方法接收的是调用者提供的变量地址。
- java程序设计语言对对象采用的不是按引用调用,对象引用是按值传递的。java中对方法参数可以做到如下:
1.方法不能修改基本数据类型的参数。(即数值型或布尔型)。
2.方法可以改变对象参数的状态。
3.方法不能让一个对象参数引用一个新的对象。
对象构造
重载
- 有些类会有多个构造器,功能叫做重载,查找匹配的过程被称为重载解析。
java允许重载任何方法,而不只是构造器方法
默认字段初始化
- 构造器中没有显式初始化则会被自动地赋为默认值,
1.数值为0
2.Boolean值为false
3.对象引用为null
无参构造器
- 如果没有编写构造器,则java自动提供无参构造器,实例字段为默认值。
- 如果提供了至少一个构造器,但没有提供无参构造数的构造器,那么构造对象时如果不提供参数则不合法。
显示字段初始化
- 如果一个类的所有构造器都希望把某个特定的实例字段设置为同一个值,这个语法就比较有用
调用另一个构造器
- 如果构造器的第一个语句形如this(...),这个构造器将调用同一个类的另一个构造器,这样公共的构造器代码只需要编写一次即可。
初始化块
- 为了避免循环定义,不允许读取在后面初始化的字段。建议将初始化块放在字段定义之后。
包
包(package)将类组织在一个集合中。
包名
- 为了保证包名的绝对唯一性,使用一个因特网域名以逆序的形式作为包名,然后对于不同的工程使用不同的子包。
- 从编译器的角度看,嵌套的包之间没有任何关系。例如java.util与java.util.jar包毫无关系,每一个包都是独立的类集合。
类的导入
- 一个类可以使用所属包中的所有类。 **只能使用星号()导入一个包,而不能使用import java.或import java..导入以java为前缀的所有包。
只能使用星号(*)导入一个包,
而不能使用import java.*或import java.*.*导入以java为前缀的所有包。
静态导入
- import允许导入静态方法和静态字段,而不只是类。
//就可以使用System的静态方法和静态字段,而不必添加类名的前缀
import static java.lang.System.*
out.println("Goodbye,World!");
JAR文件
- 将应用程序打包时,可以向用户提供一个单独的文件,java归档jar文件就是为此母的而设计的。jar文件是使用zip格式压缩的。一个jar文件既可以包含类文件,也可以包含诸如图像和声音等其他类型的文件。
类设计技巧
- 一定要保证数据私有、
- 一定要对数据进行初始化
- 不要在类中使用过多的基本类型
- 不是所有的字段都需要单独的字段访问器和字段更改器
- 分解有过多职责的类
- 类名和方法名要能够体现它们的职责
- 优先使用不可变的类
Comments | 0 条评论