针对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.内部类:
定义在一个类的内部的一个类。