面相对象(OOP)

面相对象(OOP)

地址是HashCode的16进制的写法

1 类和对象

类: 对象的抽象化(将对象的象的部分抽取出来构成一个类)
对象: 类的实例化

2 成员变量(共享变量)和局部变量的区别

1.存储的位置不同:
成员变量存储在堆内存中
局部变量存储在栈内存中
2. 声明的位置不同:
成员变量在方法外部声明
局部变量在方法内部声明
3. 默认值是否存在
成员变量有默认值
局部变量没有默认值
4. 当成员变量和局部变量重名时,优先使用局部变量
5. 尽量声明局部变量,不要因为方便而声明成员变量,否则会引起连锁反映
局部变量随着方法的结束而销毁
成员变量不会随着方法的结束而销毁,因为它在堆中声明,需要JVM的GC机制去回
收它,但是回收的时机不确定

3 构造器

作用是初始化属性

  1. 构造器的名字和类名相同
  2. 构造器无返回值,也没有void
  3. 当一个类中没有定义构造器,编译器会自动定义一个无参构造器;如果定义了有参构造器,则编译器不会自动定义无参构造器,如果需要使用无参构造器,则需要自己写。
  4. 构造器之间可以相互调用,使用this(参数一,参数二…);但必须放在第一行。
  5. 创建对象时,new关键字会自动调用无参构造器给成员变量赋初值
  6. 当局部变量和成员变量重名时,可通过this.成员变量与局部变量区分

4 形参是基本数据类型和引用数据类型的区别

形参是基本数据类型时,修改形参的值,不引起对象的属性的改变,如果形参是引用类型的话,修改形参的值,会修改对象的属性。因为数据类型传递的是数,是在栈中修改。引用数据类型传递的是对象的地址,修改时直接在堆中修改。

  • new 的作用是开辟空间,构造器作用是给成员变量赋值。

5 static

static修饰的变量称为静态变量,也称类变量,是属于类的,可以被所用对象所共享
特点:

  1. 可以被所有对象共享
  2. 可以通过类名直接调用
  3. 静态的加载优先于对象的加载
  4. 随着类的加载而加载;

静态方法中不能访问this,因为对象可能还未初始化


静态变量和成员变量的区别
1.存储的地方不同:
成员变量存储在堆内存中;
静态变量存储在方法区中;
2. 分数
成员变量每个对象都有一份;
静态变量只有一份,被所有对象共享;
3.调用方法
成员变量:对象名.成员变量
静态变量:对象名.静态变量(不推荐)
类名.静态变量


静态方法: 只能访问静态变量,调用静态方法,不能访问成员变量(可能对象还未初始化),不能调用成员方法。
成员方法: 既能访问静态方法、静态变量,也能访问成员方法、成员变量;
注意:静态方法中不能出现this关键字,static不能修饰类,但是可以修饰内部类;

6 代码块:

局部代码块: 存在于方法中,控制变量的生命周期(作用域)
构造代码块: 提取构造方法中的共性,每次创建对象都会执行一次,并且在构造方法执行之前执行;
一个类中允许定义多个构造代码块,执行的顺序根据定义的顺序进行
静态代码块: 随着类的加载而加载,只加载一次(加载类时需要做的一些初始化,比如加载驱动)
同步代码块(线程):

7 代码块的执行顺序

/*
*面试题:
*   Coder静态代码块执行 --- Coder构造代码块执行 --- Coder无参空构造执行
*   
*   
*   BlockTest静态代码块执行 --- BlockTest的主函数执行了 --- Coder静态代码块执行 --- Coder构造代码块执行 --- Coder无参空构造执行
*   Coder构造代码块执行 --- Coder无参空构造执行
*
*/
public class BlockTest {
    static {
        System.out.println("BlockTest静态代码块执行");
    }
    
    {
        System.out.println("BlockTest构造代码块执行");
    }
    

    public BlockTest(){
        System.out.println("BlockTest无参构造执行了");
    }
    
    public static void main(String[] args) {
        System.out.println("BlockTest的主函数执行了");
        Coder c = new Coder();
        Coder c2 = new Coder();
    }
}

class Coder {
    
    static {
        System.out.println("Coder静态代码块执行");
    }
    
    {
        System.out.println("Coder构造代码块执行");
    }
    
    public Coder() {
        System.out.println("Coder无参空构造执行");
    }    
    
}


8 继承

父类:又称超类、基类。
子类:又称派生类

8.1 继承的注意事项:

  • 注意1:父类中私有的成员属性和成员方法不能被继承
  • 注意2:子类只是对父类中的属性还有方法具有使用权,属性和方法本身还是父类自己的
  • 注意3:初始化子类对象之前,必须先初始化父类对象,因为子类要使用父类中属性,父类的属性必须先有值
  • 注意4:构造器不能被继承(只能给自己的对象初始化使用)
  • 注意5:每一次创建子类对象,都会默认调用父类无参构造器
  • 注意6:子类可以选择调用父类的不同构造器,根据super()参数不同来调用不同的父类构造器
  • 注意7:如果父类没有提供无参的构造器,只有有参构造器,那么子类必须在自己的构造器中,手动将super写出来,并且传参数
  • 注意8:this()和super()不能共存,但是可以将super省略不写,系统会默认去调用父类无参的构造器
  • 注意9:虽然java是单继承,但是,java有继承链,最底层类照样具有最高层类的功能
  • 注意10:我们所有类都有一个共同的的父类:Object
  • 注意11:父类中主要定义很多子类共有的属性和行为,子类中定义自己独有的属性和行为

  • this:代表当前对象的引用
  • super: 代表父类对象的引用
  • 优点:减少重复代码量
  • 缺点:高耦合、低内聚
  • 可通过适当增加重复代码量,来减小耦合。(负载均衡思想)

8.2 方法的重写(override)

  1. 子父类之间
  2. 方法名和返回值类型相同;
  3. 参数列表相同
  4. 修饰符可以不同,但是子类的修饰符的范围要比父类大或相等。

8.3 使用场合

如果子类有自己的实现方案,那么这个方法就可以重写。
注意:

  1. 如果没有重写,那么子类调用的就是父类的方法;
  2. 如果重写了方法,那么子类调用的就是自己的方法
  3. 父类中的方法一般只需要声明即可,具体实现由子类完成
  4. 父类就是一个模板,规定了子类做什么,子类就做什么。

9 多态

多态: 同一个方法,不同对象调用会有不同的结果。
多态的三个必要条件:
1.继承是多态的前提;
2.子类改写父类的方法
3.父类引用指向子类对象


向上转型: 父类 对象名 = new 子类();(自动类型转换)
向下转型: 子类 对象名 = (子类)父类对象名(向上转型对象);
向下转型容易出现ClassCastException异常。
面相对象(OOP)_第1张图片
面相对象(OOP)_第2张图片

9.1 instanceof运算符

判断对象是否是类的实例: object instanceof class(返回一个boolea型数值)
编译时: 如果class是对象的父类、自身类、子类时编译时不会报错。
class是对象的兄弟类时会报错
运行时: 如果class是对象的父类、自身类时,运行时返回true,其他返回false。

            // 子类
          Cat c = new Cat();
          Dog d = new Dog();
          Pig p = new Pig();
          
          Animal an = new Cat();
          
          boolean flag = c instanceof Cat; // class 为自身类
          //boolean flag2 = c instanceof Pig;// class为兄弟类时报错
          boolean flag3 = c instanceof Animal; // class 为父类
          // Cat的子类YellowCat
          boolean flag4 = c instanceof YellowCat; // class为子类
          boolean flag5 = an instaceof Cat; 
          
          
          System.out.println("flag = " + flag); // true
          System.out.println("flag3 = " + flag3); // true
          System.out.println("flag4 = " + flag4); // false
           System.out.println("flag5 = " + flag5); // true

9.2 多态中成员变量的特点

运行时看左边,使用左边的成员变量

class Animal {
    int age = 10;
}
class Cat extends {
    int age = 20;
    int weight = 50;
}
          Animal an = new Cat(); 
          System.out.println(an.age); // 10
          //System.out.println(an.weight); // 编译报错

9.3 多态中成员方法的特点

编译看左边,参考等号左边引用对象所属的类是否有该方法。
运行看右边,在执行期间判断引用对象的实际类型,然后根据其实际的类型调用其相应的方法,又称为动态绑定。

10 抽象类

10.1 为什么需要抽象类

当一个类的方法不需要自己实现,只需要子类来实现,如何在JAVA的规则中只声明方法,而不实现方法,就是把这个方法变为抽象方法,当这个方法变为抽象方法后,这个类也变为抽象类了。

10.2 哪些类需要定义为抽象类

当一个类很抽象,表示范围很广时,需要定义为抽象类,例如:人类,

10.3 抽象类的用法

抽象类的一些方法只需要声明不需要实现,实现过程由子类完成

  1. 抽象类不能实例化对象
  2. 抽象类不能实例化对象,所以抽象类就是用来继承的,通过多态的方式创建对象。
  3. 抽象类可以有抽象方法,也可以有普通方法
  4. 抽象类可以没有抽象方法,也可以没有普通方法
  5. 有抽象方法的类,一定是抽象类
  6. 抽象类有构造方法,但是不能创建对象

10.4 抽象类和普通类的区别

  1. 是否都有属性:都有
  2. 是否有普通方法:都有
  3. 是否有构造方法:都有
  4. 是否有抽象方法:抽象类有,普通类没有

10.5 继承抽象类必须实现它的抽象方法吗?

不一定,可以将子类也弄成抽象类,这样就不用实现你的抽象方法了,但是你的抽象方法终归要实现,不过是你的子类的子类来实现。
–>不实现就没办法new对象,因为总有一个子类不是抽象类,而这个子类就必须实现抽象类还未实现的方法

11 类与类的关系

  1. 没有关系
  2. 继承关系:(缺点:高耦合,低内聚)
  3. 聚合关系:一个类中有几个小类,作为这个类的属性。---->这种编程称为链式编程,需要重点掌握。

12 接口

接口是类与类的桥梁,将不同的类联系起来,在接口中定义不同类型的相同行为,谁想使用,谁就来实现这个接口, 接口只定义行为的格式,具体的实现过程,由实现这个接口的类来完成。

12.1 如何使用接口

  1. 接口的细节
  2. 1 接口不是类
    2.2 接口可以有属性,默认修饰符 public static fianl int a = 10;
    2.3 接口可以有实现方法
    默认方法:public (调用方法:接口名 对象名 = new 实现接口的类的名字();对象名.方法名); 方法前加default,方法可加方法体
    静态方法:public static(可以通过接口名直接调用)
    2.4 接口可以有抽象方法、public abstract
    2.5 接口没有构造器,不能创建对象

12.2 接口和类的关系

  1. 类与类:单继承,有继承链
  2. 接口与类:实现关系,多实现,public class 类名 implements 接口名1、接口名2、接口名3……
  3. 接口与接口: 继承关系,多继承,public interface 接口名 extends 接口名1、接口名2、接口名3……

12.3 接口和抽象类的区别

  1. 接口不是类
  2. 是否有属性:都有,但是接口的属性是常量,抽象类的属性可以是常量也可以是变量
  3. 是否有实现方法:都有
  4. 是否有抽象方法:都有
  5. 是否有构造方法:接口没有构造方法,抽象类有构造方法
  6. 访问修饰符:
    抽象类:public、default、protected
    接口:public、default
  7. 是否可以new对象

12.4 什么时候使用抽象类,什么时候使用接口?

 *     is..a..     继承关系  表明 什么是什么  例如  学生是人,老师是人
 *     has..a..    聚合关系 表明  什么包含在什么里面
 *     like..a..   实现关系 接口与类的关系  象什么   例如:空调有制冷功能,冰箱也有制冷功能,所以说,空调象冰箱,但是不是冰箱。

12.5 重点

  1. 接口就是用来实现的。
  2. 一般一个接口就声明一个方法
    接口调用方式: public class 类名 implements 接口名{}
    如果这个类要继承其他类,应该先写继承,再实现接口,顺序不能乱。

你可能感兴趣的:(面相对象(OOP))