Java看下什么原因?




从此扫描仪查找并返回下一个完整令牌
将输入的下一个标记扫描为 int
使此扫描器前进超过当前行并返回跳过的输入
  • String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象
  • 字符串不可变,它们的值在创建后不能被更改(引用的字符串可以被覆盖)
返回一个字符串,删除了所有前导和尾随空格
比较字符串的内容,严格区分大小写
比较字符串的内容,忽略大小写
返回指定索引处的 char 值
将字符串拆分为字符数组后返回
根据开始和结束索引进行截取,得到新的字符串(包含头,不包含尾)
从传入的索引处截取,截取到末尾,得到新的字符串
使用新值,将字符串中的旧值替换,得到新的字符串
根据传入的规则切割字符串,得到字符串数组





StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是StringBuilder 对象中的内容是可变的

先通过一个示例测试两者性能:


  • 字符串拼接时,底层会自动调用 StringBuilder 方法,将其进行拼接,拼接后再转换为 String 类型
  • 一次拼接,堆内存中就会添加两个对象

  • String类: 内容是不可变的

创建一个空白可变字符串对象,不含有任何内容
根据字符串的内容,来创建可变字符串对象
添加数据,并返回对象本身



需求: 输入一个字符串,判断是否是对称,并提示



  • 共同点: 都是存储数据的容器
  • 不同点: 数组的容量是固定的,集合的容量是可变的
将指定的元素追加到此集合的末尾
在此集合中的指定位置插入指定的元素
删除指定的元素,返回删除是否成功
删除指定索引处的元素,返回被删除的元素
修改指定索引处的元素,返回被修改的元素
返回集合中的元素的个数

需求: 创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合



需求: 删除集合中 “test” 的项

 
 
 
 
 

需求: 创建一个学生信息的管理系统,并能够对数据 增删改查。





 


三、项目:教务信息管理系统

分类思想:分工协作,专人干专事

用来进行业务逻辑的处理(例如:判断录入的id是否存在)
和用户打交道(接收用户需求,采集用户信息,打印数据到控制台)

如果将所有的类文件都放在同一个包下,不利于管理和后期维护 所以,对于不同功能的类文件,可以放在不同的包下进行管理

  • 同一个包下的访问: 不需要导包,直接使用即可
  • 不同包下的访问: import 导包后访问 通过全类名(包名 + 类名)访问
    • package 必须是程序的第一条可执行的代码

static 关键字是静态的意思,是Java中的一个修饰符,可以修饰成员方法,成员变量

  • 被static修饰的成员变量,一般叫做静态变量
  • 被static修饰的成员方法,一般叫做静态方法

    • 是我们判断是否使用静态关键字的条件
  • 随着类的加载而加载,优先于对象存在
    • 对象需要类被加载后,才能创建

  • 静态方法只能访问静态的成员
  • 非静态方法可以访问静态的成员,也可以访问非静态的成员
  • 静态方法中是没有this关键字

4. 案例:信息管理系统

  • 添加学生: 键盘录入学生信息(id,name,age,birthday) 使用数组存储学生信息,要求学生的id不能重复
  • 删除学生: 键盘录入要删除学生的id值,将该学生从数组中移除,如果录入的id在数组中不存在,需要重新录入
  • 修改学生: 键盘录入要修改学生的id值和修改后的学生信息 将数组中该学生的信息修改,如果录入的id在数组中不存在,需要重新录入
  • 查询学生: 将数组中存储的所有学生的信息输出到控制台。


封装学生信息、封装老师信息
访问存储数据的数组,进行赠删改查(库管)
业务的逻辑处理(业务员)
和用户打交道(客服接待)
程序的入口类,提供一个main方法


让类与类之间产生关系(子父类关系),子类可以直接使用父类中非私有的成员


  • Fu: 是父类,也被称为基类、超类
  • Zi: 是子类,也被称为派生类
  • 让类与类之间产生了关系,是多态的前提
    • 继承是侵入性的: 降低了代码的灵活性 继承关系,导致子类必须拥有父类非私有属性和方法,让子类自由的世界中多了些约束
    • 增强了代码的耦合性: 代码与代码之间存在关联都可以将其称之为"耦合"

Java只支持单继承,不支持多继承,但支持多层继承。 (多层继承:子类 A 继承父类 B ,父类B 可以 继承父类 C )

  • 在子类方法中访问一个变量:
    • 子类局部范围找、子类成员范围找、父类成员范围找
    • 如果子父类中,出现了重名的成员变量,通过就近原则,会优先使用子类的
    • 如果一定要使用父类的,可以通过super关键字,进行区分。
this.成员变量、访问本类成员变量 this.成员方法(…)、访问本类成员方法 this(…)、访问本类构造方法
super.成员变量、访问父类成员变量 super.成员方法(…)、访问父类成员方法 super(…)、访问父类构造方法
  • super 关键字的用法和 this 关键字的用法相似
  • this:代表本类对象的引用
  • super:代表父类存储空间的标识(可以理解为父类对象引用)


在继承体系中,子类出现了和父类中一模一样的方法声明

应用场景: 当子类需要父类的功能,而功能主体子类有自己特有内容,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容

  • 父类中私有方法不能被重写
  • 父类静态方法,子类必须通过静态方法进行重写,父类非静态方法,子类也必须通过非静态方法进行重写
  • 子类重写父类方法时,访问权限必须大于等于父类
  • 注意: 静态方法不能被重写!如果子类中,也存在一个方法声明一模一样的方法 可以理解为,子类将父类中同名的方法,隐藏了起来,并非是方法重写!




①. 构造方法的访问特点
  • 子类中所有的构造方法默认都会访问父类中无参的构造方法
  • 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
    • 子类初始化之前,一定要先完成父类初始化
  • 构造方法的第一条语句默认都是:super()
  • 注意: 如果编写的类,没有手动指定父类,系统也会自动继承Object (Java继承体系中的最顶层父类)

如果父类中没有空参构造方法,只有带参构造方法,会出现什么现象呢?

  • 子类通过 super,手动调用父类的带参的构造方法(推荐)
  • 子类通过 this 去调用本类的其他构造方法,本类其他构造方法再通过 super 去手动调用父类的带参的构造方法
  • 注意: this(…)super(…) 必须放在构造方法的第一行有效语句,并且二者不能共存。
  • 抽象方法: 将共性的行为(方法)抽取到父类之后,发现该方法的实现逻辑,无法在父类中给出具体明确,该方法就可以定义为抽象方法。
  • 抽象类: 如果一个类中存在抽象方法,那么该类就必须声明为抽象类


  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
    • 要么重写抽象类中的所有抽象方法
  • 定义猫类(Cat)和狗类(Dog):
    • 猫类成员方法:eat (猫吃鱼) drink(喝水…)
    • 狗类成员方法:eat (狗吃肉) drink(喝水…)

 




设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

模板设计模式:抽象类整体就可以看做成一个模板,模板中不能决定的东西定义成抽象方法 让使用模板的类(继承抽象类的类)去重写抽象方法实现需求

小结: 模板设计模式的优势,模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可


需求: 定义写作类模板,模板的标题、尾注固定,正文根据不同文体自己定制


final 关键字是最终的意思,可以修饰(方法,变量,类)

  • 修饰方法: 表明该方法是最终方法,不能被重写
  • 修饰变量: 表明该变量是常量,不能再次被赋值
  • 修饰类: 表明该类是最终类,不能被继承

变量是基本类型: final 修饰指的是基本类型的数据值不能发生改变
变量是引用类型: final 修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的

在Java中,使用 { } 括起来的代码被称为代码块

    • 作用: 限定变量的生命周期,及早释放,提高内存利用率
    • 位置: 类中方法外定义
    • 特点: 每次构造方法执行的时,都会执行该代码块中的代码,并且在构造方法执行前执行
    • 作用: 将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性
    • 位置: 类中方法外定义
    • 特点: 需要通过static关键字修饰,随着类的加载而加载,并且只执行一次
    • 作用: 在类加载的时候做一些数据初始化的操作





当一个类中的所有方法都是抽象方法的时候,我们就可以将其定义为接口 接口也是一种引用数据类型,它比抽象类还要抽象

1. 接口的定义和特点


  • 接口和类之间是实现关系,通过 implements 关键字表示:
    • 要么重写接口中的所有抽象方法
  • 接口和类的实现关系,可以单实现,也可以多实现

2. 接口中成员的特点

  • 关于接口中的方法,JDK8和JDK9中有一些新特性

3. JDK8版中接口成员的特点

  • 允许在接口中定义非抽象方法,但是需要使用关键字 default 修饰,这些方法就是默认方法
  • 作用: 解决接口升级的问题 接口中允许定义static静态方法

  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用


  • 如果发现一个类中所有的方法都是抽象方法,那么就可以将该类,改进为一个接口
  • 涉及到了接口大面积更新方法,而不想去修改每一个实现类,就可以将更新的方法,定义为带有方法体的默认方法
  • 希望默认方法调用的更加简洁,可以考虑设计为 static 静态方法。(需要去掉default关键字)
  • 默认方法中出现了重复的代码,可以考虑抽取出一个私有方法。(需要去掉default关键字)
  • 类和类的关系: 继承关系,只能单继承,但是可以多层继承
  • 类和接口的关系: 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口的关系: 继承关系,可以单继承,也可以多继承



同一个对象,在不同时刻表现出来的不同形态

  • 有父类引用指向子类对象
  • 构造方法: 同继承一样,子类会通过 super 访问父类构造方法
  • 成员变量: 编译看左边(父类),执行看左边(父类)
  • 成员方法: 编译看左边(父类),执行看右边(子类)
  • 为什么成员变量和成员方法的访问不一样呢?
    • 因为成员方法有重写,而成员变量没有
  • 多态的好处: 提高了程序的扩展性
  • 具体体现: 定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的任意子类对象
  • 多态的弊端: 不能使用子类的特有功能
    • 如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现 ClassCastException
    • 判断关键字左边的变量,是否是右边的类型,返回boolean类型结果



  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象

成员内部类是在类中定义的

    • 私有成员内部类访问:在自己所在的外部类中创建对象访问。
    • 静态成员内部类访问格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
    • 静态成员内部类中的静态方法:外部类名.内部类名.方法名();

局部内部类是在方法中定义的

  • 需要在方法内部创建对象并使用
  • 该类可以直接访问外部类的成员,也可以访问(创建该局部类)方法内的局部变量

  • 匿名内部类本质上是一个特殊的局部内部类(定义在方法内部)
  • 前提: 需要存在一个接口或类


③. 接口在中存在多个方法

④. 匿名函数在开发中的使用

当方法的形式参数是接口或者抽象类时,可以将匿名内部类作为实际参数进行传递


匿名内部类中重写 swim() 方法的代码分析:

  • 方法形式参数为空,说明调用方法时不需要传递参数
  • 方法返回值类型为void,说明方法执行没有结果返回
  • 方法体中的内容,是我们具体要做的事情

Lambda表达式的代码分析:

  • (): 里面没有内容,可以看成是方法形式参数为空
  • ->: 用箭头指向后面要做的事情
  • { }: 包含一段代码,我们称之为代码块,可以看成是方法体中的内容

Lambda表达式的格式:

  • 形式参数: 如果有多个参数,参数之间用逗号隔开
  • ->: 固定写法,代表指向动作
  • 代码块: 是我们具体要做的事情,也就是以前我们写的方法体内容

  1. 在该接口中存在一个抽象方法(show),该方法是无参数无返回值

  1. 在该接口中存在一个抽象方法(printMessage),该方法是有参数无返回值

  1. 在该接口中存在一个抽象方法(getNumber),该方法是无参数但是有返回值

  1. 在该接口中存在一个抽象方法(calc),该方法是有参数也有返回值

  • 参数类型可以省略,但是有多个参数的情况下,不能只省略一个
  • 如果参数有且仅有一个,那么小括号可以省略
  • 如果代码块的语句只有一条,可以省略大括号和分号,甚至是return

⑹. Lambda表达式和匿名内部类的区别

    • 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
    • Lambda表达式: 只能是接口
    • 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
    • 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
    • 匿名内部类:编译之后,产生一个单独的.class字节码文件
    • Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成


返回两个int值中的较大值
返回两个int值中的较小值

arraycopy(数据源数组, 起始索引, 目的地数组, 起始索引, 拷贝个数)
返回当前时间(以毫秒为单位)
终止当前运行的 Java 虚拟机,非零表示异常终止

每个类都可以将 Object 作为父类。所有类都直接或者间接的继承自该类

  • Object类是所有类的直接或者间接父类
  • 直接打印一个对象就是打印这个对象的toString方法的返回值
  • 一般会对toString方法进行重写

返回对象的字符串表示形式;建议所有子类重写该方法,自动生成
比较对象是否相等;默认比较地址,重写可以比较内容,自动生成


返回参数中对象的字符串表示形式
返回对象的字符串表示形式


将基本数据类型封装成对象的目的是:可以在对象中定义更多的功能方法操作该数据;
例如: 基础数据类型和字符串之间转换


Integer:该对象中包装了一个基本数据类型int的值



将字符串类型的整数变成int类型的整数


需求: 有一个字符串"90 26 73 59 40",把其中每一个数存到 int 类型的数组中,并输出

在计算机科学中,二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法


冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法
冒泡排序的思想就是在每次遍历一遍未排序的数列之后,将一个数据元素浮上去(也就是排好了一个数据)


以编程的角度来看,递归指的是方法定义中调用方法本身的现象


快速排序(Quick Sort)算法是在冒泡排序的基础上进行改进的一种算法,该排序算法的特点是快、效率高,是处理大数据最快的排序算法之一
实现的基本思想是:通过一次排序将整个无序表分成相互独立的两部分,其中一部分中的数据都比另一部分中包含的数据的值小;然后继续沿用此方法分别对两部分进行同样的操作,直到每一个小部分不可再分,所得到的整个序列就变成有序序列

Arrays 类包含用于操作数组的各种方法

返回指定数组的内容的字符串表示形式
按照数字顺序排列指定的数组
利用二分查找返回指定元素的索引



就是程序出现了不正常的情况。程序在执行过程中,出现的非正常的情况,最终会导致 JVM 的非正常停止
注意: 语法错误不算在异常体系中

  • Error :严重问题,通过代码无法处理。 比如:内存溢出。
  • Exception :称为异常类,它表示程序本身可以处理的问题
    • RuntimeException 及其子类:运行时异常 (空指针异常,数组索引越界异常)
    • RuntimeException 之外所有的异常:编译期必须处理的,否则程序不能通过编译 (日期格式化异常)

编译时异常和运行时异常:

  • Javac.exe: 编译时异常,是在编译成class文件时必须要处理的异常,也称之为受检异常
  • Java.exe: 运行时异常,在编译成class文件不需要处理,在运行字节码文件时可能出现的异常。也称之为非受检异常

⑷. JVM 的默认处理方案

  • 如果程序出现了问题,没有设定异常处理的话,最终 JVM 会做默认的处理。
  • 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台程序停止执行

  • 编译时异常因为在编译时就会检查,所以必须要写在方法后面进行显示声明
  • 运行时异常因为在运行时才会发生,所以在方法后面可以不写



用在方法声明后面,跟的是异常类名 throw 用在方法体内,跟的是异常对象名
表示声明异常,调用该方法有可能会出现这样的异常 表示手动抛出异常对象,由方法体内的语句处理




1. 如果 try 中没有遇到问题,怎么执行?

  • 会把try中所有的代码全部执行完毕,不会执行catch里面的代码

2. 如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?

  • 那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了
  • 当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码

3. 如果出现的问题没有被捕获,那么程序如何运行?

  • 那么try…catch就相当于没有写,那么也就是自己没有处理

4. 同时有可能出现多个异常怎么处理?

  • 出现多个异常,那么就写多个catch就可以了
  • 注意点: 如果多个异常之间存在子父类关系,那么父类一定要写在下面

返回此可抛出的简短描述
把异常的错误信息输出在控制台

需求: 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,超出这个范围是异常数据不能赋值,需要重新录入,一直录到正确为止

自定义异常存在的意义:就是为了让控制台的报错信息更加的见名之意。


}

原因:多是import引用了无用的类,或集合没指定元素的类型

1、可逐一到出现感叹号的java文件中去处理

3、可根据markers窗口下的Java Problems菜单下提示的警告信息到指定的文件中逐一处理

}

我要回帖

更多关于 偶尔头晕一下怎么回事 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信