黑马程序员-面向对象

时间:2022-08-27 10:12:00

什么是面向对象?

 Java中只有值传递,引用类型传递的是地址值。
内存:
 栈:先进后出。
  弹栈:取数据的方式。
  压栈:存数据的方式。
  举例:
   手枪的弹夹。

面向对象:
 面向对象和面向过程都是一种思想。
 面向对象是基于面向过程的。
 面向过程:以函数为基础,完成各种操作。强调的是过程。
 面向对象:以对象为基础,完成各种操作。强调的是对象。
 总结:万物皆对象。
 
 思想特点:
  1、更符合人们的思考习惯。
  2、把复杂的事情变得简单化。
  3、把程序员从执行者变成了指挥者。
 举例:
  买电脑:
   面向过程;自己做完所有的事儿。强调的是买这个过程。
   面向对象:找认识的人(让他帮我买)。强调的是对象,结果。
 面向对象的三大特征:
  封装,继承,多态。

 什么是面向对象?
  它是一种编程思想,是基于面向过程的。面向过程强调的是过程,而面向对象强调的是对象。
  他的特点是1,2,3。比如说:
  举例:
  其实,万物皆对象。
 以后向使用某个功能或者执行某个动作的话,怎么做?
  找对象,让它来做。
  怎么找?找JDK要。
  如果JDK没有,我们就自己造一个,自己用完了,还可以给别人用。

 把大象装进冰箱:
  冰箱IceBox:
   开门open()
   关门close()
  大象Elephant:
   进去in()
  测试类:
   main()
   {
    冰箱对象.open();
    大象对象.in();
    冰箱对象.close();
   }
  伪代码:
   class IceBox
   {
    public void open()
    {
     System.out.println("打开冰箱门");
    }
    public void close()
    {
     System.out.println("关闭冰箱门");
    }
   }
   class Elephant
   {
    public void in()
    {
     System.out.println("大象Come in!");
    }
   }
   class Test
   {
    public static void main(String[] args)
    {
     冰箱对象.open();
     大象对象.in();
     冰箱对象.close();
    }
   }
  
  怎么样才能让我们的操作更符合面向对象的思想呢?
   1、分析该系统中有那些对象。
    A:名词提取法。
    B:UML统一建模语言,闫闳
   2、每个对象的功能。
   3、明确各个对象之间的关系。


类与对象的关系概述:
 理解性:
  开发:就是不断的创建对象,使用对象,指挥对象做事情。
  设计:维护和管理各个对象之间的关系。
  学Java就是为了把现实世界的事物通过编程语言给体现出来。
  Java描述事物无非就是描述事物的:属性和行为。
 掌握:
  属性:外在特征。
  行为:能够做什么。
  Java语言最基本的单位是:类。
  计算机最基本的存储单位是:字节。

  类:属性和行为的集合体,一个抽象的概念。
  对象:类的具体实现,体现。
  成员变量;属性。
     定义在类中,方法外的变量。
  成员方法:行为。
    就是咱们学的函数,先把static去掉。

写一个学生类:
 1、分析学生事物
  属性:姓名,年龄,性别
  行为:学习,吃饭,睡觉
 2、把分析后的学生事物转成Java中的类:
  学生类;
   成员变量:
    姓名:name
    年龄;age
    性别:sex/gender
   成员方法:
    学习:study()
    吃饭;eat()
    睡觉: sleep()


注意:
 从今天开始,咱们可以在一个文本文件中写多个类了。(开发中不这样写,一个文件只写一个类)
 文件名必须和带main函数的类名一致
如果使用学生类中的内容?
 1、想使用学生类中的内容,必须明确通过那个学生来调用。
 2、怎么明确一个的具体对象?
  通过new关键字。
  格式:
   类名 对象名 = new 类名();
 3、怎么使用类中的成员(成员变量,成员方法)。
  成员变量: 对象名.成员变量;
  成员方法: 对象名.成员方法();

  怎么给成员变量赋值?
   对象名.成员变量 = 值;

什么时候定义成员变量?
 只有能够用于描述一个类的属性的东西,才可以定义为成员变量。
 注意:
  使用变量的时候,遵循一个“就近原则”。
  会现在局部范围内找,有就使用,没有就去成员位置找,有就使用,没有就报错。(先这样记,不严谨)

成员变量和局部变量有什么区别?
 A:定义位置不同。
  成员变量:类中,方法外。
  局部变量:方法中,或者方法的形参上。
 B:初始化值不同:
  成员变量:有默认初始化值。
  局部变量:没有默认初始化值,必须先定义,再赋值,然后才能使用。
 C:存储位置不同(生命周期不同):
  成员变量:堆。随着对象的创建而存在,随着对象的消失而消失。
  局部变量:栈。随着方法的调用而存在,随着方法调用完毕而消失。

匿名对象:
 概述:没有名字的对象。
 应用场景:
  A:当对 对象(成员)方法仅调用一次的时候。
  B:匿名对象可以作为实际参数进行传递。

一 封装:★★★★★ 

概念:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

好处:将变化隔离;便于使用;提高重用性;安全性。

封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。

二 继承 ★★★★★ 

好处:

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

2:让类与类之间产生了关系,提供了另一个特征多态的前提。

 

注意:

子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super(); 

如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。

如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

 

final特点:

1:这个关键字是一个修饰符,可以修饰类,方法,变量。

2:被final修饰的类是一个最终类,不可以被继承。

3:被final修饰的方法是一个最终方法,不可以被覆盖。

4:被final修饰的变量是一个常量,只能赋值一次。

 

抽象类的特点:

1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。

2:抽象方法只定义方法声明,并不定义方法实现。

3:抽象类不可以被创建对象(实例化)。

4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。

5: 抽象类只能单继承。

抽象类的细节:

1:抽象类中是否有构造函数?有,用于给子类对象进行初始化。

2:抽象类中是否可以定义非抽象方法?

可以。其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象函数。而且比一般类少了一个创建对象的部分。

3:抽象关键字abstract和哪些不可以共存?final , private , static 

4:抽象类中可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象。

 

 

 

接 口:★★★★★ 

 

  抽象类和接口的区别:(问的比较多,概念性的问题)

1:抽象类只能被继承,而且只能单继承。

接口需要被实现,而且可以多实现。 

2:抽象类中可以定义非抽象方法,子类可以直接继承使用。

接口中都有抽象方法,需要子类去实现。

3:抽象类使用的是  is a 关系。

接口使用的 like a 关系。 

4:抽象类的成员修饰符可以自定义。

接口中的成员修饰符是固定的。全都是public的。

 

 

 

三 多态(在后期开发中常用)

 

多 态★★★★★(面向对象特征之一):函数本身就具备多态性,某一种事物有不同的具体的体现。

体现:父类引用或者接口的引用指向了自己的子类对象。//Animal a = new Cat();

多态的好处:提高了程序的扩展性。

多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)

多态的前提:

1:必须要有关系,比如继承、或者实现。

2:通常会有覆盖操作。

 

匿名内部类:没有名字的内部类。就是内部类的简化形式。一般只用一次就可以用这种形式。匿名内部类其实就是一个匿名子类对象想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口。

匿名内部类的格式:new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }.方法。

匿名内部类的使用场景:

当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。

其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。