第四章:面向对象编程(上)

2021320

11:35

一、Java面向对象学习的三条主线(4-6)

 * 1.Java类及类的成员:属性、方法、构造器;代码块、内部类

 * 2.面向对象的三大特征:封装性、继承性、多态性、(抽象性) 重点关注在代码上的体现

 * 3.其它关键字:thissuperstaticfinalabstractinterfacepackageimport

 

属性常用的权限修饰符:privatepublic、缺省、protected

 

属性:类的属性,根据其类型,都有默认初始化值、

局部变量:没有默认初始化值。意味着,我们在调用局部变量之前,一定要显性赋值。特别地:形参在调用时赋值即可

 

java规定的4种权限修饰符:privatepublic、缺省、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. 当调用可变个数形参的方法时,传入的参数个数可以是:01个,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不同),不能被staticfinalsynchronizedabstractnative修饰,不能有return语句返回值

系统提供的默认构造器的权限跟类的权限一样

 

总结:类中属性赋值的先后顺序

 * 默认初始化

 * 显式初始化

 * 构造器中初始化

 *

 * 通过"对象.方法""对象.属性"的方式赋值

所谓javaBean,是指符合如下标准的Java类:

   类是公共的

   有一个无参的公共的构造器

   有属性,且有对应的getset方法

 

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 创建。 版权所有:古木苏