类的构成
类是由成员变量(也称为“属性”)和成员方法(也称为“行为”)构成的。
类中不能有其他语句,语句必须放在成员方法中。
类和对象有什么区别呢?
-类是抽象的概念,仅仅是模板,比如说:“人”
-对象(类的实例)是一个你能够看得到、摸得着的具体实体,比如:“小布什”
一、方法
在Java中,类方法(也称为静态方法)是使用static关键字修饰的方法。它们与类本身相关联,而不是与类的实例相关联。在类加载的时候,类方法就已经存在,可以直接通过类名调用,无需实例化对象。类方法通常用于执行与类相关的操作,例如工具类中的一些公共方法,或者用于返回特定类的实例。
类方法中不能使用this关键词。
this
关键字在Java中用于引用当前对象的实例,但静态方法是与类关联的,而不是与类的任何特定实例关联的。当你尝试在静态方法中使用
this
关键字时,编译器会报错,因为它不知道this
应该引用哪个实例,因为静态方法可以在没有创建类的任何实例的情况下被调用。
除了类方法之外,Java中还有其他类型的方法,主要包括:
- 实例方法(Instance Method):实例方法属于类的实例,可以访问类的实例变量和实例方法。在方法内部可以使用关键字this来引用当前对象。实例方法可以通过对象来调用。也称对象方法。
- 抽象方法(Abstract Method):抽象方法是一种仅有方法头,而没有具体的方法体和操作实现的方法。使用抽象方法的目的是使所有的子类,对外都呈现一个相同名字的方法,是一个统一的接口。所有的抽象方法,都必须存在于抽象类之中。
- 最终方法(Final Method):用final修饰符修饰的类方法。这样的方法不能被覆盖,即子类不能重写该方法。
final 变量-----常量
final 方法----不能被重写
final 类---- 不能被继承
- 本地方法(Native Method):用native修饰符声明其他语言书写方法体并具体实现方法功能的特殊的方法。由于native的方法的方法体使用其他语言在程序外部写成,所以所有的native方法都没有方法体,而用一个分号代替。
- 同步方法(Synchronized Method):如果synchronized修饰的方法是一个类的方法(即static的方法),那么在被调用执行前,将把系统类Class中对应当前类的对象加锁。这通常用于多线程编程中,以确保同一时间只有一个线程可以执行某个方法。
注意
在静态方法中不能调用实例方法;在实例方法中可以调用静态方法,也可以调用实例方法。
在Java中,"在静态方法中不能调用实例方法" 这句话的意思是,你不能直接在静态方法内部调用一个非静态(即实例)方法,除非你先创建了一个类的实例(对象),并通过这个实例来调用该方法。这是因为静态方法和实例方法在几个关键方面有所不同:
-
加载时机:静态方法是属于类的,而不是属于类的任何特定实例。它们在类被加载到JVM(Java虚拟机)时就已经准备好了,这通常是在创建类的第一个实例之前。而实例方法是属于类的实例(对象)的,它们需要类的实例被创建之后才能被调用。
-
访问级别:静态方法可以直接访问静态变量和静态方法(因为它们都属于类),但不能直接访问实例变量和实例方法(因为它们属于类的实例)。相反,实例方法可以访问静态变量、静态方法、实例变量和实例方法(因为它们都有对类的实例的访问权限)。
-
this引用:在实例方法中,
this
关键字引用的是当前实例(对象)。然而,在静态方法中,this
关键字是不可用的,因为静态方法不依赖于任何特定的实例。 -
调用方式:静态方法可以直接通过类名来调用,而不需要创建类的实例。实例方法则需要先创建类的实例,然后通过这个实例来调用。
由于这些差异,如果你在静态方法中直接调用一个实例方法,编译器会报错,因为它不知道应该使用哪个实例(对象)来调用这个方法。要解决这个问题,你需要在静态方法中创建一个类的实例,并通过这个实例来调用实例方法。但是,这通常不是一个好的设计选择,因为它违反了静态方法的初衷——即提供不依赖于任何特定实例的功能。
例如,以下代码会导致编译错误:
public class MyClass {
public void instanceMethod() {
// 实例方法
}
public static void staticMethod() {
instanceMethod(); // 错误:不能在静态上下文中引用非静态方法 instanceMethod()
}
}
要修复这个错误,你需要在staticMethod
中创建一个MyClass
的实例,并通过这个实例来调用instanceMethod
:
public class MyClass {
public void instanceMethod() {
// 实例方法
}
public static void staticMethod() {
MyClass obj = new MyClass(); // 创建类的实例
obj.instanceMethod(); // 通过实例调用实例方法
}
}
二、属性(成员变量)
在Java中,属性(通常称为字段或成员变量)是类的一部分,用于存储与类的实例或类本身相关联的数据。这些属性可以是任何有效的Java数据类型,包括基本数据类型(如int
, double
, boolean
等)或引用类型(如其他类的实例、数组等)。
成员变量可以分为2种——实例变量和静态变量。
静态变量(类变量)(牢记)
如果一个成员变量定义时带有static关键字,则为“静态变量”
例如:static String name; //定义静态变量
使用时可以直接通过类去访问
例如Dog.name="大黄" ; //使用
基本数据类型
Java的基本数据类型包括:
byte
:8位有符号二进制整数short
:16位有符号二进制整数int
:32位有符号二进制整数long
:64位有符号二进制整数float
:单精度32位IEEE 754浮点数double
:双精度64位IEEE 754浮点数char
:16位Unicode字符boolean
:true或false
引用类型
引用类型包括:
- 类(Class Types):如
String
,Integer
等,或者是你自己定义的类。 - 接口(Interface Types):定义了一组方法的契约,但不包含方法的实现。
- 数组(Array Types):可以存储相同类型元素的集合。
- 枚举(Enumeration Types):Java 5.0引入的一种新的类型,允许用类型安全的枚举常量来代替整数常量。
属性的修饰符
属性(字段)可以使用以下修饰符:
public
:表示该属性可以从任何其他类访问。private
:表示该属性只能在其所在的类中被访问。protected
:表示该属性可以被其所在类、同一包中的其他类以及子类访问。static
:表示该属性是类属性,而不是实例属性。它可以通过类名直接访问,而不需要创建类的实例。final
:表示该属性的值一旦被初始化后就不能再改变。transient
:表示该属性不需要被序列化。这通常在将对象保存到持久存储(如文件或数据库)时使用。volatile
:表示该属性可能会被并发地修改,编译器和处理器需要强制从主内存中读写该属性的值。这通常用于多线程编程中。
注意
- 只有public修饰符可以修饰类
- private、protected和public修饰符可以修饰成员变量,也可以修饰成员方法。主要用于控制成员变量或成员方法的访问权限。当然,成员变量和成员方法也可以没有修饰符。
访问权限
代码示例:
public class Person {
// 私有实例属性
private String name;
private int age;
// 公共静态属性(也称为类属性)
public static String companyName = "ACME Corp";
// 构造器
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 一个静态方法,可以通过类名直接调用
public static void printCompanyName() {
System.out.println(companyName);
}
}
三、