一、定义类
定义类的简单语法如下:
- 在上面的语法格式中,修饰符可以是
public
和final
中的一个,或者不要也可以。 - 类可以包含三种最常见的成员:构造器、属性和方法,三种成员都可以定义0个或多个
- 类中各成员间可以相互调用,但
static
修饰的成员不能访问没有static
修饰的成员 - 属性用于定义类或类的实例中所包含的数据,方法则用于定义类或类的实例的行为特征或功能实现
- 构造器用于构造该类的实例,通过
new
关键字来调用构造器,从而返回该类的实例。构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例。因此,Java语言提供了一个功能:如果程序没有为类编写构造器,则系统会为该类提供一个默认的构造器
以上几条介绍了类的组成的基本情况。接下来介绍类里面3大基本成员的具体语法格式
1、属性
属性用于定义类或类的实例中所包含的数据,其语法格式如下:
[修饰符] 属性类型 属性名 [=默认值]
- 修饰符:可以省略,也可以是
public, protected, private, static, final
,其中public, protected, private
三个最多只能出现一个,可以与static, final
组合起来修饰属性。例如
public int a = 0;
protected double f;
float e = 1.0;
public static int d = 2;
- 属性类型:可以是Java语言允许的任何数据类型,包括8个基本类型和引用类型(数组、类等)
- 属性名:合法的标识符即可
- 默认值:可以给定一个合法的默认值,也可以不给定,在创建具体实例时按情况给定
属性是一种比较传统、也比较符合汉语习惯的说法,在Java官方说法里面,属性被称为Field
,因此有的地方也将属性翻译为字段
2、方法
定义方法的语法格式如下:
[修饰符] 方法返回值类型 方法名(形参列表)
{
// 由0条到多条可执行语句组成的方法体
}
- 修饰符:可以省略,也可以是
public, protected, private, static, final
,其中public, protected, private
三个最多只能出现一个,可以与static, final
组合起来修饰属性。例如
public static void main(String[] args)
static int getMax(int a, int b)
private float getMax(float a, float b)
- 方法的返回值类型:可以是ava语言允许的任何数据类型,包括8个基本类型和引用类型(数组、类等);如果声明了方法的返回值类型,则方法体内必须有
return
语句返回一个变量或者表达式,且这个变量或者表达式的类型必须与方法声明的类型匹配。若一个方法没有返回值,则须使用void
来声明 - 形参列表:用于定义该方法可以接受的参数,多个参数间需用
,
隔开
static
是一个特殊的关键字,它可以用于修饰方法、属性等成员。static
修饰的成员表明它是这个类共有的,而不是属于该类的某个实例,因此通常把static
修饰的属性和方法也称为类属性、类方法;不适用其修饰的方法和属性称为实例属性和实例方法。
3、构造器
构造器语法格式如下:
[修饰符] 构造器名(形参列表)
{
// 由0条到多条可执行语句组成的构造器执行体
}
- 修饰符:可以省略,也可以是
public, protected, private
中的一个 - 构造器名:必须与类名相同
- 形参列表:同方法的形参列表
需注意:构造器不能定义返回值类型声明,也不能使用void
定义构造器没有返回值。
以上,我们就介绍完了Java中类的定义,都是文字不易理解,接下来我们通过简单的程序例子进行讲解。
首先我们定义一个Person
类:
public class Person {
public int age;
public double height;
public void info()
{
System.out.println("我的年龄是: " + age + ", 我的身高是: " + height);
}
}
显然,这个类不含构造函数,则系统会给他提供一个默认的构造函数,系统提供的构造函数是没有参数的。调用的时候使用new
关键字,这样调用即可:
Person Cheng = new Person();
static
修饰的方法或属性,既可以通过类来调用,也可以通过实例来调用,没有使用static
修饰的方法或属性,则只能通过实例调用。上面的程序中属性和方法均没有用static
修饰,我们可以用Cheng
这个实例来调用:
Person Cheng = new Person();
Cheng.age = 23;
Cheng.height = 172.0;
Cheng.info();
运行这个程序,就可以得到如下输出:
我的年龄是: 23, 我的身高是: 172.0
4、对象的this引用
Java提供了一个this
关键字,是一个对象的默认引用,this
关键字总指向调用该方法的对象。根据this
出现的位置不同,分为两种情形:
- 构造器中使用
this
下面给出一个实例
public class Person {
public int age;
public double height;
public Person(int age, int height)
{
this.age = age;
this.height = height;
}
public void info()
{
System.out.println("我的年龄是: " + age + ", 我的身高是: " + height);
}
}
在调用的时候,可以在构造函数内直接传入age
和height
值进行初始化,下面即为其调用示例:
Person Cheng = new Person(22, 172);
Cheng.info();
- 方法中使用
this
public class Person {
public int age;
public double height;
public Person(int age, int height)
{
this.age = age;
this.height = height;
}
public void info()
{
System.out.println("我的年龄是: " + age + ", 我的身高是: " + height);
}
public void say()
{
this.info();
System.out.println("这就是我");
}
}
上述程序在say
方法内调用info
方法,这种情况下直接使用this
即可,而不需要通过创建对象再调用info
方法,这样的话可以避免重复创建同一对象,且写法更简洁。
在现实世界里,对象的一个方法依赖于另一个方法的情况很常见,因此,Java允许对象的一个成员直接调用另一个成员,可以省略this
,即上述程序中say
方法中省略this
也是可以的。
对于static
修饰的方法而言,则可以直接使用类来直接调用该方法。如果在static
修饰的方法中使用this
关键字,则这个关键字就无法指向合适的对象,所以,static
修饰的方法中不能使用this
引用。由于static
修饰方法中不能使用this
引用,所以static
修饰方法中不能访问不适用static
修饰的普通成员,例如面的程序就会出错:
public class test {
public void info()
{
System.out.println("测试下啦~");
}
public static void main(String[] args){
info();
}
}
如果确实需要在静态方法中访问另一个普通方法,则只能重新创建一个对象。
public class test {
public void info()
{
System.out.println("测试下啦~");
}
public static void main(String[] args){
test t = new test();
t.info();
}
}
当this
作为对象的默认引用使用时,程序可以像访问普通引用变量一样来访问这个this
引用,甚至可以把this
当成普通方法的返回值,如下程序:
public class test {
public int age = 20;
public test grow()
{
age++;
return this;
}
public static void main(String[] args){
test t = new test();
t.grow().grow().grow();
System.out.println("我现在已经"+ t.age + "岁啦~");
}
}
我现在已经23岁啦~