Java 类的定义和使用
声明规则
当在一个源文件中定义多个类,并且还有 import 语句和 package 语句时,要特别注意这些规则.
- 一个源文件中 只能有一个 public 类
- 一个源文件 可以有多个 非 public 类
- 源文件的名称应该和 public 类的类名保持一致.例如: 源文件中 public 类的类名是 Employee,那么源文件应该命名为 Employee.java.
- 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行.
- 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间.如果没有 package 语句,那么 import 语句应该在源文件中最前面.
- import 语句和 package 语句对源文件中定义的所有类都有效.在同一源文件中,不能给不同的类不同的包声明.
类基础
定义和使用类,是编写 Java 程序的必备
定义类的工作包括
- 定义类的属性(也称为成员变量)
- 定义类的方法
- 定义类的构造方法(也称构造器或者构造函数)
使用类的工作包括
- 基于类创建对象(即访问类的构造器)
- 访问类的属性
- 访问类的方法
成员变量的可见性
定义成员变量时,可以用 private、protected 或者 public 进行修饰,可以控制外部的可见性
public
: 表示任何类都可以直接访问该成员变量private
: 表示任何其他类不能直接访问该成员变量,只有该类自身可以访问protected
: 表示只有该类自身及其子类,以及与该类同一个包的类,可以访问该成员变量- 没有修饰: 表示同一个包的类可以访问该成员变量
方法重载
方法名相同,但是参数不同的现象,称之为 方法重载 .方法的返回值和参数构成了方法的签名.
定义构造器
构造器用于创建对象.构造器类似于普通方法,但是有两个特殊的地方
- 方法名称必须和类名相同
- 不允许定义返回类型
如果你没有定义任何构造器,则编译器会自动帮你生成一个构造器,称之 默认构造器
// 没有显示定义构造器,系统会默认给一个构造器因此我们可以用 new 来调用默认构造器,构造器也可以用`public`和`private`来修饰,用了`private`外部就不能用 new 方法来运行
class Post {
private String title;
private String content;
}
Post post = new Post();
class Post {
private String title;
private String content;
// 构造器重载
// 如果显式定义了构造器后,需要传相应的参数 Post post = new Post();的方法会报错,除非显式增加一个没有参数的构造器
public Post(String title, String content) {
// 如果类的方法或者构造器的参数与自己的成员变量重名的时候,就可以使用 this 来进行区别,但是
this.title = title;
this.content = content;
}
}
Post post = new Post("文章的标题", "文章的内容");
class Post {
private String title;
private String content;
// 第一个构造器
public Post(String title) {
this.title = title;
}
// 第二个构造器
// 在这个构造器中,this(title);这一行代码表示调用第一个构造器. 在构造器比较复杂时,这种方式可以让代码更加简洁
public Post(String title, String content) {
this(title);
this.content = content;
}
}
初始化成员变量
class Post {
// 成员变量可以直接赋值
private String title = "默认标题";
private String content = "默认内容";
// 通过 final 关键字赋值
private String content = initContent();
private final String initContent() {
return "默认内容";
}
// 通过构造块初始化
{
title = "默认标题";
content = "默认内容";
}
}
访问对象属性
类内部通过 this
来访问自身的属性,在外部也可以访通过 对象名.属性名
访问别的类非 private
属性
静态变量和静态方法
静态变量
类的成员变量中,用 static
修饰的变量称为 静态变量 或者 类变量 ,而没有用 static 修饰的变量则是普通变量.
- 普通变量: 创建类的实例就会创建该成员变量的一个拷贝,分配一次内存.由于成员变量是和类的实例绑定的,所以需要 通过对象名进行访问 ,而不能直接通过类名对它进行访问.
- 静态变量: 内存中只有一份,JVM 只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配.由于静态变量属于类,与类的实例无关,因而可以直接 通过类名访问 这类变量.
public class Post {
private String title;
private String content;
public static int count = 0;
public Post(){
count++;
}
}
- title 和 content 是实例成员变量,每个 Post 实例都独立的拥有 title 和 content 属性,修改实例两个变量的值不会対其他实例有影响.
- count 是个静态变量.修改 count 的值时,所有实例的 count 值都会改变.这个例子是每当实例化一个 Post 对象,count 值就会+1
静态方法
static 除了可以修饰成员变量外,还可以修饰方案,表明声明的方法与某个具体实例无关,仅仅是该类的一个公共方法
public class Post {
private String title;
private String content;
private static int count = 0;
public Post(){
count++;
}
public static int getCount(){
return count;
}
}
这里不希望 count 定义为公共属性,如果是公共属性任何地方都可以通过 Post.count++来改变 count 值.只希望在实例化时使 count 值+1.因此可以将 count 声明为 私有变量 .同时又希望能通过 Post 类获取 count 属性,此时可以声明了静态的 getCount
方法,然后通过 类名.静态方法名
访问.
声明 static 方法的限制
- 仅能调用 static 方法和 static 属性
- 不能以任何方式引用 this 或 super: 静态方法可以直接通过类名调用,任何的该类的实例也都可以调用它的静态方法,因此静态方法中不能用 this 和 super 关键字
- 在一个 static 方法中引用任何实例变量都是非法的
静态代码块
类似于静态变量和静态方法,有 static 修饰的代码块称为静态代码块.
它独立于类成员,可以有多个,JVM 加载类的时候会执行静态代码块,如果 static 代码块有多个,JVM 则会按照它们在类中出现的顺序依次执行它们,且每个代码块只能执行一次.可以利用静态代码块可以对一些 static 变量进行赋值.
public class Post {
private String title;
private String content;
// 如果 Post 数量是从数据库中取得的,那么初始化为 1 是不正确的选择,此时可以通过静态代码块在类加载时执行获取数据库中的值
// 加载类的时候会先执行这里的代码
static {
count = 100; //这里假设 100 是从数据库中获取 Post 的数量
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论