Java对象和类
对象和类
1. 类的定义
步骤:
1. 定义类名;
2. 定义类的属性;
3. 定义类的方法。
语法:
public class 类名 {
//属性
属性1类型 属性1;
属性2类型 属性2;
…
属性n类型 属性n;
//方法
方法1;
方法2;
…
方法m;
}
类名的命名规则:
1. 符合标识符命名规范;
2. 类名必须使用英文字母,首字母应大写,如Hello、People等。
3. 当类名由多个”单词”组合而成时,每个单词的首字母都要大写。如 Time、Game、Dog、DateUtil等。
2. 对象的创建和使用
-
通过new关键字创建对象。创建对象又称实例化对象。
Student student = new Student();
-
使用”.”运算符访问对象的属性和方法。
student.属性 = 值; student.方法名();
3. 类与对象的关系
- 类是创建对象的模板,确定对象将会拥有的属性和方法。
- 类是对象的抽象化;对象是类的具体化。
- 类是一种数据类型,是对象的数据类型(不同于int等基本类型:类具有方法)
方法与重载
1. 定义方法
方法用于定义类的某种行为(或功能),其语法结构如下:
访问控制符 [修饰符] 返回值类型 方法名( [参数] ) {
//方法体
}
访问控制符
方法中的访问控制符用于限制方法在其他类中的使用范围。
访问控制符分为四种:public、protected、友好的和private。-
修饰符
- static修饰符用于限制方法的调用方式:
- static修饰的方法可以直接使用类名调用也可以使用类创建的对象调用;
- 非static修饰的方法只能使用类创建的对象调用。
- 其它常用方法修饰符有final和synchronized
方法返回引用数据类型的数据,则返回值类型必须是返回数据所属的数据类型或者其父类。
- static修饰符用于限制方法的调用方式:
-
返回值
- 方法返回引用数据类型的数据,则返回值类型必须是返回数据所属的数据类型或者其父类。
- 方法如果有返回值,则必须借助return关键字将数据返回;
方法名遵循标识符命名规则
首字母必须小写,如果由多个单词组成,从第二个单词开始首字母必须大写;方法名一般由一个动词或者动名词构成。-
参数
- 方法可以有多个参数,各个参数之间用逗号(,)间隔。
- 方法的参数在整个方法内有效。
- 方法参数前面的数据类型用于限制调用方法时所传具体数据的数据类型;
-
动态参数
- 动态参数实质为数组;
- 动态参数必须位于参数列表的最后;
-
一个方法只能有一个动态参数;
示例:public class Test { public static void print(int... numbers) { for (int number : numbers) { System.out.println(number); } } public static void main(String[] args) { print(1, 2, 3, 4, 5); } }
方法重载
-
同一个类中有多个方法名相同但参数列表不同的方法,这种现象称为方法重载(overload)。其中参数列表不同包括以下情形:
- 参数的个数不同
- 参数的对应类型不同
-
注意
- 参数列表不同并不包含参数名不同,也就是说如果方法名相同,方法中参数个数和类型相同,只是参数名不同,这样也不能称之为方法重载。
- 方法中其它构成部分不参与比较:访问控制符、修饰符、返回值类型。
一个类中有多个同名方法(构造方法或普通方法),在调用这些方法时,到底调用哪个方法取决于调用方法时传入的参数的数据类型和个数。
代码块
Java中代码块分为静态代码块和非静态代码块
1. 静态代码块只在类加载时执行一次;
2. 非静态代码块每次创建对象时都会执行;
示例:
public class Test {
{
System.out.println("非静态代码块");
}
static{
System.out.println("静态代码块");
}
public static void main(String[] args) {
new Test();
new Test();
}
}
输出:
静态代码块
非静态代码块
非静态代码块
全局变量与局部变量
1. 成员变量
- 直接在类中声明的变量叫成员变量(又称全局变量)
- 如果未对成员变量设置初始值,则系统会根据成员变量的类型自动分配初始值:int分配初始值0、boolean分配初始值false,而自定义类型则分配初始值null。
- 成员变量定义后,其作用域是其所在的整个类。
成员变量的定义没有先后顺序,但是最好将成员变量的定义集中在类的顶部。
示例:
2. 局部变量
- 方法中的参数、方法中定义的变量和代码块中定义的变量统称为局部变量。
- 局部变量的作用域范围从定义的位置开始到其所在语句块结束。
注意
- 如果局部变量的名字与全局变量的名字相同,则在局部变量的作用范围内全局变量被隐藏,即这个全局变量在同名局部变量所在方法内暂时失效。
- 如果在局部变量的作用域范围内访问该成员变量,则必须使用关键字this来引用成员变量;但this不能用于静态方法和静态代码块中。
- 局部变量在使用以前必须显式初始化或赋值,局部变量没有默认值。
- 声明局部变量时,数据类型前除final外不允许有其他关键字,即其定义格式为: [final] 数据类型 变量名 = 初始值;(不能有访问控制符,因为局部变量的作用范围已经限定了,从定义到所在语句块结束)
关键字static
-
成员变量
- static修饰的成员变量称为类属性(又称静态变量):类成员变量的值在所有对象之间共享; JVM加载类时初始化值;可以由所在类创建的对象或类名来调用,推荐使用类名直接调用;
- 没有static修饰的成员变量称为实例属性(又称非静态变量):变量值只属于单个对象;JVM执行创建对象代码时初始化值;只能使用对象来调用。
-
方法
- static修饰的方法称为类方法(又称静态方法):此种方法被所有该类的对象共享; JVM加载类时为其分配入口地址;可以由所在类创建的对象或类名来调用,推荐使用类名直接调用;
- 没有static修饰的方法称为实例方法(又称非静态方法):此种方法对所有该类的对象都是独立的; JVM执行创建对象代码时为其分配入口地址并且只分配一次;只能使用对象来调用;
-
代码块
- static修饰的代码块称为静态代码块:JVM加载类时该类型代码块执行并且只执行一次;
- 没有static修饰的代码块称为非静态代码块:JVM执行创建对象代码时执行并且每创建一个对象执行一次;
-
注意
- 静态方法不能直接调用非静态方法,可以间接通过创建该方法(指非静态方法)所在类的对象来调用;非静态方法可以直接调用静态方法;
- 静态代码块不能直接调用非静态方法;可以间接通过创建该方法(指非静态方法)所在类的对象来调用;静态代码块可以直接调用静态方法;
- 静态方法或者静态代码块不能直接使用非静态成员变量,可以间接通过创建该成员变量的对象来调用;静态方法或者静态代码块只能直接使用静态变量;
构造方法
1. 什么是构造方法
- 构造方法负责初始化类中的实例变量。
- 构造方法是一种特殊的方法,这种方法必须满足以下语法规则:构造方法必须与类名相同;不包含返回值类型描述部分。
- 构造方法不能有static和final关键字修饰。、
2. 如何使用构造方法
使用new关键字调用构造方法,即构造方法在创建对象(也称对象实例化)时被调用。
3. 显式构造方法
- 创建类时,如果没有显式定义构造方法,则该类会存在一个默认的无参构造方法;
- 可以在类中声明一个或多个有参构造方法,但每个构造方法在参数个数或参数数据类型上要有所差别
- 如果类中存在显式构造方法,则默认的无参构造方法将不复存在,除非显式定义无参构造方法
4. 类中构造方法间的调用
- 类中可以有多个构造方法,构造方法之间可以通过this实现调用,但必须将调用构造函数代码写在有效代码的第一行
- 普通方法不能使用this调用类中构造方法
关键字this
- this代表对当前对象的一个引用。
- this关键字用于调用属性、方法及本类中构造方法。
- this在实例方法中通常被省略,除非实例方法中包含与成员变量同名的局部变量时,访问成员变量需要使用this。
示例:
public class Student {
String name; //学生姓名
public void doHomework() {
System.out.println(this.name + “正在写作业……");
}
}
对象初始化过程
用new创建并初始化对象步骤:
- 给对象的实例变量(非“常量”)分配内存空间,默认初始化成员变量;
- 成员变量声明时的初始化;
- 初始化块初始化(又称为构造代码块或非静态代码块);
- 构造方法初始化
public class Static {
String name = "安妮";//创建对象的时候赋初始值
{
System.out.println(name);//创建对象的时候执行
}
public void print() {//创建对象的时候分配地址
System.out.println(name);
}
//#######################################################
static int age = 15;//类加载的时候赋初始值
static {//类加载的时候执行
System.out.println(age);
}
static void printAge() {//类加载的时候分配地址
}
//*******************************************************
public static void main(String[] args) {
new Static();
}
}