Java类中内容
1、属性(常量、变量)
a、常量
常量指的是一个固定的值。
Java中利用final
关键来表示“不能修改”的含义,即常量只要被初始化之后就不能再进行二次赋值,无法更改值。
而常量又分为字面常量
(1、‘a’、true、“Hello”)和符号常量
【使用final
修饰的】。例如:
public static final PI = 3.14;
b、变量
变量本质上就是一个“可进行一些操作的存储空间”。
在被创建后且生命周期为结束之前,这个空间位置及其大小是固定的,而且放置的内容是不确定的。可以通过变量名来访问这个空间,进行合法的操作。
i. 定义格式
[修饰符] 数据类型 变量名 [= 初始值] [,变量名 [=初始值],…];
ii. 分类
按照变量的作用域:
-
局部变量【方法内、代码块内】:没有默认值,所以必须初始化;在栈内存保存,随着方法调用创建和销毁。
-
成员变量【类中,方法外】:有默认值;在堆内存中保存,随着 对象/类 的 创建/加载 进行创建和销毁。
类型 | 说明 |
---|---|
实例变量 | 类的实例变量持有,每个对象都包含自己的实例变量。所以,需要在创建对象之后,通过方法名.属性 方式调用。 |
类变量 | 类本身持有,类的所有对象共享这个变量。在类的字节码文件加载到内存后随即创建。可以通过类名.属性 和对象名.属性 进行调用 |
2、方法
方法是完成一段特定功能的代码片段。
a. 定义、使用
格式:
[修饰符1 修饰符2] 返回值类型 方法名(形参列表){
语句;
……
}
调用:对象名.方法名(实参列表)
或者类名.方法名(实参列表)
分析:
i. 参数列表(输入):
- 形式参数:在方法定义中,接收传入数据。
- 实际参数:在方法调用时,实际传入方法的数据。
ii. 返回值(输出):
- 返回值类型:事先约定的返回值类型。
- 返回值:方法执行完,返回给调用者的数据。
iii. Java使用值传递:因此,在一些操作中会出现意料之外的问题,如:交换两个数据。【原因:变量的生命周期。不同的方法会维护不同的栈帧。基本数据类型变量会保存在方法的栈帧中,随着方法的结束“销毁”。】
b. 分类
类型 | 说明 |
---|---|
非静态方法 | 只有创建了类的实例之后才能调用,使用对象名.方法名 的方式调用 |
静态方法 | 不能访问所有非静态的内容(属性、方法)。因为所有非静态内容需要通过对象才能够获取到,同样地也就不能使用this 关键字 ;类名.方法名 或对象名.方法名 方式调用 |
c. 重载、重写
形式 | 备注 | |
---|---|---|
重载 | 方法名相同,参数列表不同 | 同一个类中 |
重写 | 方法名相同,参数列表完全一致 | 父类、子类之间。通过添加注解@Override可以再编译期检查错误 |
此处,参数列表的形式包括参数的个数、类型、顺序等方面的内容。
d、特殊方法
i. 构造方法
构造器没有返回值类型,不能有return语句,而且名字必须和类完全一致。
作用:给成员非静态属性进行赋值操作。
-
空参构造器【没有任何参数】:
如果没有其他构造器,可以不显示的写一个空参构造器,编译器会默认分配一个空参构造器;一旦有其他构造器存在,就不会再分配空参构造器,此时就需要显示的写一个空参构造器,以防万一。
一般不会在其中进行赋值操作,只是为了保证代码的健壮性而已。 -
重载的构造器【含有参数】:
在重载的构造器中,一般构造器参数会和类的属性名一致,此时通过使用this
关键字()来区别形参和类属性名。
ii. 抽象类、接口中包含的特殊方法
抽象方法【需要通过继承或者实现方式获取到方法,转化为非抽象方法】
使用abstract
关键字定义,不能被private
、static
、final
修饰。
格式:
[权限修饰符] abatract 返回值类型 方法名(形参列表);
【备注】:有抽象方法的类,一定是抽象类;抽象类,不一定含有抽象方法。
public abstract class AbstractClass {
public AbstractClass() {
System.out.println("抽象类:不含有抽象方法");
}
public static void main(String[] args) {
// {}表示需要重写其中的抽象方法,即使没有抽象方法也需要带着{}。【语法类似于匿名内部类的形式】
AbstractClass ac=new AbstractClass() {};
}
}
普通方法、私有方法、静态方法
JDK 8
:default、static方法JDK 9
:private方法
3、代码块
a、普通代码块
限制局部变量的作用范围/生命周期【方法内】
public static void main(String[] args) {
int a=1;
{
a=2;
int b=1;
System.out.println("a="+a+",b="+b);// a=2,b=1
}
// System.out.println("a="+a+",b="+b);// java: 找不到符号 符号:变量 b
System.out.println("a=" + a);// a=2
}
b、静态代码块
类加载到内存中时执行,只执行一次。可以用于执行一些全局性的初始化操作。可在其中调用类的静态(即用static
修饰)的内容。【类中,方法外;使用static
关键字修饰】
static {
System.out.println("静态块");
//静态块只能调用静态属性,静态方法
System.out.println(staticAttribute);
staticMethod();
}
c、构造代码块
在创建对象时,会被触发,先于构造器执行。【类中,方法外】
{
System.out.println(("构造块"));
}
d、同步代码块
4、内部类
内部类就是一个类内部的类。可以对应一组相对的概念:内部类、外部类。
a. 成员内部类【某一个类中,代码块之外】
成员内部类:包含属性、方法、构造器等内容,相应的修饰符和其他一般的类完全一致。
内部类可以访问外部类的内容;外部类想要访问内部类的东西,需要创建内部类的对象,再调用。
内部类、外部类存在属性重名情况:在内部类方法中,直接属性名访问的是局部变量;使用this.属性名
访问的是内部类的属性;使用外部类名.this.属性名
访问的是外部类的属性。
类型 | 说明 |
---|---|
静态 | 使用static修饰。所以只能方位外部类中被static修饰的内容。 |
非静态 | 不适用static修饰 |
b. 局部内部类
局部内部类是在方法内、代码块内、构造器内定义。
特点:访问到的属性是用final
修饰的;
使用场景:当某一个类在整个项目中只使用一次,没有必要单独创建该类。
特殊情形:当创建一个对象时,无需知道对象的名字,只是单纯地为了获取对象。此时就是在使用匿名内部类
的方式创建对象,可以通过这种方式来获取定制化对象。
在JDK 8
中引入了一系列的语法来简化代码:函数式接口、lambda表达式、方法引用