一、java中的面向对象类型
面向对象两个基本概念:类、对象
1. 类:
类是一个模板,抽象一类对象的属性、和方法。类由一些保存值的数据字段和处理这些值的方法组
类的属性通过字段表示,一个类包含如下字段:
2) 类字段(静态变量):类变量为static类型,此类的所有实例(对象)共用类变量的一个拷贝。类变量存储在静态存储区,在首次被访问时创建,在程序结束时释放。
3) 成员字段:在类内、方法外定义,一般是类的属性,其生命周期限于类对象生命周期期间。其在类对象实例化时创建,类对象释放时释放。实例变量最少需要被一个构造方法、或方法引用,使得通过这些方法可以操作成员变量。
4) 局部变量 (字段):在类的方法中定义,其生命周期仅限于方法内,在方法执行时创建,方法执行完毕后释放。
类包含如下方法:
-
构造方法:构造方法的名称必须和类名相同。
-
其他方法。
2、对象:
对象是类的一个实例,有方法和属性。
对象通过实例化类创建,方法是使用 new 关键字、并调用构造方法来初始化对象。
3、定义语法
(1)类定义
修饰符 class 类名 {
....
}
(2) 方法定义
修饰符 返回值类型 方法名(参数1类型 参数1, 参数2类型 参数2){
......
return; //可选
}
(3) main方法定义(java程序的入口)
public static void main(String[] args) {
......
}
一个类的定义包含一个签名和一个主体。类的签名定义类的名称,可能还会指定其他重要信息。类的主体是一些放在花括号里的成员。类的成员一般包含字段和方法,也可以包含构造方法、初始化程序和嵌套类型。
4、类字段/方法 和 实例字段/方法
类的成员(字段和方法)可以分为:
(1) 类字段
(2) 实例字段
(3) 类方法
(4) 实例方法
类实例、方法也可以称之为静态成员,通过static关键字修饰符定义。静态成员属于类本身,而非静态成员属于类的实例。
二、Java中的修饰符
Java中的修饰符可以分为“访问控制类修饰符”和“非访问控制修饰符”。
1、访问控制类修饰符:
包含public、protected、private。
1)修饰类
(1)public:对所有类可见
(2)protected:对同一包内可见。
(3)default:不带任何访问控制修饰符。同protected,仅同一包内可见。
注:类(外部类,内部/外部类见后续章节)不可以用private进行修饰的。
2)修饰方法、字段:
(1)private:仅同一类内可见。
(2)protected:同一包内的类,或本类的子类可见。
(3)public:对于所有类可见。
(4)default:不带任何访问控制修饰符。仅同一包内的类可见。(与protected的区别:protected同一包内的类、或其子类可见。default仅同一包内的类可见)
2、非访问控制类修饰符:
- static:
修饰字段、方法。
(1)修饰字段:类字段,用于声明类的静态变量。(非static修饰的字段,称之为实例字段)
(2)修饰方法:类方法,用来声明独立于对象的静态方法。(非static修饰的字段,称之为实例方法)
注意:
(1)static修饰的字段、方法是绑定到类自身,而不是类的实例。
(2)类方法不能使用非类字段和非类方法。(原因是:类方法独立于类的实例,没有创建类的实例时即可调用。而实例字段、实例方法只有在创建类的实例后,才有效)。
(3)局部变量不能声明为static。
关于类字段和类方法:
(1)通过public修饰公开的类字段,类似于C语言的全局变量。不过,Java中的类字段的名称被定义它的类名限定。因此, 如果不同的类定义了同名的类字段, 不会像C语言一样出现名称冲突问题。
(2)类似地,通过public修饰公开的类方法,类似于其他编程语言的全局方法、或全局函数。
(3)在调用类字段、类方法时,本类内访问方式为“字段/方法名”,本类外访问方式为 “类名.字段/方法名”。
关于实例字段和实例方法:
(1)实例方法可以调用类字段、类方法。
(2)在本实例的类外部,需要调用本类的实例方法,方式是“本类实例引用名.方法名”。
(3)所有实例方法都使用了一个隐式参数,方法签名里没显示这个参数。这个隐式参数 是 this,它的值是调用这个方法的实例引用。
- final:
修饰类、字段、方法。
修饰类:修饰的类不能够被继承。注:
(1)类不能同时被修饰为final和abstract。
修饰字段:修饰的字段为常量。注:
(1)修饰为final的成员字段,在类实例化时赋值后,不能被更改。
(2)也可通过final修饰类字段,即static final,此种方式修饰的字段类似与C语言中的全局常量,在类定义时赋值,其后不可修改。字段同时使用static 和 final ,本字段就是编译时常量,javac 会将其内联化。
修饰方法:修饰的方法不能被 子类 重写。注:
(1)使用final修饰的方法能获取普通方法无法得到的编译器优化。
(2)所有private方法都隐式添加了final修饰符。
(3)final类的所有方法都隐式添加了final修饰符。
- abstract:
修饰类、方法。
修饰类:表示类为抽象类。抽象类不能用来进行实例化,其唯一的目的是被继承。抽象类,可以包含抽象方法、或非抽象方法。
修饰方法:表示方法为抽象方法。抽象方法仅定义方法签名,不包含方法的实现主体,其方法主体通过一个分号代替;具体实现由其 子类 类提供。 注:
(1)抽象方法不能声明为final和static(final修饰的方法不能被 子类 重写,与抽象方法需要子类实现矛盾)。
(2)包含抽象方法的类 必须 为抽象类(非抽象的类可以实例化,若果包含了抽象方法,会导致实例的方法不可用)。
- synchronized、volatile:
synchronized修饰方法。主要用于多线程编程。
本修饰符实现线程安全的方法,synchronized修饰符声明的方法同一时间只能被一个线程访问。
线程调用 synchronized 修饰的方法之前,必须先为方法所在的类(针对 static 修饰的方法)或 对应的类实例(针对没使用 static 修饰的方法)获取一个锁,避免两个线程同时执行该方法。
volatile修饰字段。
volatile修饰符表示字段的值必须始终从主存储器中读取和释放,不能被线程缓存(在寄存器或 CPU 缓存中)。每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
更多描述,见后续多线程编程部分。
- strictfp:
修饰类、方法。
这个修饰符表示浮点数不扩展精度。如果类声明为strictfp,则这个类的所有方法都需要声明为strictfp。
这个修饰符极少使用。
6) native:
修饰方法。
native修饰的方法表示此方法的实现由某种“本地”语言编写,例如C语言,并且开放给java程序使用。
native修饰的方法没有主体,花括号及包含的实现主体被分号替代。
现在native修饰符极少使用。
修饰符总结:
1、访问控制修饰符
2、非访问控制修饰符
三、类中方法的this隐式参数
类中的方法包含一个隐式的this参数。
(1)在实例方法中,this作为隐式的这个方法的实例引用。如果方法的入参、或方法局部变量 和类中的某个字段同名,就必须使用 this.字段名指向类中的字段。
(2)类方法也能使用this关键字,可以通过this关键字调用本类的其他类方法。