2021-04-11面向对象基础的读书笔记

针对https://www.liaoxuefeng.com/wiki/1252599548343744/1260451488854880这一部分内容进行简单的总结,希望自己能温故而知新。

文档:面向对象基础的读书笔记.note

链接:http://note.youdao.com/noteshare?id=6bbc460a28a23e4eb84fea5a52f8fe35&sub=F2F80AF5CAC34CB4B8EB57E6CF6BDBA3

1.什么是面向对象编程?

    首先要理解什么是类class、实例instance,和它们之间的关系,以及如何定义类和创建实例,实例创建之后是互相独立的。

2.什么是方法?

2.1方法的定义:

修饰符 方法返回类型 方法名(方法参数列表) {

    若干方法语句;

    return 方法返回值;

}

讲方法(method)前,先讲讲字段(field)。为了保护数据的封装和逻辑完整,外部代码(不在该类和实例里的代码)是不允许直接访问field的,可以用private修饰词修饰field。

外部代码要访问private修饰的field,可以创建实例,通过调用实例的public方法来修改field。

这样通过方法间接修改filed,可以在方法内先检查传入的参数、修改的值是否符合逻辑。

2.2方法参数(列表):

()里可以放0到任意个参数,参数要一一对应,类比形参,用来接收那些传递给方法的变量。

可变参数: 类型...  相当于是一个数组类型。

2.3.参数绑定: 基本类型的参数绑定,引用类型的参数绑定(难点)。

3.构造方法:

在创建对象实例时把内部字段全部初始化为合适的值。代码实例,默认构造、带参构造,多级构造。

4.什么是方法重载overload?

方法名相同,各自的参数不同,通常返回值类型相同的一系列方法。

overload的目的是让使用者更容易记住功能类似的方法。

5.继承:

实现代码复用机制,在此基础上添加额外代码。

继承树:student→person→object;

继承特点:父类的private方法和字段,子类是无法访问的,所以父类的修饰词要改用protected。

在Java中,任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();

super()表示调用默认构造方法。

子类不会继承任何父类的构造方法。

seal permits:阻止继承,限定可以继承的class。

向上转型:

Person p = new Student();

为什么可以用引用类型为Person的变量指向Student类型的实例?

因为Person类的所有字段和方法都能从Student类中一一对应。符合小推大原则。

向下转型:只有引用类型为父类的变量,它实际指向子类实例的情况,向下转型才能成功,只有先向上转型,才能向下转型成功。

instanceof可以判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。

6.多态:

覆写:重写继承方法的中括号内的执行语句。

Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。

这个非常重要的特性在面向对象编程中称之为多态。

多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

7.抽象类:

方法用abstract修饰,方法内无具体执行代码的class。

abstract class Person {

    public abstract void run();

}

面向抽象编程的本质就是:

上层代码只定义规范(例如:abstract class Person);

不需要子类就可以实现业务逻辑(正常编译);

具体的业务逻辑由不同的子类实现,调用者并不关心。

8.接口:

抽象类,没有字段,只有方法,而且全是抽象方法。

用interface进行声明;

用implements关键字来给一个class实现interface;

接口之间可以继承,用extends;

10.静态

静态字段:static field,只有一个共享空间,所有实例都可访问;实例字段在每个实例都有自己的空间,实例字段互不影响。用类名.静态字段访问。

    静态方法:调用实例方法必须通过一个实例变量,而调用静态方法则不需要实例变量,通过类名就可以调用。因为静态方法属于class而不属于实例,因此,静态方法内部,无法访问this变量,也无法访问实例字段。

11.包:

package,java的namespace,一个类总属于某个包,只要包不同,就算类名一样,这两个类也是可以区分的。

位于同一个包的类,可以访问包作用域的字段和方法。不用public、protected、private修饰的字段和方法就是包作用域。

import:引用其他包里的类,在使用import前,你需要知道:

        Java编译器最终编译出的.class文件只使用完整类名,因此,在代码中,当编译器遇到一个class名称时:

       1. 如果是完整类名,就直接根据完整类名查找这个class;

       2. 如果是简单类名,按下面的顺序依次查找:

                查找当前package是否存在这个class;

                查找import的包是否包含这个class;

                查找java.lang包是否包含这个class。

       如果按照上面的规则还无法确定类名,则编译报错。

12.作用域:

public:

定义为public的class、interface可以被其他任何类访问;

定义为public的field、method可以被其他类访问,前提是首先有访问class的权限;

private:

private访问权限被限定在class的内部,而且与方法声明顺序无关。推荐把private方法放到后面,因为public方法定义了类对外提供的功能,阅读代码的时候,应该先关注public方法

protected:

定义为protected的字段和方法可以被子类访问,以及子类的子类;

package:

包作用域是指一个类允许访问同一个package的没有public、private修饰的class,以及没有public、protected、private修饰的字段和方法。

一个.java文件只能包含一个public类,但可以包含多个非public类。如果有public类,文件名必须和public类的名字相同。

13.classpath:

Java程序是.java是源码文件,经过编译后是.class文件(字节码),.class文件才可以被JVM运行。

JVM编译时需要用到的环境变量,它用来指示JVM如何找到.class文件。

14.jar包:

把package组织的目录层级,以及各个目录下的所有文件(包括.class文件和其他文件)都打成一个jar文件,也就是一个带目录的、装的都是packasge的(一堆class)压缩包。

15.模块module:

jar包存放class,却不对class之间的依赖置之不理,如果a.jar必须依赖b.jar才能运行,这时候就需要用到模块,模块是解决依赖关系的class容器。

16.内部类:

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

你可能感兴趣的:(2021-04-11面向对象基础的读书笔记)