java基础
- String字符使用加号拼接,实际上是新建一个StringBuffer对象,调用apped方法,最后再转为String方法。
- StringBuff的append方法添加数据并返回对象本身(链式编程)
- ArrayList<>在指定位置添加元素不会替换,指定元素之后的所有元素后移
- 继承:变量先看方法内部有没有,没有到本类成员变量去找,再没有到父类成员变量去找,不考虑父亲的父亲。
- this代表本类对象的引用,super表示父类对象引用(二者都可以访问构造方法)
- 子类可能需要用到父类,所以子类初始化,父类也初始化 ,子类第一句默认super()
- 视频super内存图
- 方法重写(注解Override)可以用super.调用父类方法,私有方法不能重写,子类方法访问权限不能更低(public>默认>私有)
- Java只支持单继承,不支持多继承,还支持多层继承
- final修饰基本数据类型,基本数据类型不能改变,修饰引用类型,引用变量的地址值不能改变。
- static表示共享,静态,被static修饰的成员变量建议使用类名来访问。
- 多态:同一个对象在不同时刻表现出来不同的不同形态,例如:猫 cat = new 猫();动物 animal = new 猫();多态的前提和体现:1.有继承/实现关系,2.有方法重写,3.有父类引用指向子类引用。
- 多态的成员变量编译和运行都看左边,成员方法的编译看左边,运行看右边。
- 多态传形参传父类,实参为子类,父类有的方法才能调用,不能调用子类特有的方法,规则参考上一条。
- 多态转型: 向上转型:父类引用指向子类对象Animal a = new Cat(),向下转型:父类引用转为子类对象,Cat c = new (Cat)a;
- 有抽象方法必须是抽象类,抽象类不一定需要抽象方法
- 抽象子类要么是抽象子类要么重写抽象类中的所有方法。
- 多态的形式:具体类多态,抽象类多态,接口类多态
- 接口类的实现类要么重写接口中的所有抽象方法,要么是抽象类。
- 接口成员变量只能是常量,默认修饰符:public static final,成员方法只能是抽象方法,默认修饰符public abstract。
- 类实现关系可以单实现也可以多实现,还可以继承一个类的同时实现多个接口
- 接口和接口是继承关系,可以单继承,也可以多继承。
- 抽象类成员变量有常量,变量,构造方法,抽象方法,非抽象方法。接口只有常量和抽象方法。
- 设计理念,抽象类对 对象抽象包括属性和行为,接口对行为抽象主要是行为。
- 抽象类是对事物的抽象,接口是对行为的抽象。
- 抽象类名作为形参和返回值需要的是该抽象类的子类对象。
- 接口名作为形参和返回值需要的是该接口的实现类对象。
- 内部类(在类中定义一个类)可以直接访问外部类的成员,包括私有,外部类访问内部类的成员必须创建对象
- 成员内部类public修饰,创建对象例子:Outer.Inter oi = new Outer().new Inter(),private修饰需要在外部类使用方法调用。
- 局部内部类,在方法内部中定义的类,要在方法内部定义使用。
- 匿名内部类本质是继承子类或接口的实现类
- 接口名作为形参时可以不创建实现类对象,而是使用匿名内部类
- 没有构造方法看方法是不是static修饰的,如果是可以用类名修饰。
- 所有类建议重写tostring方法。
- 工具类(例:Math,System)构造方法用private修饰,方法类用public static修饰,方便使用类名调用。
- 装箱:将基本数据类型转换成对应的包装类型。拆箱:将包装类类型准换成对应的基本数据类型。
- 只要是对象(包装类对象)在使用前就要判是否为null。
- 使用包装类有更多方法操作该对象,更多使用是基本数据类型和字符串之间的转换。
- int转string:valueof
- string转int:parseInt
- try-catch在try中异常时创建一个异常对象,去catch中匹配处理。
- 编译时异常用try-catch或throws,用throws处理需要谁调用谁处理,运行时异常可以不处理。
- throws跟在方法名后,后跟异常类名;throw放在方法体中,后跟异常对象名。
- 集合的遍历用迭代器
- 迭代器遍历过程中,通过集合对象修改了集合中的元素,造成迭代器获取元素中判断预期修改值和实际修改值不一样。
- 列表迭代器(ListIterator)有add方法(迭代器没有),不会产生并发修改异常
- set集合没有索引,不能用普通for遍历。
- 默认情况下(Objiect中的hasCode)不同对象的哈希值是不同的,但通过方法重写可以使不同对象的哈希值相同。
- java中哈希表的实现是数组加链表。
- hashSet存储类对象要重写equals和hashcode方法(可自动生成)。
- LinkedHashSet(继承HashSet)元素有序且唯一。
- Set集合之TreeSet集合.
- 泛型可用在类,方法和接口中,被称为泛型类,泛型方法和泛型接口
- 泛型类在类名后加
,用到变量类型时用<代替> - 泛型方法:public
void demo(T t){} - 泛型创建时类似ArrayList
- 泛型接口在接口名后加
,实现类在实现类名后加 接口名后加 。 - 接口方法不要加任何修饰符
- 可变参数例子:**public static int sum(int… a){}**。在数据类型后加…
- 可变参数是一个数组,包含可变参数,可变参数要放到后边。
- map获取所有key: Set
keySet() - map获取所有值的集合: Collection
values() - File就是文件和目录路径名的抽象表示
- 字节输出流做了三件事:1. 调用系统功能创建了对象。2. 创建了字节输出流对象。 3. 字节输出流对象指向文件
- 字节输出流write()方法写的是字节,可使用getBytes()获得字符串对应的字节码。
- windows中”\r\n”表示换行
- 字节缓冲输入/输出流只是提供一个缓冲区。
- 汉字gbk编码2个字节,utf-8编码三个字节,而字节流输入输出只能输出一个字节,所以要字符流输入输出。
- 汉字存储的时候编码是负数。
- 字符流=字节流+编码表(类似字节缓冲区,都需要传参字节流对象)
- GBK中文编码,utf-8万国码,用什么规则编码就要用什么规则解码
- 字符流有flush()刷新流方法,字符流中close()方法先刷新再关闭。
- 字符缓冲流BufferedWriter和BufferedReader两个方法,newLine()和readLine(),后一个方法已经到结尾则为null,且不包含终止符号
- 字节打印流printStream继承父亲的write()方法会转码,而自己的write()方法会原样输出。
- 对象序列化流序列化对象,对象需要实现serializable接口,serializable接口是个标记接口,不需要重写任何方法。
- properties不能写泛型,和io流结合的方法load和store
- 线程优先级范围1-10。
- 继承Thread类有getName()方法,实现Runnable接口没有getName()方法,这也是实现多线程的两种方法。
- 非静态同步方法锁对象是this,静态同步方法的锁对象是类名.calss
- StringBuffer线程安全对应StringBuider不线程安全,Vector线程安全,ArrayList不线程安全,HashTable线程安全HashMap不线程安全。三个线程安全的类也不多用,常用Collections类中的方法来返回安全对象。
- lock和unlock方法常结合try—finally方法使用
- 使用wait要在synchronized方法中使用,记得使用notifyAll方法。
- lambda方法使用()->{ },小括号里可以有参数,用逗号隔开,有且仅有一个参数,小括号可以省略;有且仅有一条代码,大括号和分号可以省略;如果有return且包含return只有一条代码块,return要省略;实现的是接口中的方法,不用再去写一个实现类。
- lambda方法使用条件有一个接口,且只有一个抽象方法,使用在方法参数的地方。
- 匿名内部类会生成字节码(class)文件,而lambda不会生成字节码文件。
- 接口的组成:常量(public static final),抽象方法(public abstract);java8新增默认方法和静态方法,java9新增私有方法。
- lambda表达式被类的实例方法替代的时候,第一个参数作为调用者,后边的参数全部传递给该方法做参数。
- 函数式接口Consum注意andThen()方法,Predicate有and和or方法。
- Collections集合默认方法生成流,Map间接方法生成流,数组使用静态方法Stream.of()生成流。.
- 向下转型使用强制转型,后边跟个父类对象:例:Cat c = (Cat)animal,且只能转同类型,猫转猫,狗转狗
- 没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
- Java中的接口更多的体现在对行为的抽象
- 接口与接口继承关系,可以单继承,也可以多继承内部类可以直接访问外部类的成员,包括私有
- 工具类设计思想:1.构造方法用 private 修饰2.成员用 public static 修饰
- Calendar的set方法年需要手动减一,月份需要手动加一.
- 修改迭代器中的元素会发生异常,使用for
- 列表有专用的迭代器,ListIterator
- 增强for不能用于迭代器.
- Set没有索引、只能通过迭代器或增强for循环遍历
- 重写equal方法还要重写hashCode方法,否则equal无效,hashSet表内容相同的对象哈希值不103. 同会存到不同的位置,达不到元素不重复的目的.
- 重写Comparable接口的compareTo方法this在前从小到大,this在后从大到小
- 对象反序列化流ObjectInputStream要抛出IOException ,ClassNotFoundException异常.
- private final static long serialVersionUID = 42L修改了对象所属的类文件,读取数据会不会出问题呢
- transient关键字修饰,该关键字标记的成员变量不参与序列化过程
- Properties的store方法备注没有写null.
- Function<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值,这个值在andthen方法时才有用.
- Stream的count()方法返回值是long.
- transient 只能修饰变量,不能修饰类和方法
- static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化
- 静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问
- 非静态代码块与构造函数的区别是: 非静态代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。
- File的mkdirs方法只能创建文件夹,即使你的后缀是文件格式.
- Deque 还提供有 push() 和 pop() 等其他方法,可用于模拟栈
- ArrayDeque 是基于可变长的数组和双指针来实现
- ArrayDeque 不支持存储 NULL 数据,但 LinkedList 支持
- PriorityQueue 是非线程安全的,且不支持存储 NULL 和 non-comparable 的对象
- PriorityQueue 默认是小顶堆
- HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个
- String拼接两个字符串对象会在堆上创建一个新对象.
- String s1 = new String(“abc”)创建了两个对象.
- 两种浮点数类型没有浮点数技术.
- sleep不释放锁,wait释放锁
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 好高骛远!