一.面向对象的基本概念
万物皆对象。对象的实质是属性和行为。
类是具有共同属性和行为的对象的集合。类定义了对象的属性和方法。
分析过程现有对象后有类,开发过程先有类后有对象。
二.类的基本结构
属性:对象数据的描述
方法:对象的行为
构造方法:用于实例化对象
内部类:在类中声明的类(inner class)
块:分静态块与实例块
类的创建
基本概念
a.使用引用数据类型定义的变量叫做引用型变量,简称为"引用"。
b.引用变量主要用于记录对象在堆区中的内存地址信息,便于下次访问。
// 语法格式
Person p = new Person(); // 类名 引用变量名;
p.name = "张飞"; // 引用变量名.成员变量名;
三.属性
属性可理解为对象的数据。
注:属性有称成员变量,是声明在类中的变量,在方法体中声明的变量称为局部变量或临时变量
// 声明方式:(访问权限修饰符)(修饰符)数据类型 属性名 =(初值)
private int age = 18;
属性变量的初始值
对象创建后,其属性变量可以按照默认的方式初始化,具体规则如下
属性变量的类型 | 默认初始值 |
---|---|
数值类型 byte、short、int、long、float、double、char | 0 |
boolean型 | false |
引用类型 | null |
--- | --- |
四.方法
方法即对象的行为,为定义在类中的具特定功能的一段独立的小程序,方法也称为函数
方法运行后的返回结果的数据类型,如果没有返回值使用void
声明形式:
(访问权限修饰符)(修饰符)返回值数据类型 方法名(形式参数列表){
执行语句(方法体);
return;
}
pubilc static String show() {
System.out.println("没事秀一下!");
return "没事秀一下";
}
参数类型: 形式参数的数据类型
形式参数: 就是一个变量,用于存储调用方法时传递给方法的实际参数
return 用于结束方法
返回值: 该方法执行后的结果,该结果会返回给调用者
形参列表的详解
形式参数主要用于将方法体外的数据内容带入到方法体内部。
形式参数列表主要指多个形式参数组成的列表,语法格式如下: 数据类型 形参变量名1, 数据类型 形参变量名2, ...
当带入的数据内容是"hello"时,则形参列表写 String s 即可
当带入的数据内容是66和"hello"时,则形参列表写 int i, String s 即可
若该方法不需要带入任何数据内容时,则形参列表位置啥也不写即可。
方法体的详解
- 成员方法体主要用于编写描述该方法功能的语句块。
- 成员方法可以实现代码的重用,简化代码。
返回值类型的详解
返回值主要指从方法体内返回到方法体外的数据内容。
返回值类型主要指返回值的数据类型,可以是基本数据类型,也可以是引用数据类型。
当返回的数据内容是66时,则返回值类型写 int 即可
在方法体中使用return关键字可以返回具体的数据内容并结束当前方法。
当返回的数据内容是66时,则方法体中写 return 66; 即可
当该方法不需要返回任何数据内容时,则返回值类型写void即可。
方法的调用
格式:引用变量名.成员方法名(实参列表);
实际参数列表主要用于对形式参数列表进行初始化操作,因此参数的个数、类型以及顺序都要完全一致。
实际参数可以传递直接量、变量、表达式、方法的调用等。
可变长参数
格式: 返回值类型 方法名(参数的类型... 参数名)
方法参数部分指定类型的参数个数是可以改变的,也就是0~n个 。
一个方法的形参列表中最多只能声明一个可变长形参,并且需要放到参数列表的末尾。
方法的特点
定义方法可以将功能代码进行封装。
便于该功能进行复用。 方法只有被调用才会被执行。
方法的出现提高代码的复用性。
方法若没有返回值,则用关键字void表示,那么该方法中的return语句如果在最后一行可以省略不写。
方法中可以调用方法,不可以在方法内部定义方法。
定义方法时,方法的结果应返回给调用者,交由调用者来处理
构造方法的基本概念
构造方法名与类名完全相同并且没有返回值类型,连void都不许有。
默认构造方法
当一个类中没有定义任何构造方法时,编译器会自动添加一个无参空构造构造方法,叫做默认/缺省构造方法,如:Person(){}
若类中出现了构造方法,则编译器不再提供任何形式的构造方法。
构造方法的作用
- 使用new关键字创建对象时会自动调用构造方法实现成员变量初始化工作。
五.方法的重载
- 若方法名称相同,参数列表不同,这样的方法之间构成重载关系 (Overload)
- 解释为: 方法名相同、参数不同(数量不同、类型不同、顺序不同)、同一作用域,
重载的体现形式
方法重载的主要形式体现在:参数的个数不同、参数的类型不同、参数的顺序不同,与返回值类型和形参变量名无关,但建议返回值类型最好相同。
判断方法能否构成重载的核心:调用方法时能否加以区分
class Person { // class 类名
Person() { // 类名(形参列表)
// 构造方法体;
}
}
pubilc class Test{
viod show() {
System.out.println("show()");
}
// 体现在方法参数的个数不同
viod show(int i) {
System.out.println("输出 i 的值:" + i);
}
// 体现在方法参数的个数不同
viod show(int i, String n) {
System.out.println("输出 i 的值:" + i + ", 输出 n 的值:" + n);
}
// 体现在方法参数的类型不同
viod show(int i, doule n) {
System.out.println("输出 i 的值:" + i + ", 输出 n 的值:" + n);
}
// 体现在方法参数的类型顺序不同
viod show(doule n, int i) {
System.out.println("输出 i 的值:" + i + ", 输出 n 的值:" + n);
}
// error 与参数的变量名无关 (会报错)
viod show(doule p, int s) {
System.out.println("输出 p 的值:" + p + ", 输出 s 的值:" + s);
}
pubilc static void main (String[] args) {
Test ts = new Test();
ts.show(); // show()
ts.show(18); // 输出 i 的值:18
ts.show(18, "张三"); // 输出 i 的值:18, 输出 n 的值: 张三
ts.show(18, 10.0); // 输出 i 的值:18, 输出 n 的值: 10.0
ts.show(9.9, 20); // 输出 i 的值:9.9, 输出 n 的值: 20
}
}
重载的实际意义
方法重载的实际意义在于调用者只需要记住一个方法名就可以调用各种不同的版本,来实现各种不同的功能。
如:java.io.PrintStream类中的println方法。
六.this关键字
this的基本概念
若在构造方法中出现了this关键字,则代表当前正在构造的对象。
若在成员方法中出现了this关键字,则代表当前正在调用的对象。
this关键字本质上就是当前类类型的引用变量。
使用方式
当局部变量名与成员变量名相同时,在方法体中会优先使用局部变量(就近原则),若希望使用成员变量,则需要在成员变量的前面加上this.的前缀,明确要求该变量是成员变量(重中之重)。
this关键字除了可以通过this.的方式调用成员变量和成员方法外,还可以作为方法的返回值(重点)。
在构造方法的第一行可以使用this()的方式来调用本类中的其它构造方法
通俗的说: 谁调用this就是谁
注意事项
引用类型变量用于存放对象的地址,可以给引用类型赋值为null,表示不指向任何对象。
当某个引用类型变量为null时无法对对象实施访问(因为它没有指向任何对象)。此时,如果通过引用访问成员变量或调用方法,会产生NullPointerException 异常。
七.方法递归调用
递归的基本概念
递归本质就是指在方法体的内部直接或间接调用当前方法自身的形式。
注意事项
- 使用递归必须有递归的规律以及退出条件。
- 使用递归必须使得问题简单化而不是复杂化。
- 若递归影响到程序的执行性能,则使用递推取代之。
递归方法:
private static int fun(int num) {
if(num == 1 || num == 2){
return 1;
}else{
return fun(num - 1) + fun(num - 2);
}
}
另一种方法 (递推方法):
private static int fun2(int num){
int f1 = 1, f2 = 1, f = 0;
if(num <= 2){
return 1;
}else{
for(int i = 3; i <= num; i++){
f = f1 + f2;
f1 = f2;
f2 = f;
}
}
return f;
}
面试题
1. 下列说法正确的是 [多选题]
A、C 语言是一门面向过程的编程语言。
B、C++语言是一门面向过程的编程语言。
C、C++语言是一门面向对象的编程语言。
D、Java 语言是一门面向对象的编程语言。
正确答案是:AD
具体解析如下:
- C++语言是一门既面向过程又面向对象的编程语言
2. 对象创建后会对成员变量进行默认初始化,下面正确的是 [多选题]
A、数值类型的成员变量会被初始化为 0。。
B、布尔类型的成员变量会被初始化为 true。
C、引用类型的成员变量会被初始化为 null。
D、引用类型的成员变量会被初始化为””。
正确答案是:AC
具体解析如下:
- 布尔类型的成员变量会被初始化为 false,引用类型的成员变量被初始化为 null而不是””。
3. 下列关于类的描述正确的是 [多选题]
A、在类中定义的特征可以在成员方法中直接使用不需要引用。
B、在类中定义的成员方法可以在成员方法中直接使用不需要引用。
C、在类中定义的特征可以在 main 方法中直接使用不需要引用。
D、在类中定义的成员方法可以在 main 方法中直接使用不需要引用。
正确答案是:AB
具体解析如下:
- 在 main 方法中访问类中定义的特征和成员方法时需要使用引用.的方式进行。
4. 正规的开发中都需要正确的使用命名规范,下面的规范正确的的是 [多选题]
A、类名由多个单词组成时要求第一个单词的首字母小写。
B、特征名由多个单词组成时要求第一个单词的首字母小写。
C、成员方法名由多个单词组成时要求第一个单词的首字母小写。
D、引用变量名由多个单词组成时要求第一个单词的首字母小写。
正确答案是:BCD
具体解析如下:
- 类名由多个单词组成时要求每个单词的首字母都要大写。
5. 关于方法传参的描述,下列正确的是 [多选题]
A、基本数据类型的变量作为方法的参数传递时,形参变量数值的改变不会影响到实参变量的数值。
B、基本数据类型的变量作为方法的参数传递时,形参变量数值的改变会影响到实参变量的数值。
C、引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变不会影响到实参变量指向内容的数值。
D、引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值。
正确答案是:AD
具体解析如下:
基本数据类型的变量作为方法的参数传递时,形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各自独立的内存空间。
引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值,因为两个变量指向同一块内存空间。
当引用数据类型的变量作为方法的参数传递时,若形参变量改变指向后再改变指定的内容,则通常不会影响到实参变量指向内容的改变,因为两个变量指向不同的内存空间。
6. 关于构造方法的描述正确的是 [多选题]
A、构造方法必须与类名相同。
B、构造方法可以通过引用.的方式调用。
C、构造方法返回值类型只能为 void。
D、构造方法可以没有参数。
正确答案是:AD
具体解析如下:
- 方法名必须与类名相同
- 可以有 0 个、1 个或多个参数
- 没有任何返回值,包括 void
- 默认返回类型就是对象类型本身
- 只能与 new 运算符结合使用
7. 下面哪个方法是 public void method(String s, int i)的重载方法 [多选题]
A、public void method(int i, String s)
B、public void method(int i, int j)
C、public int method(String s, int i)
D、public void method(String a, int b)
正确答案是:AB
8. 下列关于 this 关键字的描述正确的是 [多选题]
A、this 关键字本质上就是本类类型的一个引用变量。
B、this 关键字用于方法体中可以区分同名的形参变量和局部变量。
C、使用 this()的方式可以调用本类中的其它构造方法。
D、this 关键字不能作为方法的返回值。
正确答案是:AC