类
类是对象抽象的描述。
定义类的关键字 class。
类用来描述对象,对象是具体的。
类是一种自定义的数据类型,属于引用类型。
一个java文件里可以有多个class,但是只能有一个public class外部类,并且类名必须和.java文件名相同
一个Java源程序文件中定义几个类和接口,则编译该文件后生成几个以.class为后缀的字节码文件。
类的定义
- class 关键字定义类
- 类名和文件名要保持一致
- 类名首字母要大写,采用驼峰命名, 这个只是规范,而不是语法要求
类的5大成员:属性、方法、构造器、代码块、内部类。
前提:非内部类
类修饰符为 public 和 default(没有访问控制修饰符),不能被private和protected修饰
- final可以修饰类
- static不能修饰类
- 一个类文件中可以定义多个类,最多只能有一个public的类 ```java public class 类名{
}
<a name="AXdt5"></a>
## 成员变量 和 局部变量
**变量必须声明和初始化以后,才能使用。**<br />成员变量:定义在类中的变量。成员变量声明以后有默认值。<br />局部变量:定义在方法中的变量。局部变量声明以后,要使用必须显式初始化。
- 成员变量和局部变量的区别
- 作用域不同
- 初始值
- 成员变量 JVM 给对应数据类型的默认值
- 局部变量的初始值,要程序员显式赋值
- 优先级
- 成员变量和局部变量同名,那么在局部变量作用域内,优先使用局部变量
<a name="rUTzO"></a>
### 成员变量的初始化过程
比如: int i = 10; {i = 22} Test(){ i= 33}
1. 类加载的时候,默认初始化 i=0
1. 声明初始化 i = 10
1. 构造块初始化 i= 22, 多个构造块根据先后顺序执行
1. 构造器初始化 i = 33, 也就是类创建以后i的值是33
<a name="nt166"></a>
## 类的创建
- `new `关键字
<a name="w6Uln"></a>
## 构造方法
- 构造方法不能定义返回值类型,void也不行
- 构造方法的名称和类名要一致
- 编译 默认会提供无参构造方法,即默认构造器方法
- 显式定义构造方法以后,默认构造方法编译器不再提供。
- 构造方法的修饰符:
- 构造方法的作用:初始化对象
- 构造方法可以重载
- 用this调用, this(参数)
- 只能构造方法调用构造方法
- 调用构造方法只能放在第一行
- 构造方法的调用
- this调用本类自己的构造方法
- super调用父类构造方法
- 默认每个构造器的第一行隐含调用父类的默认构造方法或无参构造方法
- super显式调用父类的构造方法,必须放在构造方法的第一行
- 构造方法的分类
- 默认构造方法
- 默认构造方法,无参,访问权限与定义它的类相同
- 无参构造方法
- 有参构造方法
- 构造方法用 `new` 调用,创建和初始化对象
- 构造方法不会被继承
<a name="kG21O"></a>
## 构造块
- 语法:在类中{ }
- 每次实例化对象,都会执行
- 构造块 会在构造方法之前执行
- 构造块本质上:把构造块中的代码,放在每一个构造方法,现有代码之前,可以看字节码
- 构造块的作用:初始化对象, 可以把构造器中重复的代码,提取到构造块中,减少代码冗余
<a name="kA3pC"></a>
# 方法
- 方法是行为,行为会修改属性
<a name="NH2Gl"></a>
## 方法的定义
```java
访问修饰符 返回值类型 方法名(参数1,参数2..., 参数n){
方法体;
}
- 访问修饰符
- public default protected private
- 返回值类型
- void
- 基本数据类型或引用数据类型
return
结束方法,并返回值
- static 修饰方法,是类方法
- final 修饰方法,不能被重写
- 形参和实参
- 形参
- 是一个局部变量
- 实参
- 形参
- 可变参数
- 语法 …
- 传参灵活
- 可以不传参
- 传多个参数
- 传数组
- 可变参数实际是个数组
- 可变参数要放在参数列表的最后 ```java @Test public void test_22() { ff(); ff(1); ff(2, 7); ff(new int[]{2, 3, 46}); }
public void ff(int… arr) { System.out.println(Arrays.toString(arr)); }
<a name="sRfHF"></a>
## 方法参数的传递
- 方法参数的传递是**值传递**。
- 基本数据类型传递的是数据值的拷贝
- 引用类型传递的是引用的拷贝 (两个引用指向同一个对象)
- String 虽然是引用类型,但是String是final的
<a name="vpJ5B"></a>
## 方法的调用
- 类方法,类名.方法
- 成员方法, new 类().方法
<a name="LDmeC"></a>
### 方法的递归调用
- 递归,方法自己调用自己
- 递归 有 循环的作用,也是代码的重复执行
- 递归要有退出条件,小心栈溢出
<a name="EbtRJ"></a>
# 抽象类
```java
abstract class 类名{
抽象类中可以定义抽象方法,普通类中不能定义抽象方法
}
- 抽象类不能被实例化, 但是抽象类有构造方法
- 继承抽象类要实现抽象类中所有的抽象放方法,但是抽象子类除外
抽象类可以用匿名类的方式实现
抽象方法
访问修饰符 abstract 返回类型 方法名();
- abstract 不能和 final private static一起使用
- 抽象类可以么有抽象方法,但是有抽象方法的一定是抽象类