Java_面向对象

面向对象

       面向对象是相对于面向过程的一种编程思想,它是基于面向过程的。

           面向过程:侧重于完成功能的过程。

           面向对象:侧重于完成功能的结果,强调的是对象。

        三个思想特点:

              a:更符合人思考习惯的一种思想。

              b:把复杂的事情简单化。

              c:把程序员从执行者变成指挥者。

类与对象

      编程语言都是为了把现实世界的事物给体现出来的,所以编程语言就应该和现实世界的事物对应。

        现实的事物分为两种:

               内在的特征:对应类的成员变量。

               外在的行为:对应类的成员方法。

      类:

          是一组相关的属性和行为的抽象。

          类的组成:

                 成员变量:名词

                        来自于现实世界的中的属性的一种抽象描述。

                 构造方法:

                        用于创建对象,对对象进行初始化

                        特点:

                              a :方法名于类名相同。

                        b:方法没有返回值类型。

                        c:方法没有返回值。

                  注意:

                        a:系统默认给出一个无参构造方法。

                        b:自己给出构造方法,系统将不在提供。

                        c:可以通过构造方法,给成员变量赋值。

                 成员方法:名词+动词    

                   完成一些功能。       

     对象:

         对象是类事物的具体的个体,也被称为实例。

         首先把事物的特征和行为体现出来,把事物转换成Java中的类,最后创建对象调用。

            应用场景:

                   创建对象:类名 变量名 = new 类名();

                   调用对象:对象名.方法();    对象名.变量;

           匿名对象:

                  没有名字的对象。

                  应用场景:

                          a:调用方法只用一次的时候(可提升效率)。

                          b:作为实际参数传递。

      局部变量与成员变量的区别:

            在类中的位置:

                       成员变量:在类中,方法外。

                       局部变量:在类的方法中。

          在内存中的位置:

                  成员变量:在堆中。heap

                  局部变量:在栈中。stack

          生命周期:

                  成员变量:随着对象创建而存在,随着对象消失而消失。

                  局部变量:随着方法调用存在,随着方法调用完毕而消失。

          初始化值:

                  成员变量:有默认初始值。

                      基本数据类型:

                           整型:0

                           浮点:0.0

                           char:’\u0000’

                      引用类型:null

                  局部变量:必须先声明,再赋值,最后才能被使用。

             

面向对象三大

      1,封装

             隐藏实现的细节,仅对外提供公共的访问方式。

                  体现形式:

                        a:类

                        b:方法

                        c:被private修饰也是封装的体现。

      2,继承

             在已知类的基础上扩充新的内容。

             extends表示继承的关系。class B extends A{}

             父类的定义:

                  是多个类中相同的成员变量和成员方法抽取出来的。

                  特点:

                              a:java中只能单继承。

                              b:java中可以多层继承(体系)。

                      优点:

                              a:提高了代码的复用性。

                              b:让类与类产生了联系,是多态的前提。

                      应用场景:

                              a:继承表达的是一种关系:is  a 。

                              b:不要为了部分功能而去继承。

                     继承后父子之间的成员关系:

                             成员变量:

                                    a:如果名字不同,直接调用本类的。

                                    b:如果名字相同的变量,在方法中使用的时候:

                                               先在局部范围查找,有就使用,

                                               然后成员位置查找,有就使用,

                                               最后在父类成员查找,有就使用,

                                               再没有就报错。

                             构造方法:

                                   a:子类并没有继承父类的构造方法。

                                   b:子类的构造方法执行前,会先执行父类的构造方法。这个时候,并没有创建父类对象,仅仅是对父类的内容进行了初始化。

                                         注意:如果在父类中没有无参构造,在子类中要么用this(…),要么用super(…) 。

                             成员方法:

                                  a:如果名字不同,直接调用本类的。

                                  b:如果有名字相同的方法,是重写的形式(覆盖、复写)。子类使用的是自己的方法,覆盖父类的方法。

                   方法重写:

                              override,子类与父类方法声明相同。 

                              体现形式:

                                   a:方法名相同,参数列表相同。

                                   b:子类返回值类型小于等于父类返回值类型。

                                   c:子类访问权限修饰符大于等于父类访问权限修饰符。

                              注意:

                                   a:父类的私用方法不能被重写。

                                   b:静态方法只能被静态方法重写。

                  方法重载:

                         overload,方法名相同,参数列表不同。

                         体现形式:

                                  a:方法名,参数列表不同。

                                  b:与返回值类型无关。

                                  c:与返回值无关。

                  this与super的区别:

                        this:代表当前类的对象,谁调用,就代表谁。

                        super:代表父类存储空间标识,父类的引用。

                        应用场景:

                              一般都在子类使用。

                              成员变量:

                                      this.变量

                                      super.变量

                              构造方法:

                                     this.(…)

                                     super.(…)

                              成员方法:

                                     this.方法()

                                     super.方法()

                           类的初始化:

                                         Person p=new Person();    

                                              a:把Person.class类加载到内存。

                                              b:执行该类中的静态代码块,如果有,给Person.class进化初始化。

                                              c:在栈内开辟存储变量p的空间,分配内存地址。

                                              d:在堆内开辟new Person()的空间。

                                              e:对成员变量进行默认初始化。

                                              f:对成员变量进行显示初始化。

                                              g:如果有构造代码块,通过它对成员变量进行初始化。

                                              h:通过构造方法对成员变量初始化。   

                                              i:对象创建完毕,把堆内存的地址值赋给栈内存中的变量p。

                       

      3,多态

             同一个对象在不同的时刻表现出不同的状态,编译期类型与运行期类型不一致。

             根据实际的对象不同而表现出的不同状态。

                  前提:

                        a:有继承或实现关系。

                        b:有method override。

                        c:有父类或父接口引用指向子类对象。

                  弊端:

                       不能使用子类特有的功能。

                  优点:

                       提高了程序的扩展性与维护性(由继承来保证)。

                 向上转型:

                       把子类对象赋值给父类对象或父接口引用。

                 向下转型:

                       把父类或父接口引用强制转换为子类

                 体现形式:

                      a:具体类多态

                      b:抽象类多态

                      c:接口多态

抽象类

       多个具体的事物具备相同的方法声明,而方法体不同,抽取方法声明,定义到一个类中。

       一个没有方法体的方法是一个抽象方法,一个类有抽象方法,该类必须定义为抽象类。

            特点:

                a:抽象类或抽象方法被abstract修饰。

                b:抽象方法没有方法体,抽象类中不一定有抽象方法,而有抽象方法一定是抽象类。而没有抽象方法的抽象类是为了不让外界创建对象。

                c:抽象类不能被实例化。构造方法主要用于对子访问父类数据的初始化。

                d:子类继承抽象类,要么是子类也是抽象类,要么重写父类所有抽象方法。

            抽象类的成员:

                   成员变量:有变量,也有常量。

                   构造方法:有构造方法,用于子类访问父类数据的初始化。

                   成员方法:有抽象方法,也有非抽象方法。

            注意:

                   抽象类不能与以下几个关键字共存。

                 a:final,final修饰的方法不能被重写,而abstract修饰的方法必须被重写,冲突。

                 b:private,private修饰的方法不能被重写,而abstract修饰的方法必须被重写,冲突。

                 c:static,static修饰的方法可以直接通过类名调用,而abstract修饰的方法,没有方法体,调用没有意义。

          实现继承:

                    分析:从具体到抽象。

                    实现:从抽象到具体。

                  

                    学习:抽象的内容,因为它定义的是共性的内容。

                    使用:具体的内容,因为它才是具体的实现,才能实现更多的功能。

接口

       当一个类中的方法都是抽象的时候,Java推荐了一种更抽象的方式,叫接口。

       特点:

                 a:接口用interface修饰。

                 b:子类实现接口用implements标识。

                 c:接口不能被实例化。

                 d:子类实现接口的时候,要么子类也是抽象类,要么全部实现接口的方法。

       思想特点:

                 a:对外暴露的规则。

                 b:程序的扩展功能。(多态)

                 c:降低程序的耦合性。(多态)

                          高内聚

                          低耦合

                          效率与安全

                 d:让类可以多实现。    

       成员特点:

               成员变量: 是常量,默认修饰符:public static final

               成员方法:是抽象方法,默认修饰符:public abstract

       接口和抽象类的区别:

               共性:都是不断抽取出来抽象的内容。

                     成员特点:

                                 抽象类:

                                           成员变量:可以是常量,可以是变量。

                                           构造方法:有。

                                           成员方法:可以是抽象方法,也可以是非抽象方法。

                                 接口:

                                           成员变量:只能是常量。

                                           成员方法:只能是抽象方法。

                                           无构造方法。

                    继承和实现关系:

                               a:类与类的关系:

                                           继承关系,只能单继承,可以多层继承。

                               b:类与接口的关系:

                                           实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。

                               c:接口与接口的关系:

                                           继承关系,可以单继承,也可以多继承。

                    设计区别:

                                抽象类中定义的体系是共性,表达的是:is a的关系。

                                接口定义的体系是扩展性,表达的是:like a 的关系。

内部类

          把类定义在一个类的内部。

          特点:

                内部类可以直接使用外部类,包括私有。

                外部类要使用内部类,必须要创建对象调用。

           内部类分类:

                 成员内部类:定义在类中,方法外的内部类。

                                 private:为了数据安全。

                                 static:为了方便调用。

                 局部内部类:定义在方法中的内部部类。

          匿名内部类

                      a:没有名字的内部类。其本质是一个对象。

                      b:前提,存在一个抽象类或者接口。

                      c:格式:

                                   new 抽象类名或接口(){

                                           重写父类方法;

                                   };

               本质:是一个继承了类或者实现接口的子类匿名对象。

关键字

        private:

              私有的意思,可以修饰成员变量、构造方法、成员方法。

              被private修饰的成员只能在本类中访问。

              怎么赋值给被private修饰的成员:

                          a:同过setXxx()和getXxx()方法。

                          b:通过构造方法

        this:

              代表当前类的对象,谁调用,就代表谁。

              应用场景:

                  a:解决局部变量隐藏成员变量。

                  b:在本类的构造方法中调用本类的构造方法(只能放在第一条语句)。

        super:代表父类空间存储标识,可以理解为对父类引用。

        final:

              最终的意思,它可以修饰类,成员方法,变量。

              特点:

                   它修饰的类不能被继承。

                   它修饰的成员方法不能被重写。

                   它修饰的变量是常量。

            注意:

                final修饰的基本数据类型的值不能被改变。

                final修饰的引用类型,地址值不能改变,对象内容可以改变。

        abstract:抽象的意思,可以修饰成员方法和类。

        interface:接口的意思。

        extends:继承的关键字,让类与类之间产生了联系,是多态的前提 。

        implements:实现接口的关键字。

        static:

             表示静态的意思。

             可以修饰成员变量和方法。

             特点:

                  a:随着类的加载而加载。

                  b:优先于对象而存在。

                  c:被所有对象共享。

                  d:可以直接通过类名直接调用。

                       静态修饰的内容,即可以通过类名调用,也可以通过对象调用。

             注意:

                  a:静态只能访问静态。 因为静态方法和变量在类加载时就存在,非静态变量在对象存在时才存在。

                  b:随着类加载而存在,生命周期长,占用资源,效率低。

                  c:静态方法中不可定义this,super关键字。因为静态优先于对象存在,所以静态方法不可以出现this。

             应用场景:

                  a:被所有对象访问的数据。节省空间,没必要为每个对象单独存储。

                  b:工具类,方便直接通过类名调用。

            main方法的解释 :

                public static void main(String [] args)

                  public:公共的,足够的访问权限。

                  static:静态的,为了不创建对象,直接调用。

                  void:返回給JVM没有意义。

                  main:主方法,程序入口,是标准规范。

                  String [] args:早期为了接收键盘数据,现在被Scanner替代。

             静态成员变量与成员变量的区别:

                  a:在类中的初始化值的过程是一样的。

                  b:在内存中的位置:

                        成员变量:在堆中。

                        静态成员变量:在方法区的静态区。

                  c:生命周期:

                        成员变量:随着对象的创建而存在,随着对象的消失而消失。

                        静态成员变量:随着类的加载而存在,随着类的消失而消失。

                  d:设计和调用的区别:

                        设计:

                            成员变量:每个对象是独立的特征。

                            静态成员变量:所有对象是共享的特征。

                        调用:

                            成员变量:只能通过对象调用。

                            静态成员变量:可以通过类名直接调用,也可以通过对象调用。

权限修饰符

                             本类                同一包下            不同包下的子类             不同包下的无关类

private                     y

default                     y                      y                           

protected                 y                      y                          y

public                       y                      y                          y                                       y


  权限修饰符的组合以及常见使用

                               类                  成员变量               构造方法                         成员方法        

private                                              y                           y                                     y

default                     y                       y                           y                                     y

protected                                         y                           y                                     y

public                       y                      y                           y                                     y

abstract                   y                                                                                          y

final                         y                       y                                                                 y

static                                                y                                                                 y

 

原文地址:https://www.cnblogs.com/zhanfuxing/p/3614411.html