类是对一类事物描述,是抽象的、概念上的定义。是具有相同特性和行为的对象集合。
对象是实际存在的该类事物的每个个体,因而也称实例(instance)。
即我们定义的class是类,而根据类new出来的则是对象。
类的组成
- 属性 Field
- 方法 Method
- 构造器 Constructor
- 代码块 Block
- 内部类 Inner Class
举例:
public class ExampleClazz {
/**
* 类属性(成员变量)
*/
private int age;
/**
* 类属性(成员变量)
*/
String name;
static {
System.out.println("静态代码块");
}
/**
* 构造器
*/
public ExampleClazz() {
}
public void hello() {
System.out.println("类方法");
}
/**
* 内部类
*/
class InnerClazz {
/**
* 内部类属性
*/
private int innerAge;
/**
* 内部类属性
*/
private String innerName;
public void hello() {
System.out.println("内部类方法");
}
}
}
属性
类的属性,即类的成员变量。下我们讲下类成员变量与局部变量的异同。
相同点:
1、都遵循变量声明的格式:数据类型 变量名 = 初始化值;
2、都有作用域。
不同点:
1、声明的位置不同:
成员变量:声明在类中,方法外。
局部变量:方法内、方法形参内、代码块内。
2、修饰符不同:
成员变量有四个修饰符:public、protected、private、缺省。
局部变量没有修饰符:只作用在方法内或代码块内。
修饰符 | 当前类 | 当前包 | 子类 | 当前工程 |
---|---|---|---|---|
private | yes | |||
缺省 | yes | yes | ||
protected | yes | yes | yes | |
public | yes | yes | yes | yes |
对于类(class)来说,修饰符只有public和default(缺省)。public可以在同一工程中任何地方被调用。而default只能被同一包下的类调用。
3、初始化值不同:
成员变量:如果在声明时不显式赋值,那么成员变量会有一个默认值,这个值根据变量的类型来决定。比如int为0,String为null(可参见java基础一)。
局部变量:一定要显式地给赋值,否则会编译不通过。
4、内存中存放地址不同:
成员变量:堆空间中。
局部变量:栈空间中。
方法
类方法需要注意的就是方法的重载。两个方法重载需要满足以下几点:
1、在同一个类中;
2、方法名相同;
3、参数类型不同或者参数个数不同。
PS:方法是否重载与方法的返回参数无关。
public void hello() {
System.out.println("无参数");
}
public void hello(int age) {
System.out.println("单个参数");
}
public void hello(String name, int age) {
System.out.println("两个参数");
}
public void hello(int age, String name) {
System.out.println("不同类型参数位置不同");
}
构造器
如果我们在使用关键字new创建对象的时候就需要对对象的一些属性进行赋值或者其它复杂的操作,就可以在构造器中进行。
构造器的格式:
修饰符 类名(选传参数列表) {
// code
}
1、不能被static、final、synchronized、abstract、native修饰,构造器默认的修饰符与所属类的修饰符一致。
2、它不声明返回值类型(与声明为void不同),即不能有return语句返回值。
3、定义类的时候,如果不写构造器,系统会默认给我们提供一个无参的构造器(代码编译之后可在.class文件中看见)。但是如果我们显示的声明了构造器,系统则不再提供默认的构造器。
4、一个类可以创建多个重载的构造器(即构造器的形参类型或数量不同)。
5、父类的构造器不可被子类继承。
6、如果全是静态方法的工具类,可以手动创建一个使用private关键字修饰的无参构造器,这样在使用工具类方法时,系统不会创建一个工具类对象,节省内存空间。