第四章:面向对象编程(上)
2021年3月20日
11:35
一、Java面向对象学习的三条主线(4-6章)
* 1.Java类及类的成员:属性、方法、构造器;代码块、内部类
* 2.面向对象的三大特征:封装性、继承性、多态性、(抽象性) 重点关注在代码上的体现
* 3.其它关键字:this、super、static、final、abstract、interface、package、import等
属性常用的权限修饰符:private、public、缺省、protected
属性:类的属性,根据其类型,都有默认初始化值、
局部变量:没有默认初始化值。意味着,我们在调用局部变量之前,一定要显性赋值。特别地:形参在调用时赋值即可
java规定的4种权限修饰符:private、public、缺省、protected
return后面不可以声明表达式
方法的使用中,可以调用当前类的属性或方法(通常是调用其他方法。特别地:方法A中又调用了方法A:递归方法)
方法中不可以定义方法
Math.PI π
给对象数组冒泡排序的时候,不用new一个新的对象,直接声明一个新对象,把地址赋值就可以了
// Student2 temp = new Student2(); // 这里不用new一个对象,直接声明一个变量,把地址交换就可以了 Student2 temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; |
匿名对象只能调用一次
new Phone().showPrice();
一般开发中使用,都是作为形参
PhoneMall mall = new PhoneMall();
mall.show(new Phone());
这里创建一个匿名对象,作为mall的show方法的形参,可以在mall的show方法里多次使用
方法的重载(overload):
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数
类型不同即可。
重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类
型)。调用时,根据方法参数列表的不同来区别。
形参的顺序不同也算不同,构成重载!比如:
// 构成重载 public void getSum(String s, int i) {} public void getSum(int i,String s) {} |
判断是否是重载跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系
如果传的形参没有符合其类型值的重载方法,传的形参会进行自动类型提升寻找符合其类型值的重载方法
比如test(1,2);会先寻找两个int的方法,如果没有两个int,但是有两个double的,会调用形参为两个double的方法。如果有两个double和两个int的,但是double在上面,int在下面,同样会调用两个int的方法,优先看类型,跟顺序无关。
可变个数形参
* 1. 可变个数形参的格式:数据类型 ... 变量名
* 2. 当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个,...
* 3. 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
* 4. 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存
* 4.1 调用的时候跟数组一样,变量名[下标],也可以获取length属性
* 4.2 传参的时候可以传多个参数,也可以直接传一个数组 test.show("hello","world");
test.show(new String[]{"hello","world"});
* 5. 可变个数形参在方法的形参中,必须声明在末尾,所以最多只能声明一个可变形参
关于变量的赋值:
如果变量是基本数据类型,此时赋值的是变量所保存的数据值
如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值
关于形参的值传递机制:
* 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值
* 如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值
递归在调用的时候,出现n-m,就要有m个if语句判断,提供m个初始值,结束对自身方法的调用。
public int getFibonacci(int n) { // n-2,所以要有两个值来终止循环 if(n == 0) { return 0; }else if(n == 1) { return 1; }else { int fibonacciN = getFibonacci(n - 1) + getFibonacci(n - 2); return fibonacciN; } } |
我们程序设计追求“高内聚,低耦合”。
Ø 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
Ø 低耦合 :仅对外暴露少量的方法用于使用。
private int legs;
public void setLegs(int l){};
public int getLegs(){};
针对于属性legs就体现了封装性:
我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
Java规定的4种权限(从小到大排列): private、缺省、protected、public
总结封装性:Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小
构造器(或构造方法、constructor)
二、说明
* 1.如果没有显式地定义类的构造器的话,则系统默认提供一个空参的构造器
* 2.定义构造器的格式:权限修饰符 类名(形参列表){}
* 3.一个类中定义的多个构造器,彼此构成重载
* 4.一旦我们显式地定义了类的构造器之后,系统就不再提供默认的空参构造器
* 5.一个类中,至少会有一个构造器
构造器不声明返回值类型(与声明为void不同),不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
系统提供的默认构造器的权限跟类的权限一样
总结:类中属性赋值的先后顺序
* ① 默认初始化
* ② 显式初始化
* ③ 构造器中初始化
*
* ④ 通过"对象.方法"或"对象.属性"的方式赋值
所谓javaBean,是指符合如下标准的Java类:
> 类是公共的
> 有一个无参的公共的构造器
> 有属性,且有对应的get、set方法
UML类图
this可以用来修饰:属性、方法、构造器
this修饰属性和方法:此时的this理解为当前对象或当前正在创建的对象
this调用构造器:
① 我们在类的构造器中,可以显式地使用"this(形参列表)"方式,调用本类中指定的其他构造器
② 构造器中不能通过"this(形参列表)"方式调用自己
③ 如果一个类中有n个构造器,则最多有 n - 1 个构造器中使用了"this(形参列表)"
④ 规定: "this(形参列表)"必须声明在当前构造器的首行
⑤ 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器
package关键字的使用
* 1. 使用package声明类或接口所属的包,声明在源文件的首行
* 2. 包,属于标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名知意”
* 3. 每"."一次,就代表一层文件目录
同一个包下,不能命名同名的接口、类
不同的包下,可以命名同名的接口、类
二、import关键字的使用
* import: 导入
* 1. 在源文件中显式地使用import结构导入指定包下的类、接口
* 2. 声明在包的声明和类的声明之间
* 3. 如果需要导入多个结构,则并列写出即可
* 4. 可以使用"xxx.*"的方式,表示可以导入xxx包下的所有结构
* 5. 如果使用的类或接口是java.lang包下定义的,则可以省略import结构
* 6. 如果使用的类或接口是本包下定义的,则可以省略import结构
* 7. 如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示(比如com.atguigu.java.bank.Account a = new com.atguigu.java.bank.Account();)
* 8. 使用"xxx.*"方式表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要显式导入
*
* 9. import static 导入指定类或接口中的静态结构:属性或方法(比如import static java.lang.System.*;导入后可以直接用out.print();来输出)
类一定有构造器,创建对象必须要用到构造器(后面反射也是,虽然没有new了,但还是用构造器创建的对象)
结尾
使用 Microsoft OneNote 2016 创建。 版权所有:古木苏