zoukankan      html  css  js  c++  java
  • 面向对象基础

    面向对象编程,是一种通过对象的方式,把现实世界映射到计算机模型的一种编程方法。

    class类,instance实例

    创建实例:定义了class,只是定义了对象模板,而要根据对象模板创建出真正的对象实例,必须用new操作符

    new操作符可以创建一个实例,然后,需要定义一个引用类型的变量来指向这个实例

    方法:外部代码可以通过相应方法获取或修改private字段

    一个类通过定义方法,就可以给外部代码暴露一些操作的接口,同时,内部自己保证逻辑一致性

    this变量,在方法内部,可以使用一个隐含的变量this,它始终指向当前实例。

    因此,通过this.field就可以访问当前实例的字段

    如果有局部变量和字段重名,那么局部变量优先级更高。

    区分继承和组合:继承是is关系,组合是has关系

    多态:针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。引用类型可能是父类,但真正运行的还是实际类型的方法。

    多态的特性就是,运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法。

    多态:允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。

    Java的方法调用总是作用于运行期对象的实际类型,这种行为被称为多态

    覆写Object方法

    因为所有的class最终都继承自Object,而Object定义了几个重要的方法:

    toString():把instance输出为String

    equals():判断两个instance是否逻辑相等

    hashCode():计算一个instance的哈希值

    调用super

    在子类的覆写方法中,如果要调用父类的被覆写的方法,可以通过super来调用

    final-->修饰的方法可以阻止被覆写;修饰的class可以阻止被继承;修饰的field必须在创建对象时初始化,随后不可修改

    继承可以允许子类覆写父类的方法。如果一个父类不允许子类对它的某个方法进行覆写,可以把该方法标记为final。用final修饰的方法不能被Override

    如果一个类不希望任何其它类继承自他,那么可以把这个类本身标记为final。用final修饰的类不能被继承

    对于一个类的实例字段,同样可以用final修饰,用final修饰的字段在初始化后不能被修改,对final字段重新赋值会报错,但是可以在构造方法中初始化final字段,这种方法更为常用,因为可以保证实例一旦创建,其final字段就不可修改

    抽象类

    如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法

    public abstract void run()

    把一个方法声明为abstract,表示它是一个抽象方法,本身没有实现任何方法语句。因为这个抽象方法本身是无法执行的,所以,Person类也无法被实例化。编译器会告诉我们,无法编译Person类,因为它包含抽象方法。

    必须把Person类本身也声明为abstract,才能正确编译

    抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。

    尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。

    面向抽象编程的本质就是:上层代码只定义规范;不需要子类就可以实现业务逻辑(正常编译);具体的业务逻辑由不同的子类实现,调用者并不关心。

    接口

    在抽象类中,抽象方法本质上是定义接口规范:即规定高层类的接口,从而保证所有子类都有相同的接口实现,这样,多态就能发挥出威力。

    如果一个抽象类没有字段,所有方法全部都是抽象方法,就可以把该抽象类改写为接口interface

    在Java中,使用interface可以声明一个接口:interface Person{}

    所谓interface,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有。因为接口定义的所有方法默认都是public abstract的,所以这两个修饰符不需要写出来(写不写效果都一样)。

    当一个具体的class去实现一个interface时,需要使用implements关键字。

    在java中只能单继承,但是可以实现多个接口

     接口继承,接口继承接口使用extends

    在使用的时候,实例化的对象永远只能是某个具体的子类,但总是通过接口去引用它,因为接口比抽象类更抽象:

    default方法

    在接口中,可以定义default方法

    实现类可以不必覆写default方法。default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。

    静态字段和静态方法

    在一个class中定义的字段,我们称之为实例字段,实例字段的特点是,每个实例都有独立的字段,各个实例的同名字段互不影响。

    静态字段:static field

    实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共享“空间”,所有实例都会共享该字段。

    对于静态字段,无论修改哪个实例的静态字段,效果都是一样的:所有实例的静态字段都被修改了,原因是静态字段并不属于实例:

    在代码中,实例对象能访问静态字段只是因为编译器可以根据实例类型自动转换为类名.静态字段来访问静态对象。

    推荐用类名来访问静态字段。可以把静态字段理解为描述class本身的字段(非实例字段)。

    静态方法:

    用static修饰的方法称为静态方法

    静态方法内部,无法访问this变量,也无法访问实例字段,它只能访问静态字段。

    接口的静态字段:

    因为interface是一个纯抽象类,所以它不能定义实例字段。但是,interface是可以有静态字段的,并且静态字段必须为final类型

    作用域:

    定义为private的field、method无法被其他类访问。实际上,确切的说,private访问权限被限定在class的内部,而且与方法声明顺序无关

    如果一个类内部还定义了嵌套类,那么嵌套类拥有访问private的权限。

    protected作用于继承关系,定义为protected的字段和方法可以被子类访问,以及子类的子类

  • 相关阅读:
    systemd 介绍
    Goland读取配置文件--viper包
    Goland日志记录
    进程查询端口占用
    Python zip() 函数
    Jenkins权限管理(角色权限)
    Django ORM查询总结
    如何查看windows计算机重启记录
    Django ORM迁移
    Django中文乱码解决
  • 原文地址:https://www.cnblogs.com/liushoudong/p/12599592.html
Copyright © 2011-2022 走看看