1.请简述一下break,continue,return之间的区别
break:停止所在层的循环,以及停止选择语句的当前分支
continue:停止当前的本次循环,循环从下一次继续开始
return:停止所在的方法,返回调用该方法语句处,程序继续向下执行
2.数组: 将一组相同数据结构的数据进行统一存储 对外作为整体存储
一维数组:
创建方式
1)动态数组---new 类型[长度(元素个数)]
2)静态数组---类型[] 数组名 = {}
一旦创建成功,长度不能改变 不能是混合型数据
数组在存储或者获取数据时使用索引进行处理 从0开始 到长度-1结束 byte short int char
作用:存储、操纵、管理
二维数组 :
创建方式
1)动态数组---new 类型[二维数组的长度][数组中每个元素的长度]
2)静态数组---类型[][] 数组名 = {{},{},{},......}
如果使用动态方式进行创建,第一个长度不能省略,第二个长度值可以省略,表示每个元素的长度不是统一的,后期可以通过代码进行单独的指定
如果使用动态方式进行创建,第一个和第二个长度同时指定,那么每个元素的长度是固定的,无论是一维数组还是二维数组,无论动态数组还是静态数组,只要数组创建成功,长度都不能改变
遍历数组:
1)for循环
2)for-each循环 前提:JDK在1.5以上才能使用
注意:只能对数组进行遍历 不能进行赋值,因为该循环中没有索引存在,无法指定位置
该循环表示提取数组中的每个元素值
3.方法
声明:方法头([访问修饰符] 返回值类型 方法名 [参数列表] [异常列表] )
private default protected public
参数列表是进入该方法的输入接口
调用方法时传递的实参与定义的形参必须在数量、顺序、类型上保持一致
实现:方法体
值传递:是指在方法调用时,传递的参数是按照值的拷贝进行传递的 传递前后互补影响
引用传递:是指在方法调用时,传递的参数是引用地址,传递后操作的是同一个地址中的数据,传递前后有影响
public class Test{
public static void main(String[] args){
//请将你的代码写在此处----调用aa方法
Test t = new Test();
t.aa(3,1.2);
}
public void aa(int a,double b){
sout("123");
}
}
4.面向对象的程序设计:OOP
面向对象 = 对象+消息传递
面向过程 = 算法+数据结构
面向对象的好处:重用性 可靠性 灵活性 扩展性
面向对象的基本特征:
封装 :数据模块化 有选择的数据隐藏 防止意外对数据的破坏 易于数据的隔离和修复
继承 :通过已有类创建新的类的机制,新的类称为子类。子类中含有父类中公共的属性和方法
多态 :对象根据接收的消息做出的动作。同一个消息被不同的对象进行接收,产生不同的行为,称为多态
方法的重载
在同一个类中使用相同的方法名定义多个不同的方法的机制。
参数列表必须不同:
1)类型不同
2)数量不同
3)顺序不同(不推荐,与第一种本质上是一个)
方法的重写
子类对父类同名方法的覆盖 (重新定义)
注意事项:重写的方法与被覆盖的方法的返回值类型、方法名、参数列表必须保持一致
访问修饰符:要与被覆盖的方法完全一致或者只能更宽松,不能更严格
private < default < protected < public
5.面向对象中最小的单位是:类
类和对象----类是事物的描述 对象是事物的具体
类是构建对象的模板 对象是类的具体实例
6.类名 对象名 = new 类名(); 通过new调用方法,返回对象在堆内存中开辟的空间地址,赋值给对象
基本数据类型
byte short int long boolean float double char
引用数据类型
String 自定义类 集合 接口
String a = null; //空 在内存中没有开辟地址,对象不存在
String b = ""; //已经占用了内存,对象存在,但是没有具体值
sout(a.length()); //报错:java.lang.NullPointException空指针异常
sout(b.length()); //0
判断题:数组具有长度的方法,可以获取数组的长度值,即元素的个数(X) 数组具有长度的属性
7.数据成员(类中的成员变量)
1)声明数据成员必须指定所属类型和变量名
2)变量名必须是唯一的
3)类型可以是Java中的任意类型数据
方法成员:表示一个对象能做的事情,通过对象调用该方法获取某些信息值
可以有,可以有一个或多个,也可以没有
8.如果成员变量进行了私有化处理(封装),就要提供对应的公有的get+set方法
public class Student{
private int age;
public int getAge(){ //get获取
//如果方法设置了返回值类型,必须要有该类型的值的返回
return age;
}
public void setAge(int age){ //set设置
this.age = age; //当全局变量与局部变量重名时,使用this进行区分,this表示当前对象
}
}
对象名.setAge(12);
Student stu = new Student(); //通过Student类的构造方法创建对象stu,并对对象的属性进行初始化操作
sout(stu.getAge()); //对象的age属性值是:0
stu.setAge(15); //修改属性值
sout(stu.getAge()); //15
9.构造方法(构造器 构造子 构造函数) 非传统意义上的方法
每个类中都有一个构造方法,系统会默认提供一个无参的构造方法
语法结构:[访问修饰符] 类名([参数列表]){}
方法的实现
构造方法的名字必须与类名完全一致
没有返回值 不能使用void
不能被static、final进行修饰
不能直接调用,只能通过new关键字自动引起构造方法的调用,进行实例化对象
构造方法的作用:创建对象并进行初始化操作
构造方法不能被继承
构造方法可以被重载
同一个类中的多个构造方法之间可以进行调用,需要使用this([参数列表])语句,但是该语句必须写在调用的构造方法的第一行
构造方法虽然不能被继承 但是子类可以调用父类的构造方法,使用super([参数列表])语句,但是该语句必须写在子类构造方法的第一行
如果父类中存在无参构造方法,子类构造方法中的super()语句可以省略不写,默认调用父类的无参构造方法
如果父类中不存在无参构造方法,那么子类的构造方法中,super(参数列表)必须进行显示的调用
注意:同一个构造方法中不能同时使用this()语句和super()语句 因为他们的约束条件冲突了
final:
修饰变量--->常量,值不能被修改。在声明时必须进行初始化操作(赋值),以便后期进行直接使用
修饰方法--->终结方法,不能被重写
修饰类--->终结类,不能被继承
10.对象和对象数组作为方法的参数进行传递
public void check(Student stu){
//通过形参stu获取当前学生的信息
}
public void check(Student[] stus){
//遍历数组,依次提取每个学生对象,获取当前学生的信息
}
11.static
静态变量(类变量)----调用语法:类名.变量名,对类中所有对象均有效
静态方法(类方法)----调用语法:类名.方法名,对类中所有对象均有效
非static修饰的变量和方法
实例变量---调用语法:对象名.变量名,仅对当前对象有效
实例方法---调用语法:对象名.方法名,仅对当前对象有效
注意:实例方法中可以调用实例方法/静态方法,可以使用实例变量/静态变量
静态方法中只能使用静态变量和调用静态方法 !!!!!!
单例模式(1.懒汉式 2.饿汉式)
12.继承 extends
通过已有的类创建新的类
父类---->子类 子类是父类的一种 has a
Java只支持单继承 一个子类只能有一个直接的父类
继承的规则
private---->子类不能继承
default---->同包可继承,不同包不可继承
protected---->任何情况都可以继承
public---->任何情况都可以继承
子类对父类同名方法的覆盖----子类对父类中相同的属性进行重新的定义
子类中含有两个同名的属性(1.父类中 2.自己重新定义的)
调用父类被覆盖的属性-----super.属性名 super表示父类对象的引用 this表示当前自身的引用
子类可以对父类中同名方法进行定义(同名方法的覆盖----方法的重写)
抽象方法必须被重写 如果子类不重写父类中的抽象方法,则子类必须是抽象类
static和final修饰的方法不能被重写
instanceof----判断对象是否属于一个特定的类 返回boolean类型
子类和父类之间的转换
对象上转型:子类转成父类类型,允许的 使用的属性是父类的 调用的方法是子类的
对象下转型:父类转成子类类型,错误的 在编写时虽然通过强制转换可以不报错,但是运行时显示类转换异常
里氏代换原则
父类出现的地方,子类一定可以出现 父类对象作为方法参数,任何子类对象都可以传递
子类出现的地方,父类不一定出现
13.组合 在一个类中,含有另外一个类的对象 我中有你 has a
public class A{
int age;
}
public class B{
String sex;
A a; //a.age
}
合成聚合复用原则
在继承和组合都能实现代码复用的前提下,优先选择组合关系,尽量少使用继承关系
因为组合关系的耦合度比较低
14.接口 interface like a 抽象类(abstract)
目的:设计和实现相分离
1个类可以实现多个接口
1个接口可以被多个类实现
接口不能使用new关键字创建对象,不能实例化 需要new它的实现类
接口中的成员数据都是公有的静态的常量,在定义时必须进行初始化赋值的操作
接口中的成员方法都是公有的抽象方法,没有方法体(在JDK1.8版本以后,接口中提供了static方法和default方法,可以有方法体)
抽象类也能进行实例化,不能new对象,需要new它的子类
抽象类中可以有常规元素(普通变量和普通方法),也可以没有抽象方法
接口的抽象层次比抽象类要更高一些
接口在设计时,尽量满足接口隔离原则
使用专门的接口要比统一的接口更为合理
Collection 集合的父接口
对上述的父接口进行细化细分
List extends Collection 扩展一些与索引相关的操作 ArrayList实现类
Set extends Collection 几乎都是与父类一致的操作 HashSet实现类
15.异常 Exception--->Throwable--->Object
分类:
运行时异常 :在编码时,系统编译器不进行实时检查,只有在运行时可能会出现错误,并显示错误的信息
检查型异常 :在编码时,系统编译器需要进行实时检查,如果有异常,必须要对异常进行处理,否则编译不通过
处理异常的方式:
捕获异常:try catch finally try-finally try-catch try-catch-finally
抛出异常:throw(实现) throws(声明)
实现的异常可以是Throwable或者其他子类对象
一个try可以同时匹配多个catch语句 但是catch需要注意先后顺序,先子类后父类
try-catch可以进行嵌套使用
try与一个catch语句进行搭配,但是处理了多个异常,那么在catch语句中可以使用逻辑或运算符描述
(异常1 | 异常2 | 异常3 | ...... e)
显示异常信息的方式
getMessage():显示异常错误的信息
toString():显示异常错误的类型以及错误的信息
printStackTrace():打印异常在堆栈中的轨迹信息,追溯异常的位置
finally是进行资源释放的
无论代码是否正确,finally都要被执行,如果try-catch语句中存在return 先执行finally再进行return返回操作
唯一不执行finally的情况:使用了System.exit(0)
自定义异常:
自定义的异常类需要继承Exception/子类
重写方法:
toString(){} //无需做更改,就是通过该方法获取当前类的类型以及自定义的信息提示
getMessage(){} //自定义异常信息的提示
16-1.Object
equals()方法:比较对象的地址,判断对象是否是同一个
String
equals()方法:比较内容是否是相同的
String str1 = "123";
String str2 = "123";
soutv(str1 == str2); //数据是存储在常量池中的 str1与str2指向同一个数据 true
String str1 = new String("123");
String str2 = new String("123");
soutv(str1.equals(str2)); //虽然String的父类是Object,但是对父类的equals方法进行了重写,比较的是内容 true
Student stu1 = new Student("李四",23);
Student stu2 = new Student("李四",23);
soutv(stu1 == stu2); //比较的是对象的地址 堆内存中开辟的空间不同 地址不同 false
soutv(stu1.equals(stu2)); //Student的父类是Object,使用的方法是从父类继承来的,依旧是判断对象的地址 false
//如果Student也想内容一致返回true 需要对继承的equals方法进行重写操作
16-2.Date 获取系统时间
new Date(); 一般得到的是CST格式 或者 GMT东八区时间
如果想重新设置时间的格式,需要使用DateFormat对象进行相关处理
但是DateFormat是抽象类,需要new子类SimpleDateFormat(pattern).format(系统时间--Date对象)最终返回String值
如果需要将某个String--->"1999-12-12"转成Date类型的时间
SimpleDateFormat.getDateInstance(); //获取可以处理成日期的父类对象
SimpleDateFormat.getTimeInstance(); //获取可以处理成时间的父类对象
SimpleDateFormat.getDateTimeInstance(); //获取可以处理成日期和时间的父类对象
Date date = SimpleDateFormat.getDateInstance().parse("1999-12-12");
17.集合
都可以存储一组相同类型的数据,多外作为整体存在
数组不是面向对象的,没有封装、继承、多态类的特性,在开发时效率相对较低
数组的数据结构比较单一,采用顺序表方式 数组的长度是固定的 数组的实际存储元素个数无法直接获取
集合是以类的形式存在的,具有封装、继承、多态类的特性,使用简单的方法、属性就可以实现比较复杂的操作,提高开发的效率
结构(顺序表、链表、哈希表、树) 特征(是否有序 是否唯一)
集合可以动态改变容量,集合可以直接获取实际存储元素个数,不关系容量的大小
数组可以存储基本数据类型+引用数据类型
但是集合只能存储引用数据类型
Collection-----不唯一,无序
List----不唯一,有序
ArrayList---顺序表 优点:遍历元素和通过索引随机访问效率高
LinkedList---链表 优点:插入、删除操作时效率高
Vector和ArrayList的比较
原理相同 功能相同 可以互用
Vector以前的产物 ArrayList新的产物
Vector线程安全的 ArrayList线程非安全的
Vector默认增长为原来的一倍 ArrayList默认增长原来的一般50%
Set----唯一,无序
HashSet---采用哈希表结构
优点:添加、删除、查询、变更速度都快
TreeSet---采用二叉树结构 按照自然顺序进行排列
优点:按照内容,查询速度比List快
LinkedHashSet---采用哈希表结构,同时使用链表维护次序
有顺序(添加顺序)
equals方法和hashCode方法
Map<K,V>----可以存储映射关系的集合
KEY具有唯一性,如果重复,值覆盖 KEY没有顺序 ------ 类似于Set集合
VALUE可以重复(不唯一),没有顺序 --------- 类似于Collection
HashMap
TreeMap
LinkedHashMap
因为与Set集合很像,发现HashSet底层在进行数据存储时,就是在使用HashMap做处理
HashMap和Hashtable的比较
原理相同 功能相同 可以互用
Hashtable以前的产物 HashMap新的产物
Hashtable继承Dictionary(过时了,开发中不再使用) HashMap实现了Map接口
Hashtable是线程安全的 HashMap非安全的
Hashtable不允许有null值 HashMap允许有null值
18. IO输入输出流
下面四个类都是抽象类 不能直接new
面向字符的流
Reader---输入------>FileReader(节点流)---->new BufferedReader(节点流),提高执行的效率
Writer---输出------>FileWriter(节点流)---->new BufferedWriter(节点流),提高执行的效率
面向字节的流
InputStream------输入------>FileInputStream(节点流)---->new BufferedInputStream(节点流),提高执行的效率
OutputStream------输出------>FileOutputStream(节点流)---->new BufferedOutputStream(节点流),提高执行的效率
对象的序列化和反序列化
序列化:将Java对象转成字节序列
反序列化:将字节序列恢复成Java对象
FileInputStream(节点流)---->new ObjectInputStream(节点流)---->实现对象的反序列化 对象 = readObject();
FileOutputStream(节点流)---->new ObjectOutputStream(节点流)---->实现对象的序列化 writeObject(对象)
注意:进行序列化的类要实现序列化接口(空接口,只是具有标识性)
Java中唯一一个用于处理文件或目录的类是File 在java.io包下 该类与平台无关
new File(String path);
new File(String dir,String fileName);
new File(File path,String fileName);