Java基础学习笔记

java基础学习笔记—–>3

面向对象编程

本质:以类的方式组织代码,以对象的组织封装数据

方法的实例化

(1)JVM 读取指定 classpath 路径下的 class 文件,加载到内存,如果有直接父类,也会加载父类;

  (2)堆内存分配空间;

  (3)执行父类、子类静态代码块;

  (4)对象属性进行默认初始化;

  (5)调用构造方法;

  (6)在构造方法中,先调用父类构造方法初始化父类数据;

  (7)初始化父类数据后,显示初始化,执行子类的构造代码块;

  (8)再进行子类构造方法的特定初始化;

  (9)初始化完毕后,将地址赋值给引用

image-20210424094433796

三大特性
1.封装:

该露的露,该藏的藏

程序设计追求 高内聚 低耦合 :类的内部操作数据细节自己完成,不允许外干涉;低耦合:仅暴露少量的方法给外部使用

通常,应该禁止直接访问一个对象中数据的实际表示,而应该通过操作借口来访问

属性私有private 给属性提供一些共有的 get/set方法

意义:提高程序安全性,保护数据,隐藏代码实现细节,统一接口,提高了代码的可维护性

2.继承:extends

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

通过继承实现代码复用。Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。继承而得到的类称为子类,被继承的类称为父类。子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。但Java不支持多重继承,即一个类从多个超类派生的能力。在开发中尽量减少继承关系,这样做是为了把程序的耦合度降低。

super超类:

super 调用父类的构造方法,必须在构造方法的第一个,必须只能出现在子类的方法或者构造方法 ,super和this不能同时调用构造方法

与this的区别

1.代表对象不同:

this:本身调用着的这个对象

super:代表父类的对象的引用

2.前提:

this:没有继承也能是引用

super:只有在继承条件下才能使用

3.构造方法:

this:本类的构造

super:父类的构造

方法的重写:

前提:需要有继承关系,子类重写父类的方法

方法名必须相同;参数列表必须相同;修饰符范围可以扩大但是不能缩小;跑出的异常可以缩小但是不能扩大。

为什么需要去重写:

父类的功能子类不一定需要或者不一定满足子类需求

3.多态:

定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现的技术:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
作用:消除类型之间的耦合关系。

多态存在的三个必要条件

要有继承;
要有重写;
父类引用指向子类对象。

多态的优点

可替换性(substitutability)——多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
可扩充性(extensibility)——多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
接口性(interface-ability)——多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
灵活性(flexibility)——它在应用中体现了灵活多样的操作,提高了使用效率。
简化性(simplicity)——多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要

isntanceof 引用类型 判断一个对象是什么类型

image-20210424105052783


父类引用子类的对象

Person person =new Student();

把父类转换成子类,高转低,强制转换 (Student)person

把子类转化成父类,低转高 可能丢失子类的方法

方便方法的调用,减少重复代码

static

静态方法去和类一同加载

静态代码块和匿名代码块

静态代码块,随着类加载同时加载,永久只执行一次

匿名代码块随着类对象的创建每次都会会执行

public class Student {

    {
        //匿名代码块
        System.out.println("匿名代码块");
    }
    static {
     //静态代码块,随着类加载同时加载,永久只执行一次
        System.out.println("静态代码块");
    }
  public void Test(){
        System.out.println("构造方法");
}
    public static void main(String[] args) {
       Student s=new Student();
       s.Test();
        System.out.println("================================");
       Student s1=new Student();
       s1.Test();

    }
}

image-20210424112149167

abstract抽象类

抽象类里面可以写普通方法,但是抽象方法必须在抽象类中

抽象方法,只有方法名,没有方法的实现 由子类继承并实现 单继承

存在的意义:将重复的代码抽象出来 提高开发效率

接口

接口就是规范,定义的是一组规则,体现了“如说你是,则必须能.......” 的思想

接口的本质是契约,制定好以后,大家共同遵守

接口中的所有定义都是抽象的

public interface UserService {
  //接口中的所有定义都是抽象的  public abstract
    void  add(String name);
    void del(String name);
    void update(String name);
    void find(String name);
}

接口都需要有实现类

 //一个类可以实现多个接口,等同于多继承
public class UserServiceImp implements UserService,TimeService{
    @Override
    public void add(String name) {
    }
    @Override
    public void del(String name) {
    }
    @Override
    public void update(String name) {
    }
    @Override
    public void find(String name) {
    }
}

接口的作用:

1:约束

2:定义一些方法,让不同的的人实现

3:接口不能被实例化,接口中没有构造方法

4:implements可以实现多个接口

5:必须要重写接口中的方法

异常

运行中出现的不期而遇的各种状况,java将异常当做对象处理,并且定义一个java.lang.Throwable作为所有异常的超类

检查性异常

运行时异常 RuntimeException

image-20210424205949535

1.处理异常时,采用逻辑合理规避同时辅助try-catch处理

2.尽量添加finally语句块去释放占用的资源

3.尽量去处理异常,而不是简单地打印输出

4.对于不确定的代码,也可以加try-catch 处理潜在的异常

留言