对象与类
- 现实生活中万物皆对象:灯泡质检员质检的每件灯泡;对于老师而言,在坐的各位学生;对于学生而言,自己的笔和书。
- 全面认识现实生活中的对象就要知道它有哪些信息(属性),它能干什么(即功能)?
- Java中的对象也是如此,只是叫法不同:Java中将现实对象中的信息称为属性(也叫全局变量),将现实对象中的功能称为方法。
- Java语言把一组对象中相同属性和方法抽象到一个Java源文件就形成了类。
类的定义方法
- 定义一个类的步骤:1、定义类名;2、定义类的属性;3、定义类的方法。
public class 类名 {
//属性
属性1类型 属性1;
属性2类型 属性2;
…
属性n类型 属性n;
//方法
方法1;
方法2;
…
方法m;
}
类名的命名规则:
- 符合标识符命名规范;
- 类名必须使用英文字母,首字母应大写,如Hello、People等。
- 当类名由多个”单词”组合而成时,每个单词的首字母都要大写。如 Time、Game、Dog、DateUtil等。
对象的创建和使用
通过new关键字创建对象。创建对象又称实例化对象。
Student student = new Student();使用”.”运算符访问对象的属性和方法。
student.属性 = 值;
student.方法名();
类与对象的关系
- 类是创建对象的模板,确定对象将会拥有的属性和方法。
- 类是对象的抽象化;对象是类的具体化。
- 类是一种数据类型,是对象的数据类型(不同于int等基本类型:类具有方法)
方法与重载
如何定义方法
方法用于定义类的某种行为(或功能),其语法结构如下:
访问控制符 [修饰符] 返回值类型 方法名( [参数] ) {
//方法体
}
注:方括号内的可以省略
示例:
public void sayHello(){
System.out.println("Hello");
}
protected final void show(int x){
System.out.println(x);
}
private static int add(int x, int y){
return x+y;
}
访问控制符
方法中的访问控制符用于限制方法在其他类中的使用范围。
共有四个:public、protected、default和private
它们的作用范围分别是:
返回值类型
- 如果方法没有返回值,需要用void表示。
- 方法返回基本数据类型的数据,则返回值类型必须是返回数据所属的数据类型或者精度更高的数据类型(针对于数值类型的数据)。
- 方法返回引用数据类型的数据,则返回值类型必须是返回数据所属的数据类型或者其父类。
- 方法如果有返回值,则必须借助return关键字将数据返回;
方法名
- 遵循标识符命名规则;首字母必须小写,如果由多个单词组成,从第二个单词开始首字母必须大写;方法名一般由一个动词或者动名词构成。
参数
- 方法可以有多个参数,各个参数之间用逗号(,)间隔。
- 方法的参数在整个方法内有效。
- 方法参数前面的数据类型用于限制调用方法时所传具体数据的数据类型;
动态参数
- 动态参数–参数繁琐的问题,只能针对同一类型。对不同类型的数据,用Object(因为Object是所有类的父类)
- 一个方法只能有1个动态参数
- 动态参数实际上是一个数组
public class Parameter {
public static void print(int a,Object ... scores) {
System.out.println(a);
for(Object score:scores) {
System.out.println(score);
}
}
}
方法重载
- 同一个类中有多个方法名相同但参数列表不同的方法,这种现象称为方法重载(overload)。其中参数列表不同包括以下情形:
1、参数的个数不同
2、参数的对应类型不同
- 注意:
1、参数列表不同并不包含参数名不同,也就是说如果方法名相同,方法中参数个数和类型相同,只是参数名不同,这样也不能称之为方法重载。
2、方法中其它构成部分不参与比较:访问控制符、修饰符、返回值类型。 - 一个类中有多个同名方法(构造方法或普通方法),在调用这些方法时,到底调用哪个方法取决于调用方法时传入的参数的数据类型和个数。
public class Teacher {
public static void print(int age, String name) {
System.out.println(age + "," + name);
}
public static void print(String name, int age) {
System.out.println(name + "," + age);
}
public static void main(String[] args) {
print(33, “王小红”);// 依次传入int类型和String类型数据,所以调用第一个方法
print("王小红", 33);//依次传入String类型和int类型数据,所以调用第二个方法
}
}
代码块
- Java中代码块分为静态代码块和非静态代码块(用static定义)
public class Test {
{ //非静态代码块每次创建对象时都会执行;
System.out.println("非静态代码块");
}
static{ //静态代码块只在类加载时执行一次;
System.out.println("静态代码块");
}
public static void main(String[] args) {
new Test();
new Test();
}
}
全局变量和局部变量
变量分类
成员变量
- 直接在类中声明的变量叫成员变量(又称全局变量)
- 如果未对成员变量设置初始值,则系统会根据成员变量的类型自动分配初始值:int分配初始值0、boolean分配初始值false,而自定义类型则分配初始值null。
public class Variable {
//在类中直接定义的变量适用于整个类,称之为成员变量(也叫做全局变量)
static int v_1 = 6;//静态代码块只能用静态方法定义成员变量
int v_2 = 4;//非静态代码块只能用非静态方法定义成员变量
static {
System.out.println(v_1);
}
{
System.out.println(v_2);
}
}
- 成员变量定义后,其作用域是其所在的整个类。
- 成员变量的定义没有先后顺序,但是最好将成员变量的定义集中在类的顶部。(规范)
局部变量
- 方法中的参数、方法中定义的变量和代码块中定义的变量统称为局部变量。
- 局部变量的作用域范围从定义的位置开始到其所在语句块结束。
- 如果局部变量的名字与全局变量的名字相同,则在局部变量的作用范围内全局变量被隐藏,即这个全局变量在同名局部变量所在方法内暂时失效。
- 如果在局部变量的作用域范围内访问该成员变量,则必须使用关键字this来引用成员变量。
- 局部变量在使用以前必须显式初始化或赋值,局部变量没有默认值。
- 声明局部变量时,数据类型前除final外不允许有其他关键字,即其定义格式为: [final] 数据类型 变量名 = 初始值。
//局部变量
//方法中的参数、方法中定义的变量和代码块中定义的变量统称为局部变量。
//局部变量的作用域范围从定义的位置开始到其所在语句块结束。
//局部变量前不能加staic,public等访问控制符
{
int a = 9;//代码块中的局部变量
System.out.println("a"+a);
}
static void show(int arg) {//方法中的参数
if(arg==1) {
int y = 2;//方法中的成员变量
System.out.println("y="+y);
}
}
int v_3;
{
System.out.println(v_3);//成员变量有默认值
int a;//局部变量没有默认值
//System.out.println(a);//由于局部变量没有默认值,因此不能这么写;
int v_3 = 4;
System.out.println(v_3);
//如果局部变量的名字与全局变量的名字相同,则在局部变量的作用范围内
//全局变量被隐藏,即这个全局变量在同名局部变量所在方法内暂时失效。
System.out.println(this.v_3);
//如果在局部变量的作用域范围内访问该成员变量,
//则必须使用关键字this来引用成员变量。
//this不能用在静态代码块static中
}
关键字static
- 成员变量
- static修饰的成员变量称为类属性(又称静态变量):类成员变量的值在所有对象之间共享; JVM加载类时初始化值; 可以由所在类创建的对象或类名来调用,推荐使用类名直接调用;
- 没有static修饰的成员变量称为实例属性(又称非静态变量):变量值只属于单个对象;JVM执行创建对象代码时初始化值;只能使用对象来调用。
int v_4 = 9;
static int v_5 = 6;
public static void main(String args[]) {
Variable var_1 = new Variable();
Variable var_2 = new Variable();
System.out.println(var_1.v_4);
var_2.v_4 = 5;
System.out.println(var_2.v_4);
//当成员变量没有static(非静态变量)时,每次定义一个新的对象时,成员变量都是相互独立,互不影响的
System.out.println(var_1.v_5);
var_2.v_5 = 10;
System.out.println(var_1.v_5);
//当成员变量有static(为静态变量)时,不管定义几个新的对象,成员变量都是共用的
}
方法
- static修饰的方法称为类方法(又称静态方法):此种方法被所有该类的对象共享; JVM加载类时为其分配入口地址;可以由所在类创建的对象或类名来调用,推荐使用类名直接调用;
- 没有static修饰的方法称为实例方法(又称非静态方法):此种方法对所有该类的对象都是独立的; JVM执行创建对象代码时为其分配入口地址并且只分配一次;只能使用对象来调用;
代码块
- static修饰的代码块称为静态代码块:JVM加载类时该类型代码块执行并且只执行一次;
- 没有static修饰的代码块称为非静态代码块:JVM执行创建对象代码时执行并且每创建一个对象执行一次;
- 注意
- 静态方法不能直接调用非静态方法,可以间接通过创建该方法(指非静态方法)所在类的对象来调用;非静态方法可以直接调用静态方法;
- 静态代码块不能直接调用非静态方法;可以间接通过创建该方法(指非静态方法)所在类的对象来调用;静态代码块可以直接调用静态方法;
- 静态方法或者静态代码块不能直接使用非静态成员变量,可以间接通过创建该成员变量的对象来调用;静态方法或者静态代码块只能直接使用静态变量;
构造方法
为什么需要构造方法
有如下Teacher类:
public class Teacher {
int age; // 年龄
String name; // 姓名
String position; // 职位
String education; // 学历
public String introduction() {
return "大家好!我是" + name + ",我今年" + age + "岁,学历" + education + ",目前职位是" + position;
}
}
编写一个测试类,实例化一个教师对象,并对其初始化,在控制台输出该教员的自我介绍
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.name = "李雯";
teacher.age = 36;
teacher.education = "博士";
System.out.println(teacher.introduction());
}
}
存在这样无法避免的问题:Teacher类中有太多的属性,每次给属性赋值时非常麻烦:编码量大,无法重用给属性赋值的代码。由此产生了构造方法
什么是构造方法
- 构造方法负责初始化类中的实例变量(非“类变量”)。
- 构造方法是一种特殊的方法,这种方法必须满足以下语法规则:构造方法必须与类名相同;不包含返回值类型描述部分。
- 构造方法不能有static和final关键字修饰。
如何使用构造方法
- 使用new关键字调用构造方法,即构造方法在创建对象(也称对象实例化)时被调用。
public class TeacherTest {
public static void main(String[ ] args) {
Teacher teacher = new Teacher(); //创建Teacher对象
}
}
显式构造方法
- 创建类时,如果没有显式定义构造方法,则该类会存在一个默认的无参构造方法;
- 可以在类中声明一个或多个有参构造方法,但每个构造方法在参数个数或参数数据类型上要有所差别:
- 如果类中存在显式构造方法,则默认的无参构造方法将不复存在,除非显式定义无参构造方法
类中构造方法间的调用
- 类中可以有多个构造方法,构造方法之间可以通过this实现调用,但必须将调用构造函数代码写在有效代码的第一行:
关键字this
- this代表对当前对象的一个引用
public void print() {
System.out.println("!!!!!!!!!!!!!!"+this);//this代表对当前对象的一个引用。
}
public static void main(String[] args) {
This teacher = new This();
System.out.println(teacher);//输出的是teacher分配的地址
teacher.print();
teacher = new This();//重新给teacher分配了一个新的地址
System.out.println(teacher);
teacher.print();
}
- this关键字用于调用属性、方法及本类中构造方法。