class 类名 { class Person {
类体;
} }
注意: 通常情况下,当类名由多个单词组成时,要求每个单词首字母都要大写。
class 类名 { class Person {
数据类型 成员变量名 = 初始值; String name;
} }
注意: 当成员变量由多个单词组成时,通常要求从第二个单词起每个单词的首 字母大写 。
new 类名(); new Person();
注意:
基本概念
a.使用引用数据类型定义的变量叫做引用型变量,简称为 “引用” 。
b.引用变量主要用于记录对象在堆区中的内存地址信息,便于下次访问。
语法格式
类名 引用变量名;
引用变量名.成员变量名;
例子:
Person p = new Person();
p.name = "Saber";
System.out.println(p.name);
编程实现Person类的定义和使用。
代码:
/**
* 项目名称:Person类的定义
* 项目功能:编程实现Person类的定义
* 作 者:SaberKing
* 版 本:v1.0
* 所 有 者:栾兆飞
* 备 注:请耐心敲代码哦!
*/
public class Person {
// 数据类型 成员变量名 = 初始值; - 其中=初始值 通常都省略不写
String name; // 用于描述姓名的成员变量
int age; // 用于描述年龄的成员变量
public static void main(String[] args) {
// 1.声明Person类型的引用指向Person类型的对象
// 数据类型(类名) 引用变量名 = new 类名();
Person p = new Person();
// 2.打印对象中的成员变量值
// 引用变量名.成员变量名
System.out.println("我是" + p.name + ",今年" + p.age + "岁了!"); // null 0
System.out.println("-----------------------------------------------------");
// 3.修改成员变量的数值
p.name = "Saber";
p.age = 17;
// 4.再次打印修改后的数值
System.out.println("我是" + p.name + ",今年" + p.age + "岁了!"); // Saber 17
}
}
图解执行流程和内存分析:
对象创建后,其成员变量可以按照默认的方式初始化,具体规则如下:
成员变量的类型 | 默认初始值 |
---|---|
数值类型:byte、short、int、long、float(0.0)、double(0.0)、char | 0 |
boolean 型 | false |
引用类型 | null |
class 类名 { class Person {
返回值类型 成员方法名(形参列表) { void show() {
成员方法体; System.out.println("没事秀一下!");
} }
} }
注意:当成员方法名由多个单词组成时,要求从第二个单词起每个单词的首字母大写。
形式参数主要用于将方法体外的数据内容带入到方法体内部。
形式参数列表主要指多个形式参数组成的列表,语法格式如下:
数据类型 形参变量名1, 数据类型 形参变量名2, …
当带入的数据内容是"hello"时,则形参列表写 String s 即可
当带入的数据内容是66和"hello"时,则形参列表写 int i, String s 即可
若该方法不需要带入任何数据内容时,则形参列表位置啥也不写即可。
引用变量名.成员方法名(实参列表);
p.show();
实际参数列表主要用于对形式参数列表进行初始化操作,因此参数的个数、类型以及顺序都要完全一致。
实际参数可以传递直接量、变量、表达式、方法的调用等。
图解:
基本数据类型的变量作为方法的参数传递时,形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各自独立的内存空间;
引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值,因为两个变量指向同一块内存空间;
当引用数据类型的变量作为方法的参数传递时,若形参变量改变指向后再改变指定的内容,则通常不会影响到实参变量指向内容的改变因为两个变量指向不同的内存空间。
class 类名 { class Person {
类名(形参列表) { Person() { - Person类中的构造方法
构造方法体; }
} }
}
创建两个对象的原理分析:
编程实现Point类的定义并向Point类添加构造方法
Point() 默认创建原点对象
Point(int i, int j) 根据参数创建点对象
代码见:课上代码。
编程实现为Point类添加重载的成员方法:
up() – 实现纵坐标减1的功能。
up(int dy) – 实现纵坐标减去参数指定数值的功能。
测试重载方法的调用规则
代码见:课上代码。
编程实现参数n的阶乘并返回,所谓阶乘就是从1累乘到n的结果。
代码:
// 自定义成员方法实现将参数n的阶乘计算出来并返回
// 1! = 1; 2! = 1*2; 3! = 1*2*3; ... n! = 1*2*3*...*n;
int show(int n) { // int n=5; int n = 4; int n = 3; int n = 2; int n = 1;
// 递推的方式
/*
int num = 1;
for(int i = 1; i <= n; i++) {
num *= i;
}
return num;
*/
/*
5! = 5 * 4 * 3 * 2 * 1;
4! = 4 * 3 * 2 * 1;
3! = 3 * 2 * 1;
2! = 2 * 1;
1! = 1;
5! = 5 * 4!;
4! = 4 * 3!;
3! = 3 * 2!;
2! = 2 * 1!;
1! = 1;
n! = n * (n-1)!;
*/
// 递归的方式
// 当n的数值为1时,则阶乘的结果就是1
if(1 == n) {
return 1;
}
// 否则阶乘的结果就是 n*(n-1)!
return n*show(n-1);
// show(5) => return 5*show(4); => 120
// show(4) => return 4*show(3); => 24
// show(3) => return 3*show(2); => 6
// show(2) => return 2*show(1); => 2
// show(1) => return 1; => 1
}
编程实现费式数列中第n项的数值并返回。
费式数列: 1 1 2 3 5 8 13 21 ……
代码见:课上代码。
图解递归分析:
图解递推分析:
提示用户输入班级的学生人数以及每个学生的信息,学生的信息有:学号、姓名,最后分别打印出来。
提示:Student[] arr = new Student[num];
代码见:课上代码。
图解引用类型对象的赋值过程(以案例代码为例):
JavaBean是一种Java语言写成的可重用组件,其它Java 类可以通过反射机制发现和操作这些JavaBean 的属性。
JavaBean本质上就是符合以下标准的Java类:
✔ 类是公共的
✔ 有一个无参的公共的构造器
✔ 有属性,且有对应的get、set方法
使用static关键字修饰成员变量表示静态的含义,此时成员变量由对象层级提升为类层级,也就是整个类只有一份并被所有对象共享,该成员变量随着类的加载准备就绪,与是否创建对象无关。
static关键字修饰的成员可以使用引用.的方式访问,但推荐类名.的方式。
图解:
语法格式:
public static void main(String[] args){}
参数使用的举例。
代码:
public class MainTest {
public static void main(String[] args) {
System.out.println("参数数组中元素的个数是:" + args.length);
System.out.println("传递给main方法的实际参数为:");
for(int i = 0; i < args.length; i++) {
System.out.println("下标为" + i + "的形参变量数值为:" + args[i]);
}
}
}
传参方式:
D:\你的java类路径>java MainTest 四糸乃 时崎狂三 五河琴里
参数数组中元素的个数是:3
传递给main方法的实际参数为:
下标为0的形参变量数值为:四糸乃
下标为1的形参变量数值为:时崎狂三
下标为2的形参变量数值为:五河琴里
当多个类之间有相同的特征和行为时,可以将相同的内容提取出来组成一个公共类,让多个类吸收公共类中已有特征和行为而在多个类型只需要编写自己独有特征和行为的机制,叫做继承。
在Java语言中使用extends(扩展)关键字来表示继承关系。
如:
public class Worker extends Person{} - 表示Worker类继承自Person类
其中Person类叫做超类、父类、基类。
其中Worker类叫做派生类、子类、孩子类。
使用继承提高了代码的复用性,可维护性及扩展性,是多态的前提条件
**子类不能继承父类的 构造方法 和 私有方法 **,但私有成员变量可以被继承只是不能直接访问。
例如:工人继承了人类,那么工人必然也要继承姓名和年龄,因为他不可能只有薪水等独有属性。
无论使用何种方式构造子类的对象时都会自动调用父类的无参构造方法,来初始化从父类中继承的成员变量,相当于在构造方法的第一行增加代码 super() 的效果。
图解子类对象创建过程:
使用继承必须满足逻辑关系:子类 is a 父类,也就是不能滥用继承。
Java语言中只支持单继承不支持多继承,也就是说一个子类只能有一个父类,但一个父类可以有多个子类。
如果孩子有好几个爹,都不分清谁是亲爹!
图解间接继承:
要求方法名相同、参数列表相同以及返回值类型相同,从Java5开始允许返回子类类型。
要求方法的访问权限不能变小,可以相同或者变大。
解释:因为子类是父类的扩展类,若访问权限变小,就失去了扩展的意义。
要求方法不能抛出更大的异常(异常机制)。
编程实现Animal类的封装,特征有:名字和毛色,要求提供打印所有特征的方法。
编程实现Dog类的封装并继承自Animal类,该类的特征有:牙齿数量,要求提供打印所有特征的方法。
编程实现DogTest类,在main方法中分别使用无参和有参方式构造Dog类型对象并打印特征。
代码见:课上代码。
修饰符 | 本类 | 同一个包中的类 | 子类 | 其他类 |
---|---|---|---|---|
public | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
protected | 可以访问 | 可以访问 | 可以访问 | 不能访问 |
默认 | 可以访问 | 可以访问 | 不能访问 | 不能访问 |
private | 可以访问 | 不能访问 | 不能访问 | 不能访问 |
在定义一个类时,除了定义类的名称一般还要指定一个包名,格式如下:
package 包名;
package 包名1.包名2.包名3…包名n;
为了实现项目管理、解决命名冲突以及权限控制的效果。
final关键字修饰类体现在该类不能被继承。
- 主要用于防止滥用继承,如:java.lang.String类等。
final关键字修饰成员方法体现在该方法不能被重写但可以被继承。
- 主要用于防止不经意间造成重写,如:java.text.Dateformat类中format方法等。
final关键字修饰成员变量体现在该变量必须初始化且不能改变。
- 主要用于防止不经意间造成改变,如:java.lang.Thread类中MAX_PRIORITY等。
父类类型 引用变量名 = new 子类类型();
如:
Shape sr = new Rect();
sr.show();
编程实现Shape类的封装,特征有:横纵坐标,要求提供打印所有特征的方法。
编程实现Rect类的封装并继承自Shape类,特征有:长度和宽度。
编程实现ShapeRectTest类,在main方法中分别创建Shape和Rect类型对象并打印特征。
代码见:课上代码。
引用数据类型之间的转换方式有两种:自动类型转换 和 强制类型转换。
自动类型转换主要指小类型向大类型的转换,也就是子类转为父类,也叫做向上转型。
强制类型转换主要指大类型向小类型的转换,也就是父类转为子类,也叫做向下转型或显式类型转换。
引用数据类型之间的转换必须发生在父子类之间,否则编译报错。
若强转的目标类型并不是该引用真正指向的数据类型时则编译通过,运行阶段发生类型转换异常。
为了避免上述错误的发生,应该在强转之前进行判断,格式如下:
if(引用变量 instanceof 数据类型)
判断引用变量指向的对象是否为后面的数据类型
抽象方法主要指不能具体实现的方法并且使用abstract关键字修饰,也就是没有方法体。
具体格式如下:
访问权限 abstract 返回值类型 方法名(形参列表);
public abstract void cry();
银行有 定期账户和活期账户。继承自 账户类。账户类中:
public class Account{
private double money;
public double getLixi(){}
}
名称 | 关键字 | 关系 |
---|---|---|
类和类之间的关系 | 使用extends关键字表达继承关系 | 支持单继承 |
类和接口之间的关系 | 使用implements关键字表达实现关系 | 支持多实现 |
接口和接口之间的关系 | 使用extends关键字表达继承关系 | 支持多继承 |
定义抽象类的关键字是abstract class,而定义接口的关键字是interface(定义关键字不同)。
继承抽象类的关键字是extends,而实现接口的关键字是implements。
继承抽象类支持单继承,而实现接口支持多实现。
抽象类中可以有构造方法,而接口中不可以有构造方法。
抽象类中可以有成员变量,而接口中只可以有常量。
抽象类中可以有成员方法,而接口中只可以有抽象方法。
抽象类中增加方法时(可能增加的是成员方法)子类可以不用重写,而接口中增加方法时实现类需要重写(Java8以前的版本)。
从Java8开始增加新特性,接口中允许出现非抽象方法和静态方法,但非抽象方法需要使用default关键字修饰。
从Java9开始增加新特性,接口中允许出现私有(包括静态的)方法。
访问修饰符 class 外部类的类名 {
访问修饰符 class 内部类的类名 {
内部类的类体;
}
}
访问修饰符 class 外部类的类名 {
访问修饰符 static class 内部类的类名 {
内部类的类体;
}
}
访问修饰符 class 外部类的类名 {
访问修饰符 返回值类型 成员方法名(形参列表) {
class 内部类的类名 {
内部类的类体;
}
}
}
局部内部类只能在该方法的内部可以使用。
局部内部类可以在方法体内部直接创建对象。
局部内部类不能使用访问控制符和static关键字修饰符。
局部内部类可以使用外部方法的局部变量,但是必须是final的。由于局部内部类和局部变量的声明周期不同所致。
注意:
接口/父类类型 引用变量名 = new 接口/父类类型() { 方法的重写 };
// 从Java8开始提出新特性lamda表达式可以简化上述代码,格式为:(参数列表) -> {方法体}
所有的枚举类都继承自 java.lang.Enum 类,常用方法如下:
方法声明 | 描述 |
---|---|
static T[] values() | 返回当前枚举类中的所有对象 |
String toString() | 返回当前枚举类对象的名称 |
int ordinal() | 获取枚举对象在枚举类中的索引位置 |
static T valueOf(String str) | 将参数指定的字符串名转为当前枚举类的对象 |
int compareTo(E o) | 比较两个枚举对象在定义时的顺序 |
访问修饰符 @interface 注解名称 {
注解成员;
}
自定义注解自动继承java.lang.annotation.Annotation接口。
通过 @注解名称 的方式可以修饰包、类、 成员方法、成员变量、构造方法、参数、局部变量的声明等。
@Target用于指定被修饰的注解能用于哪些元素的修饰,取值如下:
取值 | 描述 |
---|---|
ElementType.ANNOTATION_TYPE | 可以给一个注解进行注解 |
ElementType.CONSTRUCTOR | 可以给构造方法进行注解 |
ElementType.FIELD | 可以给属性进行注解 |
ElementType.LOCAL_VARIABLE | 可以给局部变量进行注解 |
ElementType.METHOD | 可以给方法进行注解 |
ElementType.PACKAGE | 可以给一个包进行注解 |
ElementType.PARAMETER | 可以给一个方法内的参数进行注解 |
ElementType.TYPE | 可以给类型进行注解,比如类、接口、枚举 |
预制注解就是Java语言自身提供的注解,具体如下:
名称 | 作用 |
---|---|
@author | 标明开发该类模块的作者,多个作者之间使用,分割 |
@version | 标明该类模块的版本 |
@see | 参考转向,也就是相关主题 |
@since | 从哪个版本开始增加的 |
@param | 对方法中某参数的说明,如果没有参数就不能写 |
@return | 对方法返回值的说明,如果方法的返回值类型是void就 不能写 |
@exception | 对方法可能抛出的异常进行说明 |
@Override | 限定重写父类方法, 该注解只能用于方法 |
@Deprecated | 用于表示所修饰的元素(类, 方法等)已过时 |
@SuppressWarnings | 抑制编译器警告 |
面向对象编程的概念(理解)
对象、面向对象、面向面向对象编程…
类和对象的引用(重中之重)
类和对象、类的定义、成员变量的定义、对象的创建、引用的定义…
成员方法(重中之重)
语法格式、详解、调用格式、传参过程…
构造方法(重中之重)
语法格式、默认构造方法、实现成员变量初始化
方法重载(重点)
概念、体现形式、实际意义
this关键字(原理)
概念、原理、使用方式
递归(难点)
概念、使用原则
封装(重中之重)
概念、实现流程
static关键字
概念、使用方式、构造块和静态代码块、单例设计模式(饿汉式和懒汉式)…
继承
概念、特点、方法的重写、重写的原则、IDEA的使用…
访问控制
public、private、package、import…
final关键字
概念、修饰类、成员方法、 成员变量、常量…
多态(重中之重)
基本概念、语法格式、多态的特点、类型转换、instanceof、实际意义…
抽象类(重点)
抽象方法、抽象类、抽象类和抽象方法的关系、实际意义…
接口(重点)
基本概念、常量、抽象方法、弥补不能多继承的不足、借壳和类之间的关系、抽象类和接口的主要区别…
内部类
概念、普通内部类、静态内部类、局部内部类、匿名内部类、回调模式…
枚举类型
概念、自定义枚举、enum关键字、默认继承Enum类、实现接口…
注解
概念、自定义注解、使用、元注解(保持、文档、目标、继承【注解的使用可被继承】、可重复)、预制注解…
Gitee仓库地址