文章目录
自定义类
一个java中最简单的标准的类定义形式如下:
class ClassName
{
field1;
field2;
...
constructor1;
constructor2;
...
method1;
method2;
...
一般情况下:
1.我们希望实例域部分全部声明为private,防止外部轻易得到该程序的数据
2.构造器和类名需保持一致,构造器可以有不同的参数列表,可以有多个
3.方法一般为public但是有时候也可以是其他类型,按照需要
构造器
1.构造器与类同名
2.根据参数表不同可以有多个构造器
3.一般都携程public
4.用类创建一个对象时,总是用new操作符,用new创建新的对象的时候,时通过构造器来创建的
5.构造器没有返回值
不同于c++,c++中创建一个新的对象可以不用new操作符
更改器方法和访问器方法
1.更改器方法:调用此方法后,对象的状态会改变,如setName
2.访问器方法:只访问对象而不修改对象的方法
c++中带有const后缀的时访问器方法,其他默认为更改器方法,而java中就不存在这种区别
隐式参数和显式参数
1.隐式参数:出现在方法名前的对象
2.显式参数:位于方法名后面括号中的数值
如:
Empolyee num1 = new Employee();
num1.raiseSalary(5);
num1:隐式参数
5:显式参数
静态(static)
静态域
如果定义了一个整型的id实例域,和一个静态整型的nextId实例域:
则每一个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域
如果有1000个Employee类的对象,则有1000个实例域的id,但是他们只共享一个静态域nextId
在绝大多数面向对象的语言当中,静态域被称为类域
静态常量
静态常量不需要通过类的对象来访问,如math函数当中的PI,
public class Math
{
...
public static final double PI = 3.1415926...;
...
}
可以采用Math.PI的方式的获得这个常量
虽然实例域一般都是private,但是final域可以声明为public,因为常量不可修改
常用的静态常量有PI和System.out
静态方法
静态方法时一种不能向对象实施操作的方法,在调用方法时,没有隐式参数,如Math.pow(x,a)
可以认为**静态方法时没有this参数的方法(在一个非静态的方法中,this参数表示这个方法的隐式参数)
虽然静态方法不能访问该类当中的普通实例域,但是可以访问自身类中的静态域
不需要使用对象就可以调用静态方法
使用静态方法的两种情况:
- 一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(如:Math.pow)
- 一个方法只需要访问类的静态域
工厂方法
构造对象有如下2种方法:
1.用new操作符构造,如LocalDate today = LocalDate.now();
2.不用new操作符构造(静态工厂方法),如Employee num1 = new Employee;
使用静态工厂的原因:
- 无法命名构造器。构造器的名字必须与类名相同。但是NumberFormat希望得到的货币实例和百分比实例采用不同的名字。
- 当使用构造器时,无法改变所构造的对象类型。而工厂方法将返回一个DecimalFormat类对象,这是NumberFormat的子类。
更多内容参看这里:静态工厂方法
方法参数
1.方法参数有2种类型:
- 基本数据类型
- 对象引用
2.java中方法参数的使用情况: - 一个方法不能修改一个基本数据类型的参数
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象
对象构造
java提供的多种编写构造器的机制
重载
重载即:方法名相同,参数表不同
方法签名:方法名以及参数类型
默认域初始化
虽然,在构造器中没有显式的给域赋予初值,那么就会被自动地赋为默认值:数值为0,布尔值为false,对象引用为null。
但是,这不是优良代码的体现,会严重影响可读性
方法中的局部变量必须要初始化,类中的域不初始化会得到默认值,但极度不推荐使用
无参数的构造器
可以构造一个没有任何参数表的构造器
但是,如果在编写一个类的时候没有编写构造器,那么系统就会提供一个无参数构造器,并把所有实例域都设置为默认值放在里面
显式域初始化
- 可以在类定义中,直接将一个值赋给任何域
- 赋的值不一定时常量值,可以时该类中的方法
参数名
1.在编写很小的构造器时,通常参数用单个字符命名,如:
public Employee(String n , double s )
{
name = n;
salary = s;
}
2.或者使用每个参数前加一个前缀a,如
public Employee(String aName , double aSalary)
{
name = aName;
salary = aSalary;
}
3.或者使用隐式参数,这里this调用的name和salary时实例域当中的变量
public Employee(String name , double salary)
{
this.name = name;
this.salary = salary
}
调用另外一个构造器
关键字this引用的方法时隐式参数,但还有另外一个含义
如果构造器的第一个语句形如this(。。。),这个构造器将调用同一个类中的另一个构造器。如:
public Employee(double s)
{
this("Employee1",s)
}
这样对公共的构造器代码只编写一部分就行
初始化块
前面已经讲过初始化数据域的方法:
- 在构造器中设置值
- 在声明中赋值
实际上还有第三种机制,称为初始化块,如:
class Employee
{
private static int nexId;
private int id;
private String name;
private double salary;
//初始化块
{
id = nextId;
nextId ++;
}
public Employee(String n ,double s)
{
name = n;
salary = s;
}
...
在这个示例中,id域在对象初始化块中被初始化。
首先运行初始化块,然后才运行构造器的主体部分
初始化块不常用,建议将初始化块放在域后面