0%

java基础

记录java基础知识!

笔记摘自:黑马课程

准备

  • 新建project - “java基础知识”

    • 练习全部放在project下
  • 新建module - “Day01Demo”

    • 每天的学习内容,新建一个module来存放。最终所有的学习内容都存放是一个project中的多个module下,方便复习。

什么是抽象类?

父类知道子类一定要完成某个功能,但是每个子类完成的情况是不一样的。

子类以后也只会

抽象类被继承就要被重写全部的抽象方法

什么是接口?

接口更加彻底的抽象,在JDK1.8之前接口中只能是抽象方法和常量

接口体现的是规范思想,实现接口的子类必须重写完接口的全部抽象方法

小结:

接口体现的是规范思想。JDK1.8之前接口中只有抽象方法和常量,除此之外没有其他成分,故修饰符可不写会默认加上。

接口中,抽象方法,可省略public abstract

抽象类中除了抽象方法还能有普通方法,所以不能省略

常量一般修饰符是:public static final

常量的变量名建议字母全部大写,多个单词用“_”连接

接口中常量是可以省去public static final不写,默认会加上

单继承,多实现

extends

implements

类与类是继承的关系,单继承。

类与接口是实现的关系,多实现。

接口与接口是多继承关系

一个类实现接口必须重写完接口中全部的抽象方法,否则这个类要定义成抽象类。

jdk1.8之后

接口中除了抽象方法、常量外,还有:

默认方法

  • default
  • 只能用接口的实现类的对象来调用

静态方法

  • static
  • 只能用接口的接口名称来调用

私有方法

  • Jdk1.9
  • private
  • 只能在本接口中访问,通常给私有方法、默认方法调用

/** */

使用文档注释,类、方法、类变量

编译后会保存。

代码块按照有无static修饰可以分为:静态代码块、实例代码块

静态代码块

static{

}

final是“最终”的含义。

final可以用于修饰类,方法,变量。

final修饰类,类不能被继承。

请问abstract和final的关系是什么?

互斥关系,不能同时出现修饰成员

final修饰变量:有且仅能被赋值一次(赋值后不能修改)

final修饰静态成员变量

常量

  • public static final修饰,名称字母全大写,多个单词用下划线连接

单例模式

什么是单例?

单例的实现方式目前有两种:

  • 饿汉模式
    • 提前创建好对象
  • 懒汉模式
    • 需要的时候才创建对象

多态

polymorphic

多态的形式

父类类型 对象名称 = new 子类构造器

接口 对象名称 = new 实现类构造器

概念:

同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征

注意:是行为即成员方法调用子类的,变量会调用父类的

多态的优劣势

  • 优势
    • 在多态形式下,右边对象可以实现组件化切换,业务功能也随之改变
      • 便于扩展和维护,可以实现类与类之间的解耦
    • 实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法
      • 可以传入一切子类对象进行方法的调用,更能体现多态的扩展性和便利
  • 劣势
    • 多态形式下,不能直接调用子类特有的功能。编译看左边,左边父类中没有子类独有的功能,所以代码在编译阶段就直接报错了。
  • 小结:
    • 类与类之间的解耦
    • 不能直接调用子类特有功能

在进行类型转换前,最好先使用instanceof进行类型判断。

类的五大成分:成员变量、成员方法、构造器、代码块、内部类

内部类

可以提供更好的封装性,内部类有更多权限修饰符,封装性有更多的控制。

可以体现出组件的思想

定义在一个类里面的类就是内部类

分类:

  • 静态内部类
  • 实例内部类(成员内部类)
  • 局部内部类
  • 匿名内部类

匿名内部类

  • 简化代码
  • 没有名字的内部类
  • 一旦写出来,就会立即创建一个匿名内部类的对象返回
  • 匿名内部类的对象的类型相当于是当前new的那个类型的子类类型

一般是公司域名的倒写+技术名称。

包名建议全部用英文,多个单词用“.”连接,必须是合法标识,不能用关键字

注意:

  • 相同包下的类可以直接访问。
  • 不同包下的类必须导包,才可以使用。
    • 导包格式:import 包名.类名

数组复制

1
2
3
4
System.arraycopy();
/**
* public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
*/

解决数学运算精度问题,使用:BigDecimal

正则表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
String str = "我是电话号码13458473958,我是邮箱1134759683@qq.com,我也是电话号码400-100-3243";
//需求:从上面的内容中爬取出电话号码和邮箱
//1、定义爬取规则(正则表达式)
String regex = "(\\w{1,}@\\w{2,10}(\\.\\w{2,10}){1,2})|(1[3-9]\\d{9})|(400-?\\d{3,8}-?\\d{3,8})";
//2、编译正则表达式成为一个匹配规则对象
Pattern pattern = Pattern.compile(regex);
//3、通过匹配规则对象得到一个匹配数据内容的匹配器对象
Matcher matcher = pattern.matcher(str);
//4、通过匹配器去内容中爬取出信息
System.out.println("爬取到的内容为:");
while (matcher.find()){
//输出匹配到的内容
System.out.println(matcher.group());
}


//结果:
爬取到的内容为:
13458473958
1134759683@qq.com
400-100-3243

泛型就是一个标签:<数据类型>

泛型可以在编译阶段约束只能操作某种数据类型

注意:JDK1.7之后,泛型后面的申明可以省略不写。泛型和集合都只能支持引用数据类型(自动装箱),不支持基本数据类型

优点

  • 泛型在编译阶段约束了操作的数据类型,从而不会出现类型转换异常。
  • 体现了Java的严谨性和规范性,数据类型经常需要进行统一

泛型没有继承关系 –》 泛型通配符;泛型的上下限

  • ?,代表任意类型
  • ? extends MyObject,?必须是MyObject或其子类(泛型的上限为MyObject)
  • ? super MyObject,?必须是MyObject或其父类(泛型的下限为MyObject。不常用)

E、K、T、V,在定义泛型时使用,代表一切类型。

?,在使用泛型时使用,代表一切类型。

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类)
  • K - Key(键)
  • V - Value(值)

常见数据结构

如果查询多而增删少用ArrayList集合。(用的最多的)
如果查询少而增删首尾较多用LinkedList集合。

小结:
如果希望set集合认为两个对象只要内容一样就重复了,必须重写对象的hashcode和equals方法。

如果希望元素可以重复,又有索引,查询要快用ArrayList集合。(用的最多)
如果希望元素可以重复,又有索引,增删要快要用Linkedlist集合。(适合查询元素比较少的情况,经
如果希望增删改查都很快,但是元素不重复以及无序无索引,那么用Hashset集合。
如果希望增删改查都很快且有序,但是元素不重复以及无索引,那么用LinkedHashset集合。

Treeset,默认升序排序(小到大)

引用数据类型,排序,需重写接口Comparable的比较方法。(可实现升序、降序)

集合自带比较器对象
如果类和集合都存在大小规则,默认使用集合自带的规则进行大小排序!!

TreeSet集合对自定义引用数据类型排序,默认无法进行(报错)

但是有两种方式可以让程序员自定义大小规则:

  1. 直接为对象的类实现比较器规则接口Comparable,重写比较方法(扩展方式)
  2. 直接为集合设置比较器Comparator对象,重写比较方法
  3. 注意:如果类和集合都带有比较规则,优先使用集合自带的比较规则。

数据存储的常用结构有:栈、队列、一维数组、二维数组、链表、红黑树(二叉树)

P117 00:00

学习ing,持续更新中!

若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道