Java 类的定义和使用

发布于 2025-01-06 16:28:24 字数 4757 浏览 0 评论 0

声明规则

当在一个源文件中定义多个类,并且还有 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

梦里南柯

暂无简介

文章
评论
23 人气
更多

推荐作者

梦里南柯

文章 0 评论 0

不将就、

文章 0 评论 0

alipaysp_ZRaVhH1Dn

文章 0 评论 0

故事未完

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文