类与对象
引用变量:引用变量存储对象在内存中的地址信息,即引用通过地址指向对象
this:在成员方法中表示当前对象,哪个对象调用方法,this就是谁
null:是引用类型的默认值,表示引用类型的地址为空;NullPointerExcedption:空指针异常,变量没有地址信息却用变量进行访问。
构造器
构造器:构造器没有返回值,返回值的位置不存在,构造方法名称与类名相同;在实例化对象的时候调用,即用new关键字调用;构造方法可以重载,参数列表不同即可,如果程序员没有提供构造器,系统自动提供一个无参构造器,程序员提供构造器,系统就不会提供无参构造器了如果需要使用,得自己提供。
代码块:与构造器并列,构造器执行一次,动态代码块就先执行一次,可用来统计创造多少个对象或给变量提前赋值
static代码块:在类加载时运行,且只被执行一次,常用于类属性的初始化;先于其他代码块执行,有多个依次执行;可以在类的任何地方执行,不能访问普通变量
栈: 一个线程对应一个栈;先进后出;调用每个方法时分配一个栈帧空间开存储局部变量,方法执行完毕栈帧消失。
值传递:基本数据类型之间的赋值操作,改变形参的值不会改变实参的值。址传递:引用数据类型之间的变量的赋值操作,实际参数指向的对象发生改变,形参和实参执行同一个对象的地址,形参的操作会影响实参;重新赋值引用不会影响实参原本指向的对象。都是副本的传递。
封装
广义:代码片段定义到方法;方法和多个状态数据定义到类体。
狭义:类的属性私有化,再通过公有方法访问和修改。
原因:类的属性不希望直接暴露给外界进行操作如果让外界直接对值进行设置,得到的结果可能会不符合逻辑,不是我们希望得到的,此时就需要将这个属性进行封装,不让外界直接访问。
操作:为了不让外界直接访问,将属性私有化(private),再使用getter/setter方法,对属性进行访问
getter/setter原因:在这些方法中可以添加一些对数据的处理操作。
单例
目的:确保一个类只有一个实例,并提供一个全局访问点。
应用场景:频繁从创建和销毁对象,成本高且需要频繁的访问,使用可以提高效率;控制资源访问,配置管理器、日志对象,往往希望能够在应用中只有一份实例;工具类:如缓存,使用单例模式可以简化代码,避免重复实例化
饿汉模式:提供一个private的,静态的当前类属性,并在静态代码块中实例化;构造器私有化,杜绝外界通过new的方式实例化对象;使用public的静态方法获取当前类的一个对象。
懒汉模式:提供一个private的,静态当前类的属性;构造方法私有化,杜绝外界通过New实例化对象的可能;提供一个public的,静态的方法,负责实例化对象,第一次调用会初始化单例,后续调用则返回已存在的单例。
比较:同:都可以获取一个类的同一个对象;异:没有使用获取当前实例对象之前,懒汉单例比恶汉单例占用更少的内存资源;懒汉单例在多线程时存在问题,推荐使用饿汉单例。
继承
从已有的类中派生出新的类;新的类能吸收已有类的数据类型和行为并扩展新的能力。
特点:java只支持单继承,即一个类只能有一个父类,单一个类可以有多个子类;java支持多重继承,即一个类在继承自一个父类的同时也可以被其他类继承;子类继承了父类的所有成员变量和方法,包括私有的和静态的;子类不会继承父类的构造方法,但是可以调用父类的构造方法,并且至少有一个子类构造器调用父类的构造器;子类在拥有父类成员的基础上还可以添新成员。
继承里的构造器:默认调用父类的无参构造器,如果父类没有无参构造器,必须在子类中显式调用父类的一个有参构造器。在子类构造方法中用super(有参传参)调用父类构造方法,super()放在首行首句,不能与this在一个构造器里共存。
继承的方法重写:override,在子类中对父类继承到的方法进行重新实现,在这个重写过程中,子类的实现方法会覆盖掉父类的实现方法。
重写原因:父类的方法逻辑不能满足子类的需求,子类需要重写方法逻辑。
重写特点:子类只能重写父类中存在的方法;子类的方法名和参数必须与父类相同;子类的返回值类型要与父类的返回值类型相同或者是其子类型;子类的访问权限必须大于等于父类的访问权限。
Override、Overload的区别:Override是子类对父类方法的重新实现;Overload是对同一个类中方法名相同、参数不同方法的描述。
重写equal()方法原则:如果obj=null返回false;如果obj=this返回true;如果a.equal(b)成立,则b.equal(a)也必须成立;如果两个对象的类型不同一定返回false;如果a.equal(b),b.equal(c)c成立,则a.equal(c)成立
final:修饰类:类不能再有子类,即不能被继承;修饰属性:只能赋值一次,即要么直接初始化,要么在构造器中初始化;修饰方法:final修饰的方法不能被重写;修饰局部变量:只能赋值一次。
static:static修饰的内容属于共有资源,不属于对象,应该用类名调用。
static修饰属性:应该用类名调用;修饰代码块:在类加载期间执行,只执行一次适用于加载一些静态资源;修饰的方法:用类名调用,不应该被重写;修饰类:必须是内部类。
多态
向上造型:父类型的变量引用子类型的对象;转换会成功,是隐式转换;编译看变量,运行看对象,即向上转型的变量将只能访问父类的成员;如果调用的是重写过的方法,那么调用的一定是重写方法。
向下转型:父类型的变量赋值给子类型的变量需要强制转换(显式);可能会失败,报类显示异常;可以用instanceof判断变量指向的对象是否属于某类型。
抽象类
抽象类特点:由abstract修饰的方法是抽象方法,抽象方法没有方法体,用分号结尾;如果类中有抽象方法,类就必须使用abstract修饰成抽象类;抽象类中可以没有抽象方法;抽象类可以提供构造器但没有意义,不能实例化;一个类继承抽象类就必须重写抽象类的所有抽象方法,除非这个子类也是抽象类。
接口
特点:使用Interface进行定义;可以提供成员变量,默认public static final进行修饰;可以提供成员方法,默认public abstract修饰;接口中不能存在构造器,不能实例化,无意义。
实现:一个类可以实现多个接口,接口用逗号分开;使用implements进行实现,必须实现接口中的所有抽象方法;如果一个类没有实现接口中的全部抽象方法,必须使用abstract声明成抽象类。