[课堂笔记]四.面向对象

时间:2022-09-20 08:56:31

1 面向过程的编程思想

      以流程为基本单位,注重最后功能的实现。

      缺点:代码的耦合性很高,不利于程序的维护和后期功能的扩展。

2 面向对象的编程思想

     在现实生活中,把一个事物看作是一个整体,从事物的属性(特征)和行为(功能)两个方面进行描述。

     特点:

               面向对象的编程中一定会用到面向过程的编程思想;

               所有的编程语言都是来源于生活服务于生活

               面向对象的编程思想更加接近于现实生活中人类的正常思维方式;

               面向对象的编程语言中有设计模式一说;

               面向对象有四大特征:抽象,封装,继承,多态。

    

  3 对象

     现实生活中具体存在的一个事物。

     万事万物皆对象。

     特征:①无论两个事物多么相似或相近,永远都是两个不同的对象。

               ②一项法律,法规,政策,规章制度也都是对象。

4 抽象

   定义:同一类*有的属性(特征)和行为(功能)进行抽取,归纳,总结。

   其实抽象就是对同一类事物进行整体的概括性的描述。

5 封装

  所谓的封装,也就是包装,就是把抽象出来的属性和行为进行包装。

  目的:提高了抽象出来的属性和行为的安全系数。

  分类:属性的封装;

            方法(功能)的封装。

  注意:封装不是绝对的封装,在适当的时候,可以通过其他方法来访问封装中的属性和方法。

           一个完整的封装一定是把属性和方法封装在一起,属性的封装和方法的封装是密不可分的。

6 类

   抽象封装的具体呈现方式就是类。

   类和对象的关系:

         类是对对象的抽象;

         对象是类的实例化。

   语法:[访问修饰符] class 类名{    }

   类的命名:大驼峰命名法——首字母要大写,如果由多个单词组成,则每个单词的首字母都要大写。

7 方法

   方法就是用来实现某种功能效果的代码块。

   ① 无返回值无参数的方法

        [访问修饰符] void 方法名称(){}

        void 就是表示无返回值的方法。

   ② 无返回值有参数的方法

        [访问修饰符] void 方法名称(参数列表){}

        方法中的参数称为形参(形式参数),即 数据类型 参数名称。如果有多个参数,用逗号隔开即可。

        在调用有参数的方法时,需要传递具体数据。(实参即为实际参数)。

        在传递参数时,一定要和方法中参数的顺序一致。

    ③ 有返回值无参数的方法

        [访问修饰符] 返回值类型 方法名称(){

                  return 返回值;

           }       

       返回值的类型由返回值来决定,而且有返回值的方法只能一次返回一个值。

     ④有返回值有参数的方法

       [访问修饰符] 返回值类型 方法名称(参数列表){

                  return 返回值;

           }       

8 对象的创建和使用

   构造方法

        ①没有void也没有返回值

        ②方法名称和类名相同

        ③不能被static等关键字修饰

    语法:[访问修饰符] 类名(参数列表){}

    创建对象的语法:类名 对象名称=new 构造方法();

    对象的使用:

         对象可以调用属性和方法: 对象名称.属性名称;

                                                 对象名称.属性名称=属性值;

                                                 对象名称.方法名称(参数列表);

    构造方法的作用:①创建对象

                              ②对成员属性(全局变量)进行初始化


    构造方法的分类:

        无参数的构造方法

              隐式无参数的构造方法

              显示无参数的构造方法

        有参数的构造方法

      注意:
               ①当一个类中,没有任何形式的构造方法时,那么JVM会为当前的类提供一个隐式的无参数的构造方法。
               ②无参数的构造方法又叫默认的构造方法。
               ③有参数的构造方法,在使用时,需要传递实参。
               ④ 如果一类中已经存在一个有参数的构造方法,那么还想通过无参数的构造方法创建对象,则可以直接在当前类中添加一个无参数的构造方法。
               ⑤当一个类中,已经显示的存在了一个任何形式的构造方法,那么JVM都不会再为当前类提供一个隐式的无参数的构造方法了。
               ⑥一个类中可以有多个构造方法,但是构造方法的参数不能相同。

9 方法重载

    方法重载是多态的一种表现。

    多态:就是同一个事物,在不同的情况下有多种表现形式。(水)

    在同一个类中,有多个方法名称相同,但是参数列表不同,参数列表的不同包括(个数,类型,顺序的不同),这就是方法重载。
  

     注意:
        普通方法,构造方法都可以方法重载
        方法的返回值类型不同,不能算方法的重载
10 this关键字

     注意:
        当方法中的参数名称或者局部变量名称和成员属性名称一致时,会以参数名称或局部变量为主。(就近原则)
    前提条件:
        this只能在没有被static修饰的方法中使用。

    作用:
        this表示对当前类的某个对象的引用。(就是说可以把this 关键字当作对象来使用)。

    注意:哪个对象调用该方法,那么该方法中的this关键字就指向调用该方法的对象。

    用法:
         当方法中的参数名称或方法中的局部变量名称和类中的成员属性(全局变量)名称完全一致时,需要用this来区分作用域。

         当this(参数列表)的形式,出现在构造方法的第一句代码时,就表示当前的构造方法,调用了该类中其它的构造方法。

11 代码执行的流程

      普通方法之间的调用,之间写方法名称即可,无需通过对象来调用。
       main-->调用其它方法--->main 方法

12 方法中参数的传递

    在Java中基本数据类型和引用数据类型进行参数传递时,都是采用的值传递(就是都是传递的具体的数据)。

    基本数据类型传递的是值得本身(基本数据类型传递时,就是把本身复制了一份进行传递,无论目标方法怎么更改和这个值得本身没有任何关系)

    引用数据类型传递的是值本身所在的内存地址

13 打包

    通过package来创建带包的类,语法:
        package 包名;

    注意:包名的目录层次通过【.】来表示。

    编译带包的类,如果从当前目录生成带包结构的字节码,语法:

        javac -d . 类名.java

    如果从指定的目录生成,带包结构的字码,语法:
        javac -d 目录 类名.java

    运行带包的字节码,语法:

        java 包名.类名;

    注意:包名.类名又叫类的全限定名.

14 导包

    通过import导入目标类所在的包,语法:

    import 包名.类名;或者 import 包名.*;

    注意:
        import一定要位于Package语句的下面

        如果两个类位于同一个包中,无需导包。


15 继承
    特点:
        ①具有一定的层次关系,并且具有可传递性。
        ②子类继承了父类中所有的属性和方法,但是私有属性(private)和构造方法无法被继承。
        ③子类也可以拥有属于自己的属性和方法。
        ④在Java中继承只支持单一继承,也就是说一个子类只能有一个父类,但是一个父类可以拥有多个子类。
        ⑤判断继承的关系是否成立,可以通过“is-a”是一个

    作用:提高代码的重用性。
    语法:

        [访问修饰符] class 子类 extends 父类{  }
    注意:一个源文件中可以包含多个类,但是只能有一个类带访问修饰符,而且类名要和文件名一致。

16 super关键字

    注意:当创建有继承关系子类的对象时,JVM会先调用父类中无参数的构造方法,创建父类的对象;然后再调用子类的构造方法,创建子类对象。

              当创建子类的对象时,Java编译器默认只会调用父类中无参数的构造方法来创建父类的对象,所以,当父类中没有无参数的构造方法时,则编译出错。
    位置:super关键字只能出现在有继承关系的子类中。

    作用:super关键字表示对当前类父类对象的引用


    目的:就是显示的明确的告诉JVM当前属性或方法来自于父类。

    用法:

        ①调用父类中的普通属性和方法:
           在子类中可以通过super关键字,明确的告诉其他人,该属性或方法来自于父类。
              super.属性名称;//父类对象.属性
              super.方法名称;//父类对象.方法

        ②调用父类中的构造方法:
            super关键字以super(参数列表)的形式,出现在子类构造方法的第一句代码时,就表示
            显示的告诉java编译器要调用指定的父类的构造方法来创建父类的对象。

17 java.lang包

    位于java.lang包中的类,无需导包,可以直接使用。因为java.lang包中存放都是java中常用的核心类。
    根类、基类、超类都是指的父类


18 Object类

    java.lang.Object类是所有java类的父类。
    如果在创建类时,没有明确指明父类,则默认就继承自Object类。

19 访问修饰符

    java中的访问修饰符可以用来修饰当前元素的作用范围
    private一般用来修饰属性
    方法一般用public来修饰
    类一般用public或者默认来修饰

20 方法重写

     方法重写也是多态的一种表现。
     注意:方法重写,只能发生在有继承关系的子类中,是子类重写父类中的方法。
     目的:当从父类中继承过来的方法,满足不了子类的需求时,子类可以在父类方法的基础上进行改造。
     定义:
        子类重写父类中的方法,就要和父类中的方法名称,参数列表返回值类型完全一致,而且访问修饰符的范围不能被缩小。

21 final关键字

     用法:
        ①final修饰变量等同于常量,一旦赋值就永远不能更改
        ②final修饰方法中的参数,称为最终参数,在调用该方法时,给参数传递数据,在方法体内也无法再次给参数重新赋值。
        ③final修饰类,类不能被继承。
        ④final修饰的方法,不能被重写。

22 向上转型
    创建一个子类的对象赋值给父类就是向上转型.(因为父类的范围包括了子类的范围,所以可以直接把一个子类对象赋值给父类)。

    例如:
        父类  对象=new 子类();

    所谓的动态绑定机制(延迟绑定)就是在程序运行期间,会判断对象的真正的创建者,对象是谁创建的,就调用哪个类中的方法

    动态绑定机制的条件:
          ①继承
          ②要有重写
          ③要有向上转型
          ④要用向上转型的对象调用被子类的重写的方法就会发生动态绑定机制(延迟绑定).

    注意:向上转型的对象可以当做是一个父类对象来用,只有符合动态绑定机制的条件才会发生动态绑定机制。

23 向下转型
    定义:向下转型就是把一个父类对象,强制转换成某个子类,需要加上强制转换符。
    注意:不能直接把一个父类对象强制转换成某个子类;向下转型一定是在向上转型的基础上,做类型的还原

    可以通过instanceof关键字判断,某个对象是否属于指定的类。
    语法:
        对象 instanceof 类名/接口名称;
24 static关键字

main方法是静态的?不需要实例化对象

VM调用这个方法不需要创建任何包含这个main方法的实例

     ①static表示静态的。
     ②static可以修饰类,属性,方法,静态代码块。

     ③static关键字可以修饰属性,方法,称为静态属性(类属性)和静态方法(类方法).    。

     ④Java中存在类属性类方法,还存在一种叫做实例属性和实例方法。  
     ⑤类属性和类方法都属于类,而不属于任何一个对象,所以可以通过类名.属性或者类名.方法名称的方式来调用。

      实例属性和方法是属于对象的,所以在调用属性和方法的时候,都要通过对象来调用。

     ⑥实例属性的特点:只有创建了对象,实例属性才会有对应的内存空间
                                  每个对象都可以拥有属于自己的属性值,对象之间的属性不会共享。

     ⑦类属性和类方法副本只有一个(也就是说只被JVM加载一次),无论创建多少个对象,这些对象在使用类属性和类方法的时候,都是使用的同一个。

     ⑧ static修饰变量称为静态变量(类变量),可以通过:类名.变量名来调用。

     ⑨注意:
           在静态方法中只能调用静态方法或者静态属性
           在非静态方法中可以调用静态方法和静态属性
           在静态方法中不能使用this和super关键字

     ⑩static修饰代码块为静态代码块,只能出现在任何方法的外部,类的内部。

        静态代码块,作用:主要是用来给成员静态属性进行初始化,或者初始化加载一些参数。
        语法:
           static{    }

25 成员属性(全局变量)默认值
    在Java中,所有的成员属性(全局变量)JVM都会根据数据类型赋一个默认值。
            数值类型的默认值都是0;
            char类型默认值是a
            boolean类型默认值是false
            所有引用类型的默认值都是null;          
26 单态设计模式
        设计模式:就是开发软件的一种方式或者方法。
        单态设计模式:就是为了保证某个类的对象,在整个系统中只有一个。
           
27 抽象类

     当一个类中没有足够的信息去描述一个具体的事物,那么这个类就要定义为抽象类。例如: 图形(宽,高,周长,面积)

     特点:①抽象类不能被实例化。

               ②抽象类可以有构造方法。

               ③抽象类可以有普通属性和普通方法也可以有静态属性和静态方法。

               ④抽象类可以有抽象方法,所谓的抽象方法就是只能有方法的声明没有方法体。

                   语法:[访问修饰符] abstract 返回值类型 方法名称(参数列表);

                   注意:抽象类中的抽象方法,由子类来实现。

                             如果子类没有全部实现抽象类中的抽象方法,那么子类也要定义成抽象的,由子类的子类负责实现,以此类推。

                ⑤一个类中如果有抽象方法,那么这个类一定是抽象类。但是抽象类中不一定有抽象方法。

                ⑥定义抽象类的语法: [访问修饰符] abstract class 类名{}

28 接口

     接口就是对外提供了一系列功能(规范)的声明。

     特点:①接口不能被实例化。

               ②接口不能有构造方法。

               ③接口中所有属性都是静态的常量,而且这些属性默认都是由 public static final来修饰的。

               ④接口中只能有方法的声明,不能有方法体。

               ⑤接口中的方法只能有public来修饰,哪怕没有明确写明访问修饰符,默认也是public。

               ⑥接口可以实现多继承,如果一个接口继承了多个接口,接口之间用逗号隔开即可。

               ⑦实现接口可以通过implements来实现,语法:    [访问修饰符] class 类名 implements 接口名称1,接口名称2{ }

               注意:①.一个类实现了接口,就要实现接口中所有的方法,否则当前类就要定义成抽象类。

                         ②一个类可以实现多个接口,实现多个接口,就要把所有接口中的方法都要实现了,否则也要定义成抽象类。实现多个接口,用逗号隔开即可。

                         ③实现接口就是一种特殊的继承关系。

                         ④接口也是一种特殊的类

                         ⑤在实现类中可以通过类名直接调用接口中的常量