JAVA基础
2016-08-06 14:19:52 0 举报
AI智能生成
Java是一种广泛使用的计算机编程语言,具有跨平台、面向对象、安全性高等特点。Java基础包括Java语法、数据类型、运算符、流程控制语句、数组、方法等知识点。Java语言的执行环境是Java虚拟机(JVM),它负责将Java字节码转换为特定平台的机器码并执行。Java提供了丰富的类库,可以用于开发各种类型的应用程序,如桌面应用、移动应用、Web应用等。学习Java基础是掌握Java编程的第一步,通过学习Java基础,可以为进一步学习Java高级特性和框架打下坚实的基础。
作者其他创作
大纲/内容
Eclipse
Java开发常见工具介绍
A:操作系统自带的记事本软件
B:高级记事本软件
C:集成开发环境 IDE
Eclipse和MyEclipse介绍
Eclipse是一种可扩展的开放源代码的IDE。
Eclipse的特点描述
免费
纯Java语言编写
免安装(绿色版)
扩展性强(通过插件)
MyEclipse
在Eclipse基础上追加的功能性插件,对插件收费
在WEB开发中提供强大的系统架构平台
Eclipse下载,安装及卸载
下载 http://eclipse.org/
安装
绿色版 解压就可以使用(Eclipse)
安装版 双击运行,一路next即可(JDK)
卸载
绿色版 直接删除文件夹即可
安装版 专业卸载软件或者控制面板添加删除程序
Eclipse的基本使用
选择工作空间
选择工作空间
工作空间 其实就是我们写的源代码所在的目录
用Eclipse来完成一个HelloWorld案例
代码以项目为基本单位
创建项目
创建包
创建类
编写代码
编译
编译
自动编译,在保存的那一刻帮你做好了
运行
点击虫子后面的绿色内在三角形按钮
点击Run菜单下的run。也可以使用快捷键Ctrl+F11
选择要运行的文件或者在要运行的文件内容中
右键 -- Run as - Java Application即可
看到Console即可,它就是Eclipse自带的控制台
使用dropins安装插件
使用dropins安装插件
从Eclipse3.5开始,安装目录下就多了一个dropins目录,只要将插件解压后放到到该目录即可。
同理,这种方式卸载插件也是特别的方便,推荐这种方式
大家可以同时使用中文版和英文版,这样还可以学英语
源代码语法检查
红色波浪线
黄色波浪线
视窗
视窗 每一个基本的窗体被称为视窗
PackageExplorer 显示项目结构,包,类,及资源
Outline 显示类的结构,方便查找,识别,修改
Console 程序运行的结果在该窗口显示
Problems 显示所有语法及错误所在的位置
Hierarchy 显示Java继承层次结构,选中类后F4
视图 是由某些视窗的组合而成的。举例
Java视图
Debug视图
常遇问题
A:程序的编译和运行的环境配置(一般不改)
window -- Preferences -- Java
编译环境:Compiler 默认选中的就是最高版本。
运行环境:Installed JREs 默认会找你安装的那个JDK。建议配置了Java的环境变量。
问题:
低编译,高运行。可以。
高编译,低运行。不可以。
建议,编译和运行的版本一致。
B:如何去掉默认注释?
window -- Preferences -- Java -- Code Style -- Code Templates
选择你不想要的内容,通过右边Edit编辑。
注意:请只删除注释部分,不是注释部分的不要删除。
C:行号的显示和隐藏
显示:在代码区域的最左边的空白区域,右键 -- Show Line Numbers即可。
隐藏:把上面的动作再做一次。
D:字体大小及颜色
a:Java代码区域的字体大小和颜色:
window -- Preferences -- General -- Appearance -- Colors And Fonts -- Java修改 -- Java Edit Text Font
b:控制台
window -- Preferences -- General -- Appearance -- Colors And Fonts -- Debug -- Console font
c:其他文件
window -- Preferences -- General -- Appearance -- Colors And Fonts -- Basic -- Text Font
E:窗体给弄乱了,怎么办?
window -- Reset Perspective
F:控制台找不到了,怎么办?
Window--Show View—Console
快捷键
快捷键
a:格式化。
在代码区域:ctrl+shift+f
在代码区域:右键 -- source -- Format
b:导入包。
导入方式:
自己手动写完代码,需要导入包:ctrl+shift+o
有些时候,通过alt+/提示的类,会自动把包导入。
有些类在多个包下都有,请问,肿么办?
你按了提示后,它会把所有的包给你显示,让你选择。
c:注释问题
单行注释:
选中需要被注释的内容:ctrl+/
想取消注释,再次选中,然后ctrl+/
多行注释:
选中需要被注释的内容:ctrl+shift+/
想取消注释,再次选中,然后ctrl+shift+\
d:代码上下移动
选择要被移动的代码,然后alt+上/下箭头即可。
自动生成构造方法
自动生成构造方法
a:无参构造方法 在代码区域右键--source--Generate Constructors from Superclass
b:带参构造方法 在代码区域右键--source--Generate Constructors using fields.. -- finish
自动生成get/set方法
在代码区域右键--source--Generate Getters and Setters...
继承抽象类,或者实现接口
a:以前做法 先写类,然后在类中在去继承类或者实现接口
b:现在做法 在创建类的时候,选择要继承的类或者实现的接口。
Object是所有类的父类,所有类都直接或者间接的继承自Object。
编写源程序
编写源程序(设计接口,抽象类,具体类案例)
针对源程序添加文档注释
选中项目--右键--Export--Java--Javadoc—Finish
导出animal成jar包,然后给练习vetech_02用
jar是什么?
jar是什么?
jar是多个class文件的压缩包。
jar有什么用?
用别人写好的东西
打jar包
选中项目--右键--Export--Java--Jar--自己指定一个路径和一个名称--Finish
使用jar包
复制到项目路径下并添加至构建路径。jar包有什么用,怎么用?
a:用于把别人写好的东西,直接拿过来使用。
b:怎么用
(1)找到jar包。
(2)复制jar包,粘贴到要使用的项目路径下。
(3)把jar添加到构建路径。classpath。
选中jar包,右键Build path -- add to build path
(4)按照正常用法用就可以了。
删除项目
删除项目
选中项目 – 右键 – 删除
从项目区域中删除
从硬盘上删除
导入项目
在项目区域右键找到import
找到General,展开,并找到
Existing Projects into Workspace
点击next,然后选择你要导入的项目
注意:这里选择的是项目名称
如何查看项目所在路径
如何查看项目所在路径
选中 -- 右键 -- Properties -- Resource -- Location
导入项目要注意的问题
项目区域中不可能出现同名的项目(新建或者导入)
自己随意建立的文件夹是不能作为项目导入的
修改项目问题
不要随意修改项目名称
如果真要修改,不要忘记了配置文件.project中的
把这里改为你改后的名称
Eclipse的高级使用
Debug的作用(练习vetech_03)
调试程序
查看程序执行流程
如何查看程序执行流程
什么是断点
如何设置断点
在哪里设置断点
如何运行设置断点后的程序
看哪些地方
如何去除断点
断点:就是一个标记,表示从哪里开始看程序
A:如何设置断点
在语句的最左边,双击即可。
B:在哪里加
现在:在每一个方法的第一条有效语句上加。
以后:哪里不会加哪里。
C:怎么运行断点的程序
在代码区域--右键--Debug as--Java Appliaction
弹出一个界面:问你是否需要打开断点界面。并问你是否需要记录。
是(Yes),是(选中复选框)。
D:弹出了断点界面
a:点哪里
Step Over:跳过一行
F6:看到每一行的执行过程。
b:看哪里
看源代码:对照看程序的执行步骤
看Debug界面:对照看程序的执行步骤
看变量界面:看变量的产生,赋值,及消失。
E:如何去除断点
a:把添加的动作再做一遍
b:一键清除版
选择Debug界面--breakPoints--Remove All... 带两个x的。
集合(掌握)
Collection
集合的由来
我们学习的是Java -- 面向对象 -- 操作很多对象 -- 存储 -- 容器(数组和StringBuffer) -- 数组
而数组的长度固定,所以不适合做变化的需求,Java就提供了集合供我们使用。
集合和数组的区别
A:长度区别
数组固定
集合可变
B:内容区别
数组可以是基本类型,也可以是引用类型
集合只能是引用类型
C:元素内容
数组只能存储同一种类型
集合可以存储不同类型(其实集合一般存储的也是同一种类型)
集合的继承体系结构
集合的继承体系结构?
由于需求不同,Java就提供了不同的集合类。这多个集合类的数据结构不同,
但是它们都是要提供存储和遍历功能的,
我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
Collection
|--List
|--ArrayList
|--Vector
|--LinkedList
|--Set
|--HashSet
|--TreeSet
Collection的功能概述
A:添加功能
add(Object obj)//给集合增加元素
B:删除功能
remove(Object obj)//删除集合中元素
C:判断功能
contains(Object obj)// 如果集合中包含指定的元素,则返回 true。
D:获取功能
Iterator iterator()//集合专用迭代器
E:长度功能
size()//返回集合的长度
F:交集(了解)
boolean removeAll(Collection c)//删除两个集合的交集
boolean containsAll(Collection c)//集合中包含指定 集合 中的所有元素,则返回 true。
boolean retainAll(Collection c)
Collection集合的遍历
Collection集合的遍历
A:把集合转数组(了解)
B:迭代器(集合专用方式)
迭代器
迭代器
A:是集合的获取元素的方式。
B:是依赖于集合而存在的。
C:迭代器的原理和源码。
a:为什么定义为了一个接口而不是实现类?
b:看了看迭代器的内部类实现。
Collection集合的案例(遍历方式 迭代器)
Collection集合的案例(遍历方式 迭代器)
集合的操作步骤:
A:创建集合对象
B:创建元素对象
C:把元素添加到集合
D:遍历集合
A:存储字符串并遍历
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class CollectionDemo {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//创建并添加元素
c.add("hello");
c.add("world");
c.add("java");
//遍历集合
Iterator it = c.iterator();
while(it.hasNext()) {
String s =(String) it.next();
System.out.println(s);
}
}
}
B:存储自定义对象并遍历
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//getXxx()/setXxx()
}
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class StudentDemo {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//创建学生对象
Student s1 = new Student("橙橙",27);
Student s2 = new Student("刘刚",30);
Student s3 = new Student("胡志辉",16);
//添加元素
c.add(s1);
c.add(s2);
c.add(s3);
c.add(s4);
c.add(s5);
//遍历集合
Iterator it = c.iterator();
while(it.hasNext()) {
Student s = (Student)it.next();
System.out.println(s.getName()+"---"+s.getAge());
}
}
}
Set集合(理解)
Set集合的特点
无序,唯一
HashSet集合(掌握)
HashSet集合(掌握)
A:底层数据结构是哈希表(是一个元素为链表的数组)
B:哈希表底层依赖两个方法:hashCode()和equals()
执行顺序:
首先比较哈希值是否相同
相同:继续执行equals()方法
返回true:元素重复了,不添加
返回false:直接把元素添加到集合
不同:就直接把元素添加到集合
C:如何保证元素唯一性的呢?
由hashCode()和equals()保证的
D:开发的时候,代码非常的简单,自动生成即可。
E:HashSet存储字符串并遍历
F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)
TreeSet集合
TreeSet集合
A:底层数据结构是红黑树(是一个自平衡的二叉树)
B:保证元素的排序方式
a:自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
b:比较器排序(集合具备比较性)
让集合构造方法接收Comparator的实现类对象
案例
案例:
A:获取无重复的随机数
B:键盘录入学生按照总分从高到底输出
Collection集合总结(掌握)
Collection
|--List 有序,可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
|--Set 无序,唯一
|--HashSet
底层数据结构是哈希表。
如何保证元素唯一性的呢?
依赖两个方法:hashCode()和equals()
开发中自动生成这两个方法即可
|--LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一
|--TreeSet
底层数据结构是红黑树。
如何保证元素排序的呢?
自然排序
比较器排序
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
针对Collection集合我们到底使用谁呢?(掌握)
针对Collection集合我们到底使用谁呢?(掌握)
唯一吗?
是:Set
排序吗?
是:TreeSet
否:HashSet
如果你知道是Set,但是不知道是哪个Set,就用HashSet。
否:List
要安全吗?
是:Vector
否:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
如果你知道是List,但是不知道是哪个List,就用ArrayList。
如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
如果你知道用集合,就用ArrayList。
在集合中常见的数据结构(掌握)
ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序
集合(List)(掌握)
概述
List是Collection的子接口
List集合的特有遍历功能
List集合的特有遍历功能
A:由size()和get()结合。
B:代码演示
//创建集合对象
List list = new ArrayList();
//创建并添加元素
list.add("hello");
list.add("world");
list.add("java");
//遍历集合
Iterator it = list.iterator();
while(it.hasNext()) {
String s =(String) it.next();
System.out.println(s);
}
System.out.println("----------");
for(int x=0; x
列表迭代器的特有功能;(了解)
可以逆向遍历,但是要先正向遍历,所以无意义,基本不使用。
并发修改异常
并发修改异常
A:出现的现象
迭代器遍历集合,集合修改集合元素
B:原因
迭代器是依赖于集合的,而集合的改变迭代器并不知道。
C:解决方案
a:迭代器遍历,迭代器修改(ListIterator)
元素添加在刚才迭代的位置
b:集合遍历,集合修改(size()和get())
元素添加在集合的末尾
常见数据结构
(1)常见数据结构
A:栈 先进后出
B:队列 先进先出
C:数组 查询快,增删慢
D:链表 查询慢,增删快
List的子类特点(面试题)
List的子类特点(面试题)
ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
到底使用谁呢?看需求?
分析:
要安全吗?
要:Vector(即使要,也不使用这个,后面再说)
不要:ArrayList或者LinkedList
查询多;ArrayList
增删多:LinkedList
List的子类特点
ArrayList
ArrayList:
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
Vector
Vector:
底层数据结构是数组,查询快,增删慢
线程安全,效率低
LinkedList
LinkedList:
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
案例
)ArrayList
A:没有特有功能需要学习
B:案例
a:ArrayList存储字符串并遍历
b:ArrayList存储自定义对象并遍历
(3)Vector
A:有特有功能
a:添加
public void addElement(E obj) -- add()
b:获取
public E elementAt(int index) -- get()
public Enumeration elements() -- iterator()
B:案例
a:Vector存储字符串并遍历
b:Vector存储自定义对象并遍历
(4)LinkedList
A:有特有功能
a:添加
addFirst()
addLast()
b:删除
removeFirst()
removeLast()
c:获取
getFirst()
getLast()
B:案例
a:LinkedList存储字符串并遍历
b:LinkedList存储自定义对象并遍历
(5)案例:
A:去除集合中的多个字符串的重复元素
如果字符串的内容相同,即为重复元素
B:去除集合中的多个自定义对象的重复元素
如果自定义对象的成员变量值都相同,即为重复元素
C:用LinkedList模拟一个栈数据结构的集合类,并测试。
你要定义一个集合类,只不过内部可以使用LinkedList来实现。
泛型
泛型概述
泛型概述
是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。
格式
格式:
<数据类型>
注意:该数据类型只能是引用类型。
好处
好处:
A:把运行时期的问题提前到了编译期间
B:避免了强制类型转换
C:优化了程序设计,解决了黄色警告线问题,让程序更安全
泛型的前世今生
泛型的前世今生
A:泛型的由来
Object类型作为任意类型的时候,在向下转型的时候,会隐含一个转型问题
B:泛型类
C:泛型方法
D:泛型接口
E:泛型高级通配符
?
? extends E
? super E
静态导入(了解)
和可变参数(掌握)
1:静态导入(了解)
(1)可以导入到方法级别的导入
(2)格式:
import static 包名....类名.方法名;
(3)注意事项:
A:方法必须是静态的
B:如果多个类下有同名的方法,就不好区分了,还得加上前缀。
所以一般我们并不使用静态导入,但是一定要能够看懂。
2:可变参数(掌握)
(1)如果我们在写方法的时候,参数个数不明确,就应该定义可变参数。
(2)格式:
修饰符 返回值类型 方法名(数据类型... 变量) {}
注意:
A:该变量其实是一个数组名
B:如果一个方法有多个参数,并且有可变参数,可变参数必须在最后
(3)Arrays工具类的一个方法
asList()把数组转成集合。
注意:这个集合的长度不能改变。
3:登录注册案例(理解)
Map(掌握)
Map集合的遍历
概述
A:键找值
a:获取所有键的集合
b:遍历键的集合,得到每一个键
c:根据键到集合中去找值
B:键值对对象找键和值
a:获取所有的键值对对象的集合
b:遍历键值对对象的集合,获取每一个键值对对象
c:根据键值对对象去获取键和值
代码体现
代码体现:
Map hm = new HashMap();
hm.put("陈明","黄子翔");
hm.put("陈寒杰","张广军");
//方式1 键找值
Set set = hm.keySet();
for(String key : set) {
String value = hm.get(key);
System.out.println(key+"---"+value);
}
//方式2 键值对对象找键和值
Set> set2 = hm.entrySet();
for(Map.Entry me : set2) {
String key = me.getKey();
String value = me.getValue();
System.out.println(key+"---"+value);
}
Map接口功能概述
A:添加功能V put(K key,V value)
B:删除功能V remove(Object key) void clear()
C:判断功能boolean containsKey(Object key) boolean containsValue(Object value)
D:获取功能boolean isEmpty()
Map集合的遍历
Map集合的遍历
A:键找值
a:获取所有键的集合
b:遍历键的集合,得到每一个键
c:根据键到集合中去找值
B:键值对对象找键和值
a:获取所有的键值对对象的集合
b:遍历键值对对象的集合,获取每一个键值对对象
c:根据键值对对象去获取键和值
代码体现:
Map hm = new HashMap();
hm.put("陈明","黄子翔");
hm.put("陈寒杰","张广军");
//方式1 键找值
Set set = hm.keySet();
for(String key : set) {
String value = hm.get(key);
System.out.println(key+"---"+value);
}
//方式2 键值对对象找键和值
Set> set2 = hm.entrySet();
for(Map.Entry me : set2) {
String key = me.getKey();
String value = me.getValue();
System.out.println(key+"---"+value);
}
HashMap集合的练习
A:HashMap
B:HashMap
C:HashMap
D:HashMap
TreeMap集合的练习
A:TreeMap
B:TreeMap
案例
A:统计一个字符串中每个字符出现的次数
B:集合的嵌套遍历
a:HashMap嵌套HashMap
b:HashMap嵌套ArrayList
c:ArrayList嵌套HashMap
d:多层嵌套
Collections(理解)
概述
是针对集合进行操作的工具类
面试题:Collection和Collections的区别
面试题:Collection和Collections的区别
A:Collection 是单列集合的顶层接口,有两个子接口List和Set
B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等
常见的几个小方法
常见的几个小方法:
A:public static void sort(List list)
B:public static int binarySearch(List> list,T key)
C:public static T max(Collection> coll)
D:public static void reverse(List> list)
E:public static void shuffle(List> list)
案例
案例
A:ArrayList集合存储自定义对象的排序
B:模拟斗地主洗牌和发牌
C:模拟斗地主洗牌和发牌并对牌进行排序
常用类
Object类(掌握)
概述
Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类。
Object类的构造方法有一个,并且是无参构造
这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造
方法
要掌握的方法
要掌握的方法:
A:toString()
返回对象的字符串表示,默认是由类的全路径+'@'+哈希值的十六进制表示。
这个表示其实是没有意义的,一般子类都会重写该方法。
如何重写呢?过程我也讲解过了,基本上就是要求信息简单明了。
但是最终还是自动生成。
要了解的方法
要了解的方法:
A:hashCode() 返回对象的哈希值。不是实际地址值,可以理解为地址值。
B:getClass() 返回对象的字节码文件对象,反射中我们会详细讲解
C:finalize() 用于垃圾回收,在不确定的时间
D:clone() 可以实现对象的克隆,包括成员变量的数据复制,但是它和两个引用指向同一个对象是有区别的。
两个注意问题
两个注意问题;
A:直接输出一个对象名称,其实默认调用了该对象的toString()方法。
B:面试题
==和equals()的区别?
A:==
基本类型:比较的是值是否相同
引用类型:比较的是地址值是否相同
B:equals()
只能比较引用类型。默认情况下,比较的是地址值是否相同。
但是,我们可以根据自己的需要重写该方法。
Scanner的使用(了解)
概述
在JDK5以后出现的用于键盘录入数据的类。
构造方法
构造方法:
A:讲解了System.in这个东西。
它其实是标准的输入流,对应于键盘录入
B:构造方法
InputStream is = System.in;
Scanner(InputStream is)
C:常用的格式
Scanner sc = new Scanner(System.in);
基本方法格式
A:hasNextXxx() 判断是否是某种类型的
B:nextXxx() 返回某种类型的元素
要掌握的两个方法
要掌握的两个方法
A:public int nextInt()
B:public String nextLine()
需要注意的小问题
需要注意的小问题
A:同一个Scanner对象,先获取数值,再获取字符串会出现一个小问题。
B:解决方案:
a:重新定义一个Scanner对象
b:把所有的数据都用字符串获取,然后再进行相应的转换
String类的概述和使用(掌握)
概述
多个字符组成的一串数据。
其实它可以和字符数组进行相互转换。
构造方法
构造方法:
A:public String()
B:public String(byte[] bytes)
C:public String(byte[] bytes,int offset,int length)
D:public String(char[] value)
E:public String(char[] value,int offset,int count)
F:public String(String original)
下面的这一个虽然不是构造方法,但是结果也是一个字符串对象
G:String s = "hello";
字符串的特点
字符串的特点
A:字符串一旦被赋值,就不能改变。
注意:这里指的是字符串的内容不能改变,而不是引用不能改变。
B:字面值作为字符串对象和通过构造方法创建对象的不同
String s = new String("hello");和String s = "hello"的区别?
第一个是创建对象 把“hello”地址值放到了堆里,第二个把“hello”地 址值放在了常量池里
字符串的面试题
A:==和equals()
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);// false
System.out.println(s1.equals(s2));// true
String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3 == s4);// false
System.out.println(s3.equals(s4));// true
String s5 = "hello";
String s6 = "hello";
System.out.println(s5 == s6);// true
System.out.println(s5.equals(s6));// true
B:字符串的拼接
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1 + s2);// false
System.out.println(s3.equals((s1 + s2)));// true
System.out.println(s3 == "hello" + "world");// false 这个我们错了,应该是true
System.out.println(s3.equals("hello" + "world"));// true
字符串的功能
判断功能
判断功能
boolean equals(Object obj)//指示其他某个对象是否与此对象“相等”
boolean equalsIgnoreCase(String str)//将此 String与另一个 String比较,不考虑大小写
boolean contains(String str)//当且仅当此字符串包含指定的char值序列时,返回 true
boolean startsWith(String str)//测试此字符串是否以指定的前缀开
boolean endsWith(String str)//测试此字符串是否以指定的后缀结束
boolean isEmpty()//当且仅当此字符串的长度为0时返回true
获取功能
获取功能
int length()返回此字符串的长度
char charAt(int index)// 返回指定索引处的char值
int indexOf(int ch)//返回指定字符在此字符串中第一次出现处的索引
int indexOf(String str)//返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(int ch,int fromIndex)//返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索
int indexOf(String str,int fromIndex)//返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
String substring(int start)//返回一个新的字符串,它是此字符串的一个子字符串
String substring(int start,int end)//返回一个新字符串,它是此字符串的一个子字符串
字符串的案例
字符串的案例
A:模拟用户登录
B:字符串遍历
C:统计字符串中大写,小写及数字字符的个数
StringBuffer(掌握)
概述
用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了
一个字符串缓冲区类。StringBuffer供我们使用。
StringBuffer的构造方法
StringBuffer的构造方法
A:StringBuffer()
B:StringBuffer(int size)指定初始容量长度
C:StringBuffer(String str)构造一个字符串缓冲区,并将其内容初始化为指定字符串内容,初始化容器长度为字符串+16
StringBuffer的常见功能
A:添加功能
append()
insert()
B:删除功能
deleteCharAt()
delete()
C:替换功能
replace()
D:反转功能
reverse()
E:截取功能(注意这个返回值)
substring()
StringBuffer的练习
A:String和StringBuffer相互转换
String -- StringBuffer
构造方法
StringBuffer String=new StringBuffer();
StringBuffer -- String
toString()方法
String StringBuffer=new StringBuffer.toString
B:字符串的拼接
C:把字符串反转
D:判断一个字符串是否对称
面试题
小细节:
StringBuffer:同步的,数据安全,效率低。
StringBuilder:不同步的,数据不安全,效率高。
A:String,StringBuffer,StringBuilder的区别
B:StringBuffer和数组的区别?
StringBuffer是一个字符序列,可以看成一个char[] ,数组同样数据类型集合,
数组的数据类型可以是多种,但是StringBuffer只能char数组
注意的问题
String作为形式参数,StringBuffer作为形式参数。
数组高级以及Arrays(掌握)
排序
A:冒泡排序
A:冒泡排序
相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。
同理,其他的元素就可以排好。
public static void bubbleSort(int[] arr) {
for(int x=0; x arr[y+1]) {
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
B:选择排序
B:选择排序
把0索引的元素,和索引1以后的元素都进行比较,第一次完毕,
最小值出现在了0索引。同理,其他的元素就可以排好。
public static void selectSort(int[] arr) {
for(int x=0; x
查找
A:基本查找
把0索引的元素,和索引1以后的元素都进行比较,第一次完毕,最小值出现在了0索引。
同理,其他的元素就可以排好。
public static void selectSort(int[] arr) {
for(int x=0; x
二分查找(折半查找)
二分查找(折半查找)
针对数组有序的情况(千万不要先排序,在查找)
public static int binarySearch(int[] arr,int value) {
int min = 0;
int max = arr.length-1;
int mid = (min+max)/2;
while(arr[mid] != value) {
if(arr[mid] > value) {
max = mid - 1;
}else if(arr[mid] < value) {
min = mid + 1;
}
if(min > max) {
return -1;
}
mid = (min+max)/2;
}
return mid;
}
Arrays工具类
A:是针对数组进行操作的工具类。包括排序和查找等功能。
B:要掌握的方法(自己补齐方法)
把数组转成字符串:
排序:
二分查找:
(4)Arrays工具类的源码解析
(5)把字符串中的字符进行排序
举例:
"edacbgf"
得到结果
"abcdefg"
Integer(掌握)
概述
为了让基本类型的数据进行更多的操作,
Java就为每种基本类型提供了对应的包装类类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
Integer的构造方法
Integer的构造方法
A:Integer i = new Integer(100);
B:Integer i = new Integer("100");
注意:这里的字符串必须是由数字字符组成
String和int的相互转换
String和int的相互转换
A:String -- int
Integer.parseInt("100");
B:int -- String
String.valueOf(100);
其他的功能(了解)
其他的功能(了解)
进制转换
JDK5的新特性
JDK5的新特性
自动装箱 基本类型--引用类型
自动拆箱 引用类型--基本类型
把下面的这个代码理解即可:
Integer i = 100;
i += 200;
Character(了解)
Character构造方法
Character构造方法
Character ch = new Character('a');
要掌握的方法
A:判断给定的字符是否是大写
//public static boolean isUpperCase(char ch)
B:判断给定的字符是否是小写
//public static boolean isLowerCase(char ch)
C:判断给定的字符是否是数字字符
//public static boolean isDigit(char ch)
D:把给定的字符转成大写
//public static char toUpperCase(char ch)
E:把给定的字符转成小写
//public static char toLowerCase(char ch)
正则表达式(理解)
概述
就是符合一定规则的字符串
常见规则
字符
x 字符 x。举例:'a'表示字符a
\\ 反斜线字符。
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
B:字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
预定义字符类
预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? \.
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是不是单词字符的地方。
举例:hello world?haha;xixi
E:Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
常见功能
A:判断功能
String类的public boolean matches(String regex)
B:分割功能
String类的public String[] split(String regex)
C:替换功能
String类的public String replaceAll(String regex,String replacement)
D:获取功能
Pattern和Matcher
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
find():查找存不存在
group():获取刚才查找过的数据
案例
案例
A:判断电话号码和邮箱
B:按照不同的规则分割数据
C:把论坛中的数字替换为*
D:获取字符串中由3个字符组成的单词
Math(掌握)
概述
针对数学运算进行操作的类
常见方法
A:绝对值public static int abs(int a)
B:向上取整public static double ceil(double a)
C:向下取整public static double floor(double a)
D:两个数据中的大值public static int max(int a,int b)
E:a的b次幂public static double pow(double a,double b)
F:随机数public static double random()
G:四舍五入public static int round(float a)
H:正平方根public static double sqrt(double a)
案例
案例:
A:猜数字小游戏
Random(理解)
概述
用于产生随机数的类
构造方法
构造方法:
A:Random() 默认种子,每次产生的随机数不同
B:Random(long seed) 指定种子,每次种子相同,随机数就相同
成员方法
成员方法:
A:int nextInt() 返回int范围内的随机数
B:int nextInt(int n) 返回[0,n)范围内的随机数
System(掌握)
概述
系统类,提供了一些有用的字段和方法
成员方法
A:运行垃圾回收器public static void gc()
B:退出jvm public static void exit(int status)
C:获取当前时间的毫秒值public static long currentTimeMillis()
D:数组复制public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
:BigInteger(理解)
概述
针对大整数的运算
构造方法
构造方法
A:BigInteger(String s)
成员方法
A:加public BigInteger add(BigInteger val)
B:减public BigInteger subtract(BigInteger val)
C:乘public BigInteger multiply(BigInteger val)
D:除public BigInteger divide(BigInteger val)
E:商和余数public BigInteger[] divideAndRemainder(BigInteger val)
BigDecimal(理解)
概述
浮点数据做运算,会丢失精度。所以,针对浮点数据的操作建议采用BigDecimal。(金融相关的项目)
构造方法
构造方法
A:BigDecimal(String s)
成员方法
A:加public BigDecimal add(BigDecimal augend)
B:减public BigDecimal subtract(BigDecimal subtrahend)
C:乘public BigDecimal multiply(BigDecimal multiplicand)
D:除public BigDecimal divide(BigDecimal divisor)
E:自己保留小数几位public BigDecimal divide(BigDecimal divisor,int scale,
int roundingMode)
Date/DateFormat(掌握)
概述
Date是日期类,可以精确到毫秒。
构造方法
构造方法
Date()
Date(long time)
成员方法
成员方法
getTime()
setTime(long time)
SimpleDateFormat
概述
DateFormat针对日期进行格式化和针对字符串进行解析的类,但是是抽象类,所以使用其子类SimpleDateFormat
SimpleDateFormat(String pattern) 给定模式
SimpleDateFormat(String pattern) 给定模式
yyyy-MM-dd HH:mm:ss
日期和字符串的转换
日期和字符串的转换
a:Date -- String
format()
b:String -- Date
parse()
案例
算一下你来到这个世界多少天?
JAVA概述
计算机概述(了解)
(1)计算机
(2)计算机硬件
(3)计算机软件
系统软件:window,linux,mac
应用软件:qq,yy,飞秋
(4)软件开发(理解)
软件:是由数据和指令组成的。(计算器)
开发:就是把软件做出来。
如何实现软件开发呢?
就是使用开发工具和计算机语言做出东西来
(5)语言
自然语言:人与人交流沟通的
计算机语言:人与计算机交流沟通的
C,C++,C#,Java
(6)人机交换
图形界面:操作方便只管
DOS命令:需要记忆一些常见的命令
键盘功能键的认识和快捷键(掌握)
(1)功能键的认识
tab
shift
ctrl
alt
windos
空格
上下左右
回车
截图
(2)快捷键
全选 Ctrl+A
复制 Ctrl+C
粘贴 Ctrl+V
剪切 Ctrl+X
撤销 Ctrl+Z
保存 Ctrl+S
常见的DOS命令(掌握)
(1)常见的如下
盘符的切换
d:回车
目录的进入
cd javase
cd javase\day01\code
目录的回退
cd..
cd\
清屏
cls
退出
exit
创建目录
删除目录
创建文件
删除文件
显示目录下的内容
删除带内容的目录
Java语言概述(了解)
概述
Java语言的发展史
Java之父
JDK1.4.2
JDK5
JDK7
特点
有很多小特点,重点有两个开源,跨平台
保证跨平台性
针对不同的操作系统,提高不同的jvm来实现的。
Java语言的平台
JavaSE
JavaME--Android
JavaEE
JDK,JRE,JVM的作用及关系(掌握)
(1)作用
JVM:保证Java语言跨平台
JRE:Java程序的运行环境
JDK:Java程序的开发环境
(2)关系
JDK:JRE+工具
JRE:JVM+类库
JDK的下载,安装,卸载(掌握)
(1)下载到官网。
A:也可以到百度搜索即可。
B:我给你。
(2)安装
A:绿色版 解压就可以使用
B:安装版 必须一步一步的安装,一般只要会点击下一步即可
注意:
建议所有跟开发相关的软件都不要安装在有中文或者空格的目录下。
安装jdk和jre时,注意jdk和jre路径不要相同,导致jdk中jre目录文件被替换,
导致安装失败;
(3)卸载
A:绿色版 直接删除文件夹
B:安装版
a:控制面板 -- 添加删除程序
b:通过专业的软件卸载工具。(比如360的软件管家卸载)
第一个程序:HelloWorld案例(掌握)
class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
(1)程序解释:
A:Java程序的最基本单位是类,所以我们要定义一个类。
格式:class 类名
举例:class HelloWorld
B:在类中写内容的时候,用大括号括起来。
C:Java程序要想执行,必须有main方法。
格式:public static void main(String[] args)
D:要指向那些东西呢,也用大括号括起来。
E:你要做什么呢?今天我们仅仅做了一个简单的输出
格式:System.out.println("HelloWorld");
注意:""里面的内容是可以改动的。
(2)Java程序的开发执行流程:
A:编写java源程序(.java)
B:通过javac命令编译生成.class文件
C:通过java命令运行.class文件
常见的问题(掌握)
(1)扩展名被隐藏
如何找到:工具--文件夹选项--查看--去除隐藏扩展名的那个勾勾
(2)我要求文件名称和类名一致。
实际上不这样做也是可以的。
但是,注意:
javac后面跟的是文件名+扩展名
java后面跟的类名不带扩展名
(3)Java语言严格区分大小写,请注意。
还有就是单词不要写错了。
(4)见到非法字符: \65307肯定是中文问题。
我们写程序要求标点符号必须全部是英文状态。
(5)括号的配对问题。
一般来说,括号都是成对出现的。
(6)遇到
在类 HelloWorld 中找不到主方法, 请将主方法定义为
肯定是主方法的格式问题。
path环境变量(掌握)
(1)path环境变量的作用
保证javac命令可以在任意目录下运行。
同理可以配置qq等
(2)path配置的两种方案:
A:方案1(了解)
B:方案2
找到环境变量的位置,在系统变量里面
新建:
变量名:JAVA_HOME
变量值:D:\develop\Java\jdk1.7.0_60
修改:
变量名:Path
变量值:%JAVA_HOME%\bin;以前的内
classpath环境变量(理解)
(1)classpath环境变量的作用
保证class文件可以在任意目录下运行
(2)classpath环境变量的配置
找到环境变量的位置,在系统变量里面
新建:
变量名:classpath
变量值:E:\JavaSE\day01\code\HelloWorld案例
JAVA基础语法
关键字(掌握)
概念
被Java语言赋予特定含义的单词
特点
特点:
全部小写。
注意事项
注意事项:
A:goto和const作为保留字存在。
B:类似于Notepad++这样的高级记事本会对关键字有特殊颜色标记
标识符(掌握)
概念
就是给类,接口,方法,变量等起名字的字符序列
组成规则
A:英文大小写字母
B:数字
C:$和_
注意事项
A:不能以数字开头
B:不能是java中的关键字
C:区分大小写
常见的命名规则(见名知意)
A:包 全部小写,包就是文件夹
单级包:小写
举例:vetech
多级包:小写,并用.隔开
举例:cn.vetech
B:类或者接口
一个单词:首字母大写
举例:Student
多个单词:每个单词首字母大写
举例:HelloWorld
C:方法或者变量
一个单词:首字母小写
举例:main
多个单词:从第二个单词开始,每个单词首字母大写
举例:showAllNames()
D:常量
全部大写
一个单词:大写
举例:PI
多个单词:大写,并用_隔开
举例:MAX_AGE
注释(掌握)
概念
就是对程序进行解释说明的文字
分类
A:单行注释 //
B:多行注释 /**/
C:文档注释(后面讲) /** */
过程
一个程序的过程。
需求:
分析:
实现:
代码体现:
作用
A:解释说明程序,提高了代码的阅读性。
B:可以帮助我们调试程序。
常量(掌握)
概念
在程序执行的过程中,其值不发生改变的量
分类
A:字面值常量
B:自定义常量
字面值常量
A:字符串常量 "hello"
B:整数常量 12,23
C:小数常量 12.345
D:字符常量 'a','A','0'
E:布尔常量 true,false
F:空常量 null
在Java中针对整数常量提供了四种表现形式
A:二进制 由0,1组成。以0b开头。
B:八进制 由0,1,...7组成。以0开头。
C:十进制 由0,1,...9组成。整数默认是十进制。
D:十六进制 由0,1,...9,a,b,c,d,e,f(大小写均可)组成。以0x开头。
进制转换(了解)
其他进制到十进制
权位展开乘法
系数:就是每一个位上的数值
基数:x进制的基数就是x
权:对每一个位上的数据,从右,并且从0开始编号,对应的编号就是该数据的权。
结果:系数*基数^权次幂之和。
十进制到其他进制
权位展开除法
除基取余,直到商为0,余数反转。
进制转换的快速转换法
A:十进制和二进制间的转换
8421码。
B:二进制到八进制,十六进制的转换
拆分组合法,快速转换 二进制到八进制,二进制到十六进制;
A.二进制到八进制;
拆分:从右向左,3位分割,不足补0,基数每3位的十进制和
组合:从左到右,按顺序组合 十进制和;
变量(掌握)
(1)在程序的执行过程中,其值在某个范围内可以发生改变的量,举例:买香蕉
(2)变量的定义格式:
A:数据类型 变量名 = 初始化值;
B:数据类型 变量名;
变量名 = 初始化值;
数据类型(掌握)
概念
Java是一种强类型语言,针对每种数据都提供了对应的数据类型。
分类
A:基本数据类型:4类8种
B:引用数据类型:类,接口,数组
基本数据类型
A:整数 占用字节数
byte 1
short 2
int 4
long 8
B:浮点数
float 4
double 8
C:字符
char 2
D:布尔
boolean 1
注意事项
整数默认是int类型,浮点数默认是double。
长整数要加L或者l。建议大写L
单精度的浮点数要加F或者f。
数据类型转换(掌握)
默认转换(隐试转换)
)默认转换(隐试转换)
A:从小到大
B:byte,short,char -- int -- long -- float -- double
C:byte,short,char之间不相互转换,直接转成int类型参与运算。
强制转换
强制转换
A:从大到小
B:可能会有精度的损失,一般不建议这样使用。
C:格式:
目标数据类型 变量名 = (目标数据类型) (被转换的数据);
注意事项
boolean类型不参与转换
思考题和面试题
A:下面两种方式有区别吗?
float f1 = 12.345f;
float f2 = (float)12.345;
B:下面的程序有问题吗,如果有,在哪里呢?
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
byte b4 = 3 + 4;
C:下面的操作结果是什么呢?
byte b = (byte)130;
D:字符参与运算
是查找ASCII里面的值
'a' 97
'A' 65
'0' 48
System.out.println('a');
System.out.println('a' + 1);
E:字符串参与运算
这里其实是字符串的连接
System.out.println("hello"+'a'+1);
System.out.println('a'+1+"hello");
System.out.println("5+5="+5+5);
System.out.println(5+5+"=5+5");
运算符(掌握)
算术运算符
(1)算术运算符
A:+,-,*,/,%,++,--
B:+的用法
a:加法
b:正号
c:字符串连接符
-的用法:
a:负号;
b:减法;
C:/和%的区别
数据做除法操作的时候,/取得是商,%取得是余数
注意:整数与整数运算,其结果为整数;
小数与整数运算,其结果为小数;
D:++和--的用法
a:他们的作用是自增或者自减
b:使用
**单独使用
放在操作数据的前面和后面效果一样。
a++或者++a效果一样。
**参与操作使用
放在操作数的前面:先自增或者自减,再参与操作
int a = 10;
int b = ++a;
放在操作数的后面:先参与操作,再自增或者自减
int a = 10;
int b = a++;
赋值运算符
(2)赋值运算符
A:=,+=,-=,*=,/=,%=等
B:=叫做赋值运算符,也是最基本的赋值运算符
简单的来说:就是把=右边的值赋予给左边;
int x = 10; 把10赋值给int类型的变量x。
C:扩展的赋值运算符的特点
隐含了自动强制转换。
比较运算符
(3)比较运算符
A:==,!=,>,>=,<,<=
B:无论运算符两端简单还是复杂最终结果是boolean类型。
C:千万不要把==写成了=
逻辑运算符
(4)逻辑运算符
A:&,|,^,!,&&,||
B:逻辑运算符用于连接boolean类型的式子
C:结论
&:有false则false
|:有true则true
^:相同则false,不同则true。
情侣关系。
!:非true则false,非false则true
&&:结果和&是一样的,只不过有短路效果。左边是false,右边不执行。
||:结果和|是一样的,只不过有短路效果。左边是true,右边不执行。
位运算符(了解)
(5)位运算符(了解)
A:^的特殊用法
一个数据针对另一个数据位异或两次,该数不变
B:面试题
a:请实现两个变量的交换
**采用第三方变量
**用位异或运算符
左边a,b,a
右边a^b
b:请用最有效率的方式计算出2乘以8的结果
2<<3 左移 结果为:2乘以2的3次方 假如右移的话2>>3 结果是2乘以2的-3次方
三目运算符
(6)三目运算符
A:格式
比较表达式?表达式1:表达式2; 比如a=x>y?x:y; ture a=x; false a=y
注意:
比较表达式的结果为true或false
表达式可以是任意数据类型(表达式1与表达式2的类型要相同)
B:执行流程:
先比较关系表达式;
如果是true,表达式1就是结果。
如果是false,表达式2就是结果。
C:案例:
a:比较两个数据是否相等
b:获取两个数据中的最大值
c:获取三个数据中的最大值
键盘录入(掌握)
(1)实际开发中,数据是变化的,为了提高程序的灵活性,我们加入键盘录入数据。
(2)如何实现呢?目前就记住
A:导包
import java.util.Scanner;
位置:在class的上边
B:创建对象
Scanner sc = new Scanner(System.in);
C:获取数据
int x = sc.nextInt();
(3)把三元运算符的案例加入键盘录入改进。
流程控制语句
顺序结构:从上往下,依次执行
选择结构:按照不同的选择,执行不同的代码
if语句(掌握)
三种格式
A:格式1
if(比较表达式) {
语句体;
}
执行流程:
判断比较表达式的值,看是true还是false
如果是true,就执行语句体
如果是false,就不执行语句体
B:格式2
if(比较表达式) {
语句体1;
}else {
语句体2;
}
执行流程:
判断比较表达式的值,看是true还是false
如果是true,就执行语句体1
如果是false,就执行语句体2
C:格式3
if(比较表达式1) {
语句体1;
}else if(比较表达式2){
语句体2;
}
...
else {
语句体n+1;
}
执行流程:
判断比较表达式1的值,看是true还是false
如果是true,就执行语句体1
如果是false,就继续判断比较表达式2的值,看是true还是false
如果是true,就执行语句体2
如果是false,就继续判断比较表达式3的值,看是true还是false
...
如果都不满足,就执行语句体n+1
注意事项
注意事项
A:比较表达式无论简单还是复杂,结果是boolean类型
B:if语句控制的语句体如果是一条语句,是可以省略大括号的;如果是多条,不能省略。
建议:永远不要省略。
C:一般来说,有左大括号,就没有分号,有分号,就没有左大括号。
D:else后面如果没有if,是不会出现比较表达式的。
E:三种if语句其实都是一个语句,只要有一个执行,其他的就不再执行。
F:第一种If语句只有一个比较表达式,
第二种if语句有1个比较表达式,有两个语句体;
第三种if语句 可以有n个比较表达式;
案例
A:比较两个数是否相等
B:获取两个数中的最大值
C:获取三个数中的最大值(if语句的嵌套)
D:根据成绩输出对应的等级
E:根据月份,输出对应的季节
F:根据x计算对应y的值并输出
三元运算符和if语句第二种格式的关系
三元运算符和if语句第二种格式的关系
所有的三元运算符能够实现的,if语句的第二种格式都能实现。
反之不成立。
如果if语句第二种格式控制的语句体是输出语句,就不可以。
因为三元运算符是一个运算符,必须要有一个结果返回,不能是一个输出语句。
switch语句(掌握)
格式
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
格式解释说明:
switch:说明这是选择语句。
表达式:可以是byte,short,int,char
JDK5以后可以是枚举(先记住,后面讲)
JDK7以后可以是字符串
case:后面的值就是要和表达式进行比较的值
break:表示程序到这里中断,跳出switch语句
default:如果所有的情况都不匹配,就执行这里,相当于if语句中的else
执行流程
执行流程:
A:首先计算表达式的值
B:和每一个case进行匹配,如果有就执行对应的语句体,看到break就结束。
C:如果没有匹配,就执行default的语句体n+1。
注意事项
注意事项:
A:case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
B:default可以省略吗?
可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
特殊情况:
case就可以把值固定。
A,B,C,D
C:break可以省略吗?
可以省略,但是结果可能不是我们想要的。
会出现一个现象:case穿透。
最终我们建议不要省略
D:default一定要在最后吗?
不是,可以在任意位置。但是建议在最后。
E:switch语句的结束条件
a:遇到break就结束了
b:执行到末尾就结束了
案例
A:键盘录入一个数字(1-7),输出对应的星期几。
B:单项选择题
C:键盘录入一个字符串的问题
String s = sc.nextLine();
D:根据给定的月份,输出对应的季节
面试题
switch语句的表达式可以是byte吗?可以是long吗?可以是String吗?
可以,不可以,JDK7以后可以
if语句和switch语句各自的场景
if语句和switch语句各自的场景
A:if
针对boolean类型的判断
针对一个范围的判断
针对几个常量的判断
B:switch
针对几个常量的判断
循环语句(掌握)
有三种:for,while,do...while
A:用于做重复的事情;
B:使用建议:优先使用for,然后while,最后是 do...while
for循环语句
格式
for(初始化语句;判断条件语句;控制条件语句){
循环体语句;
}
执行流程
执行流程:
a:执行初始化语句
b:执行判断条件语句
如果这里是true,就继续
如果这里是false,循环就结束
c:执行循环体语句
d:执行控制条件语句
e:回到b
案例
a:输出10次HelloWorld
b:输出1-10的数据
c:输出10-1的数据
d:求1-10的和
e:求1-100的和,求1-100的偶数和,求1-100的奇数和
f:求5的阶乘
g:在控制台打印水仙花数
h:统计水仙花个数
i:改进版的回文数
一个五位数
个位 = 万位
十位 = 千位
个位 + 十位 + 千位 + 万位 = 百位
j:统计1-1000之间同时满足如下条件的数据有多少个
x%3==2
x%5==3
x%7==2
注意事项
a:判断条件语句无论简单还是复杂,结果是boolean类型
b:循环体语句如果是一条,可以省略大括号,但是不建议
c:有分号就没有左大括号,有左大括号就没有分号
while循环
基本格式
while(判断条件语句) {
循环体语句;
}
扩展格式:
初始化语句;
while(判断条件语句){
循环体语句;
控制条件语句;
}
通过查看这个格式,我们就知道while循环可以和for循环等价转换。
for和while的区别
for和while的区别
a:使用上的区别
for语句的那个控制条件变量,在循环结束后不能在使用了。
而while的可以继续使用。
b:理解上的区别
for适合于一个范围的判断
while适合次数不明确的
do...while循环
A:基本格式
do {
循环体语句;
}while(判断条件语句);
扩展格式:
初始化语句;
do {
循环体语句;
控制条件语句;
}while(判断条件语句);
通过查看格式,我们就可以看出其实三种循环的格式可以是统一的。
三种循环的区别
三种循环的区别
a:do...while循环至少执行一次循环体
b:for和while必须先判断条件是否是true,然后后才能决定是否执行循环体
循环使用的注意事项(死循环)
循环使用的注意事项(死循环)
A:一定要注意修改控制条件,否则容易出现死循环。
B:最简单的死循环格式
a:while(true){...}
b:for(;;){}
控制跳转语句(掌握)
(1)break:中断的意思
A:用在循环和switch语句中,离开此应用场景无意义。
B:作用
a:跳出单层循环
b:跳出多层循环,需要标签语句的配合
C:案例:
小芳存钱问题
(2)continue:继续
A:用在循环中,离开此应用场景无意义。
B:作用
a:跳出单层循环的一次,可以继续下一次
C:填空题
for(int x=1; x<=10; x++) {
if(x%3 == 0) {
//补齐代码
}
System.out.println("Java基础班");
}
如何让控制台输出2次:Java基础班 break;
如何让控制台输出7次:Java基础班 continue;
如何让控制台输出13次:Java基础班 System.out.println("Java基础班");
(3)return:返回
A:用于结束方法的,后面还会在继续讲解和使用。
B:一旦遇到return,程序就不会在继续往后执行。
方法(掌握)
概念
方法:就是完成特定功能的代码块。
格式
格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
方法体语句;
return 返回值;
}
修饰符:目前就用 public static。后面再详细讲解其他修饰符
返回值类型:就是功能结果的数据类型;
方法名:就是起了一个名字,方便我们调用该方法。
参数类型:就是参数的数据类型
参数名:就是变量
参数分类:
实参:实际参与运算的数据
形参:方法上定义的,用于接收实际参数的变量
多个用:逗号连接;
方法体语句:就是完成功能的代码块
return:结束方法
返回值:就是功能的结果,由return带给调用者,建议与定义的类型一致。
两个明确
返回值类型:结果的数据类型
参数列表:参数的个数及对应的数据类型
方法调用
方法调用
A:有明确返回值的方法
a:单独调用,没有意义
b:输出调用,不是很好,因为我可能需要不结果进行进一步的操作。但是讲课一般我就用了。
c:赋值调用,推荐方案
B:void类型修饰的方法
a:单独调用
C:参数类型建议传入和定义的一致(举例:int 与double)
案例
案例:
A:求和方案
B:获取两个数中的较大值
C:比较两个数据是否相同
D:获取三个数中的最大值
E:输出m行n列的星形
F:输出nn乘法表
方法的注意事项
方法的注意事项
A:方法不调用不执行
B:方法之间是平级关系,不能嵌套定义
C:方法定义的时候,参数是用,隔开的
D:方法在调用的时候,不用在传递数据类型
E:如果方法有明确的返回值类型,就必须有return语句返回(举例:两个数字是否相等)。
方法重载案例
在同一个类中,方法名相同,参数列表不同。与返回值无关。
参数列表不同:
参数的个数不同。
参数的对应的数据类型不同。
方法重载案例
不同的类型的多个同名方法的比较。
数组
概念
数组:存储同一种数据类型的多个元素的容器,元素类型一样。
特点
特点:每一个元素都有编号,从0开始,最大编号是长度-1。
编号的专业叫法:索引
定义格式
定义格式
A:数据类型[] 数组名;
B:数据类型 数组名[];
数组的初始化
数组的初始化
A:动态初始化
只给长度,系统给出默认值
举例:int[] arr = new int[3];
B:静态初始化
给出值,系统决定长度
举例:int[] arr = new int[]{1,2,3};
简化版:int[] arr = {1,2,3};
Java的内存分配
Java根据数据的使用场景,分了几个区
A:栈 存储局部变量
B:堆 存储所有new出来的
C:方法区(面向对象部分详细讲解)
D:本地方法区(系统相关)
E:寄存器(CPU使用)
注意:
a:局部变量 在方法定义中或者方法声明上定义的变量。
b:栈内存和堆内存的区别
栈:数据使用完毕,就消失。
堆:每一个new出来的东西都有地址
每一个变量都有默认值
byte,short,int,long 0
float,double 0.0
char '\u0000'
boolean false
引用类型 null
数据使用完毕后,在垃圾回收器空闲的时候回收。
数组内存图
A:一个数组
B:二个数组
C:三个数组(两个栈变量指向同一个堆内存)
数组的常见操作
A:遍历
方式1:
public static void printArray(int[] arr) {
for(int x=0; x max) {
max = arr[x];
}
}
return max;
}
最小值:
public static int getMin(int[] arr) {
int min = arr[0];
for(int x=1; x
面向对象
面向对象概述(理解)
概述
面向对象是基于面向过程的编程思想
面向对象的思想特点
面向对象的思想特点
A:是一种更符合我们思考习惯的思想
B:把复杂的事情简单化
C:让我们从执行者变成了指挥者
举例:
买电脑
洗衣服
做饭
...
万事万物皆对象
把大象装进冰箱(理解)
把大象装进冰箱(理解)
A:面向过程实现
B:面向对象实现
注意:如何让我们的操作更符合面向对象思想呢?
A:有哪些类(名词分析法)
B:每个类有哪些成员(属性)
C:类与类的关系
类与对象
类与对象
A:现实世界的事物
属性 事物的基本描述
行为 事物的功能
B:Java语言中最基本的单位是类。所以,我们要用类来体现事物
C:类
成员变量 事物属性
成员方法 事物行为
D:类:是一组相关的属性和行为的集合。是一个抽象的概念。
对象:是该类事物的具体存在,是一个具体的实例。(对象)
举例:
学生:类
班长:对象
汽车图纸:类
汽车:对象
面向对象的练习题(掌握)
(1)标准的手机类的定义和测试
(2)Demo类有求和方法,Test类进行测试。
什么时候定义成员变量?
当该变量是用来描述一个类的时候。
(3)长方形案例
(4)员工案例
(5)MyMath案例(自己提供加减乘除并测试)
类
类的定义转换(掌握)
类的定义
类的定义
成员变量 定义格式和以前一样,就是位置不同,在类中,方法外。
成员方法 定义格式和以前一样,就是去掉了static。
使用类的内容
使用类的内容
a:创建对象? 格式
类名 对象名 = new 类名();
b:如何使用成员变量和成员方法呢
对象名.成员变量
对象名.成员方法()
C:案例:
A:学生类的定义和使用
B:手机类的定义和使用
D:内存图
A:一个对象的内存图
B:二个对象的内存图
C:三个对象的内存图
E:Java程序的开发,设计和特征
A:开发:就是不断的创建对象,通过对象调用功能
B:设计:就是管理和维护对象间的关系
特征
a:封装
b:继承
c:多态
类的组成(掌握)
A:成员变量和局部变量的区别(理解)
(1)在类中的位置不同
成员变量:类中方法外
局部变量:方法定义中或者方法声明上(参数列表)
(2)在内存中的位置不同
成员变量:在堆中
局部变量:在栈中
(3)生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
(4)初始化值不同
成员变量:有默认值
局部变量:没有默认值,必须定义,赋值,然后才能使用
B:类作为形式参数(方法的参数列表)?(理解)
(1)如果你看到一个方法需要的参数是一个类名,就应该知道这里实际需要的是一个具体的对象。
类的使用
匿名对象(理解)
概述
没有名字的对象
应用场景
A:调用方法,仅仅只调用一次的时候。
b:可以作为实际参数传递。举例:showMessager(new Student());
封装(理解)
概述
隐藏实现细节,提供公共的访问方式(举例:封装打电话过程)
好处
好处:
A:隐藏实现细节,提供公共的访问方式
B:提高代码的复用性
C:提高代码的安全性
设计原则
把不想让外界知道的实现细节给隐藏起来,提供公共的访问方式,
private是封装的一种体现。
封装:类,方法,private修饰成员变量
private关键字(掌握)
概述
私有的意义,可以修饰成员变量和成员方法
特点
被private修饰的后的成员(成员变量和方法)只能在本类中被访问;
private的应用
以后再写一个类的时候:
把所有的成员变量给private了
提供对应的getXxx()/setXxx()方法
this关键字(掌握)
概述
代表当前类的引用对象
this的应用场景
解决了局部变量隐藏成员变量的问题
注意事项
哪个对象调用方法,该方法内部的this就代表那个对象
(举例:showThis()打印this与new 出来的对象应用进行打印比较 发现一致)
构造方法(掌握)
概述
用于对对象的数据进行初始化
格式
格式:
A:方法名和类名相同
B:没有返回值类型,连void都不能有
C:没有返回值
举例:publie Student(){}
思考题:构造方法中可不可以有return语句呢?
可以。而是我们写成这个样子就OK了:return;
其实,在任何的void类型的方法的最后你都可以写上:return 这样写 没意义;
构造方法的注意事项
构造方法的注意事项
A:如果我们没写构造方法,系统将提供一个默认的无参构造方法
B:如果我们给出了构造方法,系统将不再提供默认构造方法
如果这个时候,我们要使用无参构造方法,就必须自己给出。
推荐:永远手动自己给出无参构造方法。
给成员变量赋值的方式
给成员变量赋值的方式
A:setXxx()
B:带参构造方法
标准案例
标准案例
class Student {
private String name;
private int age;
public Student(){}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试:
class StudentDemo {
public static void main(String[] args) {
//方式1
Student s1 = new Student();
s1.setName("刘刚");
s1.setAge(27);
System.out.println(s1.getName()+"---"+s1.getAge());
//方式2
Student s2 = new Student("老沙",30);
System.out.println(s2.getName()+"---"+s2.getAge());
}
}
2:代码:Student student = new Student();做了哪些事情?(理解)
(1)把Student.class文件加载到内存
(2)在栈内存为student 开辟空间
(3)在堆内存为学生对象申请空间
(4)给学生的成员变量进行默认初始化。
(5)给学生的成员变量进行显示初始化。
(6)通过构造方法给成员变量进行初始化。
(7)对象构造完毕,把地址赋值给student 变量
通过JDK提供的API学习了Math类(掌握)
(1)API(Application Programming Interface)
应用程序编程接口(帮助文档)
(2)如何使用呢?
请参照ppt(32页)
(3)Math类
A:是针对数学进行操作的类
B:没有构造方法,因为它的成员都是静态的
C:产生随机数
public static double random(): [0.0,1.0)
D:如何产生一个1-100之间的随机数
int number = (int)(Math.random()*100)+1;
E:猜数字小游戏
如何制作帮助文档(了解)
(1)写一个类
(2)加入文档注释
(3)通过javadoc工具生成即可
javadoc -d 目录 -author -version ArrayTool.java
代码块(理解)
(1)用{}括起来的代码。
(2)分类:
A:局部代码块
用于限定变量的生命周期,及早释放,提高内存利用率。
B:构造代码块
把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。
C:静态代码块
对类的数据进行初始化,仅仅只执行一次。
(3)静态代码块,构造代码块,构造方法的顺序问题?
静态代码块 > 构造代码块 > 构造方法
继承(掌握)
概述
把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,
这多个类就具备了这些内容。这个关系叫继承。
Java中如何表示继承呢?格式是什么
Java中如何表示继承呢?格式是什么呢?
A:用关键字extends表示
B:格式:
class 子类名 extends 父类名 {}
继承的好处
继承的好处:
A:提高了代码的复用性
B:提高了代码的维护性
C:让类与类产生了一个关系,是多态的前提
继承的弊端
A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。
原则:低耦合,高内聚。
耦合:类与类的关系
内聚:自己完成某件事情的能力
B:打破了封装性
Java中继承的特点
Java中继承的特点
A:Java中类只支持单继承
B:Java中可以多层(重)继承(继承体系)
继承的注意事项
继承的注意事项:
A:子类不能继承父类的私有成员
B:子类不能继承父类的构造方法,但是可以通过super去访问
C:不要为了部分功能而去继承
什么时候使用继承
A:继承体现的是:is a的关系。
B:采用假设法
Java继承中的成员关系
成员变量
A:成员变量
a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
子类的方法访问变量的查找顺序:
在子类方法的局部范围找,有就使用。
在子类的成员范围找,有就使用。
在父类的成员范围找,有就使用。
找不到,就报错。
构造方法
B:构造方法
a:子类的构造方法默认会去访问父类的无参构造方法
是为了子类访问父类数据的初始化
b:父类中如果没有无参构造方法,怎么办?
子类通过super去明确调用带参构造
子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
让父类提供无参构造
成员方法
成员方法
a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
通过子类对象访问一个方法的查找顺序:
在子类中找,有就使用
在父类中找,有就使用
找不到,就报错
两个面试题
A:Override和Overload的区别?Overload是否可以改变返回值类型?
B:this和super的区别和各自的1作用?
1.方法重写:
在子类中,出现和父类中一模一样的方法声明的现象。
方法重载:
同一个类中,出现的方法名相同,参数列表不同的现象。
2. 方法重载能改变返回值类型,因为它和返回值类型无关。
3.this:代表当前类的对象引用
super:代表父类存储空间的标识。(可以理解为父类的引用,通过这个东西可以访问父类的成员)
数据初始化的面试题
A:一个类的初始化过程
B:子父类的构造执行过程
C:分层初始化
案例
A:学生和老师案例
继承前
继承后
B:猫狗案例的分析和实现
多态(掌握)
概述
同一个对象在不同时刻体现出来的不同状态。(举例:水的状态)
多态的前提
A:有继承或者实现关系。
B:有方法重写。
C:有父类或者父接口引用指向子类对象。(举例:动物 d=new Cat())
多态的分类:
a:具体类多态
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
b:抽象类多态
abstract class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
c:接口多态
interface Fu {}
class Zi implements Fu {}
Fu f = new Zi();
多态中的成员访问特点
A:成员变量
编译看左边,运行看左边
B:构造方法
子类的构造都会默认访问父类构造
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边
好处和弊端
好处
多态的好处:
A:提高代码的维护性(继承体现)
B:提高代码的扩展性(多态体现)
弊端
多态的弊端:
父不能使用子的特有功能。
多态中的转型
A:向上转型(Fu f = new Zi())
从子到父,父类引用指向子类对象
B:向下转型
从父到子,父类引用转子类引用
案例
孔子装爹的案例帮助大家理解多态
多态的练习
A:猫狗案例
B:老师和学生案例
抽象类(掌握)
概述
把多个共性的东西提取到一个类中,这是继承的做法。
抽象类的特点
抽象类的特点
A:抽象类和抽象方法必须用关键字abstract修饰
B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
C:抽象类不能实例化
D:抽象类的子类
a:是一个抽象类。
b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
抽象类的成员特点
抽象类的成员特点:
A:成员变量
有变量,有常量
B:构造方法
有构造方法
C:成员方法
有抽象,有非抽象
抽象类的练习
抽象类的练习
A:猫狗案例练习
B:老师案例练习
C:学生案例练习
D:员工案例练习
抽象类的几个小问题
抽象类的几个小问题
A:抽象类有构造方法,不能实例化,那么构造方法有什么用?
用于子类访问父类数据的初始化
B:一个类如果没有抽象方法,却定义为了抽象类,有什么用?
为了不让创建对象
C:abstract不能和哪些关键字共存
a:final 冲突
b:private 冲突
c:static 无意义
接口(掌握)
概述
比如:猫钻火圈,狗跳高等功能,不是动物本身就具备的,
是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。
接口的特点
接口的特点:
A:接口用关键字interface修饰
interface 接口名 {}
B:类实现接口用implements修饰
class 类名 implements 接口名 {}
C:接口不能实例化
D:接口的实现类
a:是一个抽象类。
b:是一个具体类,这个类必须重写接口中的所有抽象方法。
接口的成员特点
接口的成员特点:
A:成员变量
只能是常量
默认修饰符:public static final
B:构造方法
没有构造方法
C:成员方法
只能是抽象的
默认修饰符:public abstract
类与类,类与接口,接口与接口
类与类,类与接口,接口与接口
A:类与类
继承关系,只能单继承,可以多层继承
B:类与接口
实现关系,可以单实现,也可以多实现。
还可以在继承一个类的同时,实现多个接口
C:接口与接口
继承关系,可以单继承,也可以多继承
抽象类和接口的区别
抽象类和接口的区别
A:成员区别
抽象类 变量,常量;抽象方法,非抽象方法
接口 常量;抽象方法
B:关系区别:
类与类 继承,单继承
类与接口 实现,单实现,多实现
接口 继承,单继承,多继承
C:设计理念不同
抽象类:is a,抽象类中定义的是共性功能。
接口:like a,接口中定义的是扩展功能。
练习
练习:
A:猫狗案例,加入跳高功能
形式参数和返回值的问题(理解)
形式参数
形式参数:
类名:需要该类的对象
抽象类名:需要该类的子类对象
接口名:需要该接口的实现类对象
返回值类型
返回值类型:
类名:返回的是该类的对象
抽象类名:返回的是该类的子类对象
接口名:返回的是该接口的实现类的对象
链式编程
链式编程
对象.方法1().方法2().......方法n();
这种用法:其实在方法1()调用完毕后,应该一个对象;
方法2()调用完毕后,应该返回一个对象。
方法n()调用完毕后,可能是对象,也可以不是对象。
包(理解)
定义
其实就是文件夹
包的定义(掌握)
package 包名;
多级包用.分开。
作用
作用:
A:区分同名的类
B:对类进行分类管理
a:按照功能分
b:按照模块分
注意事项
(4)注意事项:(掌握)
A:package语句必须在文件中的第一条有效语句
B:在一个java文件中,只能有一个package
C:如果没有package,默认就是无包名
导包
(1)我们多次使用一个带包的类,非常的麻烦,这个时候,Java就提供了一个关键字import。
(2)格式:
import 包名...类名;
另一种:
import 包名...*;(不建议)
(3)package,import,class的顺序
package > import > class
常见的修饰符(理解)
分类
分类:
权限修饰符:private,默认,protected,public
状态修饰符:static,final
抽象修饰符:abstract
常见的类及其组成的修饰
常见的类及其组成的修饰
类:
默认,public,final,abstract
常用的:public
成员变量:
private,默认,protected,public,static,final
常用的:private
构造方法:
private,默认,protected,public
常用的:public
成员方法:
private,默认,protected,public,static,final,abstract
常用的:public
另外比较常见的
另外比较常见的:
public static final int X = 10;
public static void show() {}
public final void show() {}
public abstract void show();
内部类(理解)
概述
把类定义在另一个类的内部,
该类就被称为内部类。
举例:把类B定义在类A中,
类B就被称为内部类。
public class A{
private int num=10;
private int static num1 = 20;
public void p1(){
/*
外部类不能直接访问内部类的成员
包括变量和方法
*/
p();//这是直接访问内部类B的p()方法是错误的
/*
外部类要访问内部类的方法必须创建一个对象
*/
new B().p();//这是正确的
}
class B{
private int num=20;
public void p(){
/*
内部类可以访问外部类的成员
包括方法和变量
*/
num = 20;
p1();
/*
如果内部类是非静态的只能访问
外部类非静态成员
*/
num1 = 200;
//----------------------end
int num = 30;
//需求是打印30,20,10
/*
这个num是就近原则打印后是30
*/
System.out.println(num);//30
/*
20是B的成员变量,因此访问成员变量
必须加this
*/
System.out.println(this.num);//20
/*
想要打印10,这个10是A类的成员变量
this这种只能访问谁调用的this就是谁
this一定是当前类
外部类.this这个意思是外部类的this,加了一个定语
我们以前讲过,通过类名访问一定是静态的
但是这个this不是静态的(这是个特例)
*/
System.out.println(A.this.num);//10
}
}
static class B1{
public void p(){
}
}
private class B2{
public void p(){
}
}
/*当外面想访问B2的时候
我们是通过外部内定义一个方法
来访问B2,那么外面就可以通过外部类
调用这个方法访问B2了,
这个叫间接访问内部类
*/
public void b2Method(){
new B2().p();
}
public void method(){
int a = 10;//错误的,必须是常量
final int a = 10;//正确的
class C{
public void p(){
num = 20;
/*
局部内部类访问局部变量
这个变量只能是常量
为什么?
局部变量在栈里面,方法结束后
就立即释放了,但是局部内部类是在堆里面
方法结束后不会马上释放,等待JVM回收
那么这个时候对象无法访问a这个变量,因此需要将
局部变量定义为常量
*/
a = 20;
}
}
class C1{
}
class C2{
}
/*
局部内部类可以访问外部类的成员
局部内部类的生命周期是方法结束后就
等待被
JVM回收
外面是不能直接用局部内部类的
*/
C c = new C();
}
}
public class ADemo{
public static void main(String []args){
A.B b = new A().new B();
A.B1 b1 = new A.B1();
A a = new A();
a.b2Method();
}
}
内部类的访问规则
内部类的访问规则
A:可以直接访问外部类的成员,包括私有
B:外部类要想访问内部类成员,必须创建对象
内部类的分类
内部类的分类
A:成员内部类
B:局部内部类
成员内部类
成员内部类
A:private 为了数据的安全性
B:static 为了访问的方便性
成员内部类不是静态的:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
成员内部类的面试题(填空)
30,20,10
class Outer{
public int num = 10;
class Inner{
public int num = 20;
public viod show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
局部内部类
局部内部类
A:局部内部类访问局部变量必须加final修饰。
B:为什么呢?
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而改变量已经没有了。
为了让该值还存在,就加final修饰。
通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
匿名内部类(掌握)
匿名内部类(掌握)
A:是局部内部类的简化形式
B:前提
存在一个类或者接口
C:格式:
new 类名或者接口名() {
重写方法;
}
D:本质:
其实是继承该类或者实现接口的子类匿名对象
)
匿名内部类在开发中的使用
匿名内部类在开发中的使用
我们在开发的时候,会看到抽象类,或者接口作为参数。
而这个时候,我们知道实际需要的是一个子类对象。
如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。
interface Person {
public abstract void study();
}
class PersonDemo {
public void method(Person p) {
p.study();
}
}
class PersonTest {
public static void main(String[] args) {
PersonDemo pd = new PersonDemo();
pd.method(new Person() {
public void study() {
System.out.println("好好学习,天天向上");
}
});
pd.method(
/*
method是要接收一个实现了Person接口的对象
new Person(){
}这个整体是一个对象
Person{
public void study() {
System.out.println("好好学习,天天向上");
}
}这是在定义一个类,是没有名字的类
相当于省略了class 没有名字的类 implements
等同于
class 没有名字的类 implements Person{
public void study() {
System.out.println("好好学习,天天向上");
}
}
new Person(){
public void study() {
System.out.println("好好学习,天天向上");
}
}
等同于
new class 没有名字的类 implements Person{
public void study() {
System.out.println("好好学习,天天向上");
}
}()
*/
new Person() {
public void study() {
System.out.println("好好学习,天天向上");
}
}
//定义一个类并且实例化
);
}
}
匿名内部类的面试题(补齐代码)
匿名内部类的面试题(补齐代码)
interface Inter {
void show();
}
class Outer {
//补齐代码
public static Inter method() {
return new Inter() {
public void show() {
System.out.println("HelloWorld");
}
};
}
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show(); //"HelloWorld"
}
}
关键字
final关键字(掌握)
(1)是最终的意思,可以修饰类,方法,变量。
(2)特点:
A:它修饰的类,不能被继承。
B:它修饰的方法,不能被重写。
C:它修饰的变量,是一个常量,只能赋值一次。
(3)面试相关:
A:局部变量
a:基本类型 值不能发生改变
b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的
B:初始化时机
a:只能初始化一次。
b:常见的给值
定义的时候。(静态推荐)
构造方法中。
static关键字(理解)
概述
可以修饰成员变量和成员方法。
静态的特点
静态的特点:
A:随着类的加载而加载
B:优先与对象存在
C:被类的所有对象共享
这其实也是我们判断该不该使用静态的依据。
静态的内存图
静态的内存图
静态的内容在方法区的静态区
静态的注意事项
静态的注意事项;
A:在静态方法中没有this对象;
B:静态只能访问静态(代码测试过)
静态变量和成员变量的区别
静态变量和成员变量的区别
A:所属不同
静态变量:属于类,类变量
成员变量:属于对象,对象变量,实例变量
B:内存位置不同
静态变量:方法区的静态区
成员变量:堆内存
C:生命周期不同
静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
D:调用不同
静态变量:可以通过对象名调用,也可以通过类名调用
成员变量:只能通过对象名调用
main方法是静态的
main方法是静态的
public:权限最大
static:不用创建对象调用
void:返回值给jvm没有意义
main:就是一个常见的名称。
String[] args:可以接收数据,提供程序的灵活性
格式:java MainDemo hello world java
java MainDemo 1 2 3 4
IO流
概述
IO用于在设备间进行数据传输的操作
分类
分类:
A:流向
输入流 读取数据
输出流 写出数据
B:数据类型(补齐总结)
字节流
字节输入流
字节输出流
字符流
字符输入流
字符输出流
注意:
a:如果我们没有明确说明按照什么分,默认按照数据类型分。
b:除非文件用windows自带的记事本打开我们能够读懂,
才采用字符流,否则建议使用字节流。
异常(理解)
概述
程序出现的不正常的情况。
异常的体系
异常的体系
Throwable
|--Error 严重问题,我们不处理。
|--Exception
|--RuntimeException 运行期异常,我们需要修正代码
|--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过
异常的处理
A:JVM的默认处理
把异常的名称,原因,位置等信息输出在控制台,但是呢程序不能继续执行了。
B:自己处理
a:try...catch...finally
自己编写处理代码,后面的程序可以继续执行
b:throws
把自己处理不了的,在方法上声明,告诉调用者,这里有问题
面试题
A:编译期异常和运行期异常的区别?
编译期异常 必须要处理的,否则编译不通过
运行期异常 可以不处理,也可以处理
B:throw和throws是的区别
throw:
在方法体中,后面跟的是异常对象名,并且只能是一个
throw抛出的是一个异常对象,说明这里肯定有一个异常产生了
throws:
在方法声明上,后面跟的是异常的类名,可以是多个
throws是声明方法有异常,是一种可能性,这个异常并不一定会产生
finally关键字及其面试题
A:finally用于释放资源,它的代码永远会执行。特殊情况:在执行到finally之前jvm退出了
B:面试题
a:final,finally,finalize的区别?
b:如果在catch里面有return,请问finally还执行吗?如果执行,在return前还是后
会,前。
实际上在中间。这个上课我们讲过
C:异常处理的变形
try...catch...finally
try...catch...
try...catch...catch...
try...catch...catch...fianlly
try...finally
自定义异常
自定义异常
继承自Exception或者RuntimeException,只需要提供无参构造和一个带参构造即可
异常的注意实现
异常的注意实现
A:父的方法有异常抛出,子的重写方法在抛出异常的时候必须要小于等于父的异常
B:父的方法没有异常抛出,子的重写方法不能有异常抛出
C:父的方法抛出多个异常,子的重写方法必须比父少或者小
递归(理解)
概述
方法定义中调用方法本身的现象
public void show(){
show();
}
递归的注意事项
递归的注意事项;
A:要有出口,否则就是死递归
B:次数不能过多,否则内存溢出
C:构造方法不能递归使用
递归的案例
递归的案例:
A:递归求阶乘
B:兔子问题
C:递归输出指定目录下所有指定后缀名的文件绝对路径
D:递归删除带内容的目录(小心使用)
File(掌握)
概述
IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件
构造方法
构造方法
A:File file = new File("e:\\a.txt");
B:File file = new File("e:\\","a.txt");
C:File file = new File("e:\\");
File file2 = new File(file,"a.txt");
File类的功能
A:创建功能
public boolean createNewFile()创建单个文件
public boolean mkdir()创建单个文件夹
public boolean mkdirs()创建多级文件夹
B:删除功能public boolean delete()
C:重命名功能public boolean renameTo(File dest)
D:判断功能public boolean isDirectory()是否是文件夹
public boolean isFile()是否是文件
public boolean exists()是否存在文件和文件夹
public boolean canRead()是否文件和文件夹可读
public boolean canWrite()是否文件可写
public boolean isHidden()是否文件和文件夹隐藏
E:获取功能public String getAbsolutePath()获取绝对路径(详细的路径从最外层开始到获取处)
public String getPath()获取路径
public String getName()获取文件名
public long length()获取文件的大小
public long lastModified()获取最后的修改时间
F:高级获取功能
public String [] list()
public File[] listFiles()
G:过滤器功能
public String[]list(FilenameFilter Filter)
public File[] listFiles(FilenameFilter filter)
案例
案例:
A:输出指定目录下指定后缀名的文件名称
a:先获取所有的,在遍历的时候判断,再输出
b:先判断,再获取,最后直接遍历输出即可
B:批量修改文件名称
字节流
概述
字节流的抽象基类:
InputStream ,OutputStream。
字节输入流
构造方法
FileInputStream(File file)
FileInputStream(String name)
成员方法
使用read方法读取
public int read()//从此输入流中读取一个数据字节
注意:如果文件读取完毕返回 -1。
public int read(byte[] b)//将文件数据读取到byte[]中,对多一次读取数组长度的数据
注意: 返回值是读取到的实际长度,如果没有读取到数据返回-1
字节输出流
FileOutputStream
构造方法
public FileOutputStream(String name, boolean append)//
向指定 的文件中写入数据,如果第二个参数为 true,则将字节写入文件末尾处
FileOutputStream(File file, boolean append)
向指定 的文件中写入数据,如果第二个参数为 true,则将字节写入文件末尾处
成员方法
public void write(int b)//将指定字节写入此文件输出流
public void write(byte[] b)//将指定 byte 数组写入此文件输出流中
public void write(byte[] b,int off,int len)//将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
字符流
概述
字符流的抽象基类:
Reader , Writer
字符输入流
InputStreamReader
构造方法
public InputStreamReader(InputStream in)
public InputStreamReader(InputStream in,String charsetName)
成员方法
public int read()//从此输入流中读取一个数据字符
public int read(char[] cbuf)//将文件数据读取到char[]中,对多一次读取数组长度的数据
字符输出流
OutputStreamWriter
构造方法
public OutputStreamWriter(OutputStream out)
public OutputStreamWriter(OutputStream out,String charsetName)
成员方法
public void write(int c)//将指定字符写入此文件输出流
public void write(char[] cbuf)//将指定char数组写入此文件输出流中
public void write(char[] cbuf,int off,int len)//将指定 char数组中从偏移量 off 开始的 len 个字符写入此文件输出流
缓冲流
字节缓冲输出流
BufferedOutputStream
字节缓冲输入流
BufferedInputStream
0 条评论
下一页
图形选择
思维导图
主题
补充说明
AI生成
提示
关闭后当前内容将不会保存,是否继续?
取消
确定