07.如何定义类
编写Java程序,简言之就是两件事情:
- 定义类
- 使用类
定义类的工作包括:
- 定义类的属性(也称为成员变量)
- 定义类的方法
- 定义类的构造方法(也称构造器或者构造函数)
使用类的工作包括:
- 基于类创建对象(即访问类的构造器)
- 访问类的属性
- 访问类的方法
定义类
提高
关于类和Java文件的关系:
- 一般情况下,都是一个类一个
.java文件 - 如果一个
.java文件里有多个类,只可能有一个public的类,而且文件名必须和public类同名 ,但是有几个类就会生成几个class - 如果文件里所有类都不是
public的,那么文件名和任意一个类同名即可
定义成员变量
private:表示任何其他类不能直接访问该成员变量,只有该类自身可以访问protected:表示只有该类自身及其子类可以访问该成员变量public:表示任何类都可以直接访问该成员变量- 没有修饰:表示同一个包的类可以访问该成员变量
成员变量的类型:成员变量的类型可以是基本类型,也可以是引用类型(如数组、字符串类型)。
汽车引擎可以用一个类来定义,可以让一辆汽车拥有一个引擎:
1 class Car { 2 private int speed; 3 private int color; 4 private Engine engine; 5 }
speed是基本类型的成员变量,而Engine是表示引擎的类,所以engine是引用类型的变量。
注意成员变量的命名通常首字母小写,使用驼峰形式。
方法:规则同上。
方法声明了返回类型,即该方法需要返回一个返回值,就必须要有return。
方法重载
方法的返回值和参数构成了方法的签名。
方法名相同,但是参数不同的现象,称之为方法重载。
参数一样,返回类型不同不叫重载,叫错误。
默认构造器
构造器用于创建对象。构造器类似于普通方法,但是有两个特殊的地方:
- 方法名称必须和类名相同
- 不允许定义返回类型
如果你没有定义任何构造器,则编译器会自动帮你生成一个构造器,称之默认构造器。
默认构造器不包含任何参数,会自动调用其父类的无参数构造器。因此如果父类没有无参数的构造器,会发生编译错误。
构造器也可以使用public和private 修饰。如果使用private修饰,则外部不能通过new操作创建该类的实例。(封装了类,不可被外部创建的方法就这个)
如果自行定义了构造器,则编译器就不再会为我们生成默认构造器,如果再使用无参数的方式创建类就会出错。除非你显示得增加默认构造器public Post() { }
定义构造器
默认构造器
构造器用于创建对象。构造器类似于普通方法,但是有两个特殊的地方:
- 方法名称必须和类名相同
- 不允许定义返回类型
如果你没有定义任何构造器,则编译器会自动帮你生成一个构造器,称之默认构造器。
默认构造器不包含任何参数,会自动调用其父类的无参数构造器。因此如果父类没有无参数的构造器,会发生编译错误。
回顾此前Post类的定义:
class Post {
private String title;
private String content;
}
因为没有显式定义构造器,所以编译器会帮我们生成默认构造器。因此我们可以使用new操作符来调用默认构造器,例如:
Post post = new Post();
构造器也可以使用public和private 修饰。如果使用private修饰,则外部不能通过new操作创建该类的实例。
构造器重载
我们也可以定义有参数的构造器,即构造器也是可以重载的。比如:
class Post {
private String title;
private String content;
public Post(String title, String content) {
this.title = title;
this.content = content;
}
}
这里构造函数具有两个参数。this表示的是当前对象,表示将参数title和content赋给自己对应的成员变量。
用这个构造器来创建对象,则需要传入表示文章标题和内容的两个参数,形式如下:
Post post = new Post("文章的标题", "文章的内容");
如果自行定义了构造器,则编译器就不再会为我们生成默认构造器,针对以上Post代码,通过Post post = new Post();来创建Post对象将会产生编译错误,除非你显式地增加默认构造器:
class Post {
private String title;
private String content;
public Post() {
}
public Post(String title, String content) {
this.title = title;
this.content = content;
}
}
提示
如果一个类的方法或者构造器中的参数与自己的成员变量重名的时候,就可以使用this来进行区别。其它大部分情况下,实际上并不需要使用this。
比如下面的代码中:
class Post {
private String title;
private String content;
public print() {
System.out.println(this.title);
System.out.println(this.content);
}
}
print()方法内部使用this和不使用是完全一样的。
使用this访问构造器
当一个类有多个构造器时,一个构造器调用另外一个构造器,可以使用this。
class Post { private String title; private String content; // 第一个构造器 public Post(String title) { this.title = title; } // 第二个构造器 public Post(String title, String content) { this(title); this.content = content; } }
在第二个构造器中,this(title);这一行代码表示调用第一个构造器。 在构造器比较复杂时,这种方式可以让代码更加简洁。
浙公网安备 33010602011771号