面向对象
类与对象
类 == 模板
对象 == 依照模板制作的东西
类是一个模板,对象就是这个模板做出来的东西,根据参数的不同,每一个模板做出来的对象也各有不同。
类与类之间最常见的关系
- 依赖 A use B
- 聚合 A has B
- 继承 A is B
封装:封装是一个很重要的概念,简单来,他是把数据和行为组合在一个包中。数据被称为实例域。使用封装使用为保证数据的隐私,保证私有数据不被随意查看或者改动。
构造器
构造器是一种特殊的方法,用来构造并且初始化对象,它能够把定义对象时的参数传给对象的域。而在函数的继承里,子类必须调用父类的构造函数。但是,子类只能继承父类的默认构造函数,如果父类没有默认的构造函数,那子类不能从父类继承默认构造函数.这时子类必须使用super来实现对父类的非默认构造函数的调用,在创建对象时,先调用父类默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数构造器与类同名。在构造一个实例的同时,构造器会运行,以便于将实例域初始化为所希望的状态。
如果一个类没有显示写一个构造器,会默认给一个无参构造器。
可以使用this关键字调用构造器方法(有时候还挺好用的)。
构造器与方法的不同
- 构造器没有返回类型
- 构造器名必须与类名相同
- 构造器的使用伴随着new关键字
- 构造器可以由不止一个
this关键字
this是一个隐式参数,他是区分实例域和局部变量的重要标志。
静态
如果将一个域(这里说的域可以说是成员变量)定义为static,那么每一个类中只有一个这样的域。每一个对象对于所有的实例域
StaticTest st_1 = new StaticTest();
System.out.println(st_1.next_id);
st_1.next_id = 2;
StaticTest st_2 = new StaticTest();
System.out.println(st_1.next_id);
与c++中const关键字相同。被static修饰过后的变量,每一个成员共享这个变量。
静态方法是一种不能向对象实施的操作。换句话说,这个静态方法没有隐式参数。这样一来他也就不能访问成员变量。
java传参
记住一个关键点,基本类型,int float这种是传值的,如果传的是对象,那就会临时创建一个对象的副本,使用的是这个副本,而不是原有的对象
重载
如果一个方法拥有相同的名字,不同的参数,这就是重载。在执行的过程中编译器会挑选出具体执行哪个方法,编译器找不到匹配的参数,就会产生编译时错误。java允许重载任何方法,每一个方法都有一个签名。返回类型不是方法签名的一部分也就是说不能通过返回类型的不同,形成一个方法的重载。
继承
面向对象中很核心的思想就是继承。利用继承,人们可以基于已经存在的类构造一个新类。继承已存在的类就是复用这些类的方法。
类 超类 子类
超类就是父类,继承了超类的类被称作子类。子类只能使用父类中可以使用的部分,我们并不能简单的把子类对父类的继承理解为,子类继承了父类的那一部分代码。子类只能访问父类中可以访问的部分。(用权限符修饰)
四个权限修饰符
默认(friendly)
public
protected
private
权限符 | 当前类 | 同包 | 子孙类 | 外部包 |
---|---|---|---|---|
private | y | n | n | n |
protected | y | y | y | n |
public | y | y | y | y |
默认 | y | y | n | n |
举个例子,如果一个类使用了private修饰一个变量或者一个方法,那么由这个类派生出去的子类不能调用这个变量或者方法。(这其实也是封装的思想,这个时候需要一个对外开放的接口来使用这些代码,这一切很麻烦的操作核心思想都是为了保护变量不被随意的改变。)
super
super关键字和this关键字很相似。可以理解为this关键字的父类版本。它是一个指代变量,用于在子类中指代父类对象,只能用于子类的构造函数和实例方法中,不能用于子类的类(静态)方法中。原因是super指代的是一个父类的对象,它需要在运行时被创建,而静态方法是类方法,它是类的一部分。当类被加载时,方法已经存在,但是这时候父类对象还没有被初始化
suepr使用场景1,当父类子类中有同名变量,这个时候子类想要调用父类的同名变量需要加super关键字显示指出。
super使用场景2,使用父类的构造器的时候。
final
如果你不希望自己的类被继承,可以使用final关键字,比如
public final class Employee{}
//那么此时这个类不能被继承
public class Employee{
public final void get(){}
}
//这个表明子类不能重写这个方法
类型转换
核心:子类不能转换成父类,除非强制转换,父类可以转换为子类
抽象类
抽象类存在的意义就是在定义的父类更具有通用性。
抽象类可以由抽象方法,也可以有不抽象的方法
抽象方法只可能存在在抽象类中
继承抽象类一定要把抽象方法全部重载(除非你也用抽象去定义他)
包装器
有时候,需要将int这样的基本类型转换为对象。int 对应 integer,long 对应 Long,包装器的值是被final修饰的,也就是说初始化之后就不能改变了。