Java基础学习笔记
成员变量和局部变量的区别
-
内存中的位置
成员变量:堆内存
局部变量:栈内存
-
生命周期
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
-
注意事项
局部变量和成员变量重名时,采用就近原则
-
Java中使用变量的规则
遵循“就近原则”,局部位置有就使用
局部变量→成员变量→父类→更高的类→Object
Java中的封装体
-
方法
安全性:调用者不知道方法的具体实现
复用性:方法可以被重复使用
简单化:将繁多的代码以一个方法的方式呈现,仅通过调用方法就可以实现功能;代码维护也变得简单
-
类
安全性:调用者不知道类的具体实现
复用性:类的对象可以被重复使用
简单化:类的对象包含了更多的功能,使用起来也方便
Java中的继承
-
Java中继承的特点
- 单继承
Java只支持类的单继承,但是支持多层(重)继承
Java支持接口的多继承,语法为:
接口A extends 接口B,接口C,接口D…
-
私有成员不能继承
只能继承父类的飞私有成员(成员变量,成员方法)
-
构造方法不能继承
构造方法用于初始化本类对象
创建子类对象时,需要调用父类构造初始化该对象的父类内容,
若父类构造可以被继承,该操作会造成调用的混乱。
-
继承体现了“is a ”的关系
子类符合“is a(是一个)”父类的情况下,才使用继承,其它情况下不建议使用
-
继承关系中子父类构造方法的使用
创建子类对象时,优先调用父类构造方法
子类构造方法的第一行,隐含语句super(),用于调用父的类默认无参构造
如果父类没有无参构造,可以通过super(参数)的形式访问父类的代参构造
方法重写
-
定义
子类中出现和父类方法定义相同的方法的现象
-
解释
方法重写也叫方法的复写、覆盖方法名、参数列表、返回值类型都相同
-
注意事项
父类私有方法无法重写
子类方法访问权限不能小于父类方法
子类不能比父类方法抛出更大的异常
-
使用场景
扩展父类功能
父类功能过时,重新实现父类功能
-
方法重写和方法重载的局别
四大权限修饰符
本类 | 同包下的类 | 不同包下的子类 | 不同包下的无关类 | |
---|---|---|---|---|
private | Y | |||
默认 | Y | Y | ||
protected | Y | Y | Y | |
public | Y | Y | Y | Y |
-
private:强调的是给自己使用
-
默认:强调的是给同包下的类来使用
-
protected:强调的是给子类使用
-
public:强调的是给大家使用
多态(父类引用指向子类对象)
-
多态关系中,使用成员变量
编译看左(编译期间会看左边的类型有没有这个成员,没有就报错)
运行看左(运行期间使用的是左边类型中的这个成员)
-
多态中调用成员方法
编译看左(左边的类型有没有这个成员)
运行看右(运行时具体用的是右边类的该成员)
-
多态的使用场景
父类型可以做为形参的数据类型,这样可以接受其任意的子类对象
-
多态的弊端
父类引用不能使用子类特有的成员
(可以使用引用类型的类型转换)
将父类对象转换成子类对象,使用instanceof进行检查
抽象类的特点
-
抽象类和抽象方法必须使用abstract关键字修饰
-
抽象方法不能实例化(抽象类不能new)
那抽象类怎么实例化呢?
答:通过创建其子类对象来完成初始化操作
-
抽象类的子类
如果是普通类,则必须重写所有的抽象方法
如果是抽象类,则不用重写抽象方法
-
抽象类的成员特点
可以有普通的成员变量,也可以有成员变量
可以有抽象方法,也可以有非抽象方法
有构造方法,并且构造方法还可以重载
接口的特点
-
接口创建对象的特点
-
接口不能实例化,需要创建其子类对象来完成实例化操作
-
接口的子类
如果是普通类,则必须重写接口中的所有抽象方法
如果是抽象类,则不用重写接口中的抽象方法
-
-
接口和类之间的关系
-
类与类之间
继承关系:只能单继承,不能多继承,但是可以多层继承
-
类与接口之间
实现关系,可以单实现,也可以多实现
-
接口与接口之间
继承关系,可以单继承,可以多继承
对于一个类来讲,它的父类(继承的关系)中定义的都是:共性内容
对于一个类来讲,它的父接口(实现的关系)中定义的都是:扩展内容
-
-
接口中的成员特点
-
成员变量
接口中只有成员常量,没有成员变量
原因是因为接口中所有的变量都有默认修饰符:public static final
-
成员方法
JDK7及其以前,只能定义抽象方法
原因是所有方法都有默认修饰符:public abstract
JDK8以后,可以有带方法体的方法了
静态方法直接写,非静态方法要用default修饰
JDK9以后,可以有私有方法了,直接写即可
-
构造方法
接口中没有构造方法
-
Object类
构造方法
-
Object():
构造一个对象。所有子类对象初始化时都会优先调用该方法
成员方法
-
int hashCode():
返回对象的哈希码值,该方法通过对象的地址值进行计算,不同对象的返回值一般不同
-
Class<?>getClass():
返回调用此方法对象的运动时类对象(调用者的字节码文件对象)
-
String toString():
返回该对象的字符串表示
-
boolean equals():
返回其他某个对象是否与此对象“相等”(地址值)。默认情况下比较两个对象的引用,建议重写
Scanner
String
- 成员方法
StringBuilder 和 StringBuffer类
Date 和 Calendar类
集合
Java的集合体系
-
单例集合(Collection)
-
List(有序集合,允许相同元素和null)
-
├ArrayList(非同步,允许相同元素和null,实现了动态大小的数组,遍历效率高,用的多)
特点:有序(元素的存取顺序一致),可重复
注意:List是接口,所以可以通过创建其子类ArryList对象来完成该接口的实例化
List list = new ArryList();
-
├LinkedList (非同步,允许相同元素和null,遍历效率低插入和删除效率高)
-
├Vector(同步,允许相同元素和null,效率低)
└ Stack(继承自Vector,实现一个后进先出的堆栈) -
Set(无序集合,不允许相同元素,最多有一个null元素)
特点:无序,不可重复
-
└ HashSet(无序集合,不允许相同元素,最多有一个null元素)
-
-
双例集合(Map:key,value)
- Map(没有实现collection接口,key不能重复,value可以重复,一个key映射一个value):
- ├Hashtable (实现Map接口,同步,不允许null作为key和value,用自定义的类当作key的话要复写hashCode和eques方法)
- ├HashMap (实现Map接口,非同步,允许null作为key和value,用的多)
- └ WeakHashMap(实现Map接口)