java基础
大学期间学过java,但是很多内容都忘记了,重新学习了一遍并将之前掌握得不好的部分总结下来。
1.编译型和解释型
编译型: 将源代码一次性编译成可执行文件,不需要每次执行时重新编译。
解释型: 每次执行时都需要对源代码进行逐行解释。
java是两者结合。
2.进制
八进制数字前加0
十六进制数字前加1x
3. 类型转换
byte,short,char->int->long->float->double
强制转换:(类型)变量名 高->低
自动转换: 低->高
注:
1.不能对布尔值进行转换。
2.不能把对象类型转换为不相干的类型。
3.转换的时候可能存在内存溢出,或者精度问题。
4.变量和常量
类变量: 声明前static,从属于类,可以在类中直接使用。
实例变量: 从属于对象,需要new一个新的对象才能使用;布尔值的默认值是false。
局部变量: 从属于方法,必须声明和初始化值。
常量:初始化后不能再改变的值;用final关键词定义。
5.字符串连接符
int a=1;
int b=2;
System.out.println(""+a+b); //输出12("“在前,自动转换为字符串型。)
System.out.println(a+b+”"); //输出3(""在后,前面依旧进行运算。)
快捷键
ctrl+d复制改行到下一行
alt+enter自动补全
windows+table切换页面
6.包机制
一般利用公司域名倒置作为包名。
7.JavaDoc生成文档
/**+enter
8.Scanner对象
基本语法: Scanner s = new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
scanner.close();//凡是属于IO流的类型如果不关闭会一直占用资源
next()以空格作为分隔符
nextLine()以回车作为分隔符
9.循环
do while()先执行后判断,循环至少会执行一次。
10.命令行传参
在命令行运行class文件,需要找到包的路径,否则无法运行。
11.可变参数
1.JDK1.5开始,Java支持传递同类型的可变参数给一个办法。
2.在方法声明中,在指定参数类型后加一个省略号(…)。
3.一个方法只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
12.内存分析
1.堆:存放new的对象和数组;
可以被所有的线程共享,不会存放别的对象引用。
2.栈:存放基本变量类型(会包含这个基本类型的具体数值);
引用对象的变量(会存放这个引用在堆里面的具体地址)。
3.方法区:可以被所有的线程共享;包含了所有的class和static变量。
4.数组本身就是对象,数组元素相当于对象的成员变量。Java中方对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
13.Arrays类
包含用于操作数组的各种方法(排序和搜索),该类还包含一个静态工厂,可以将数组视为列表。
Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而“不用”(不是“不能”)使用对象来调用。
1.Arrays.toString(int[] a):打印数组;
2.Arrays.sort(int[] a):升序排序;
3.Arrays.fill(int[] a, int val):将数组中每个元素都赋值为val;
4.Arrays.equals(int[] a, int[] a2):并比较数组中元素值是否相等。
14.面向对象
Alt+Insert:生成构造器/get set方法
Ctrl+H:查看继承结构树
基础
1.面向对象的本质就是:以类的方式组织代码,以对象的形式组织(封装)数据。
2.三大特性:封装、继承、多态。
3.静态方法可以直接通过类名.方法名调用;非静态方法需要实例化(对象类型 对象名=对象值)后才能调用。
4.静态方法是和类一起加载的;非静态方法是类实例化之后才存在的,所以静态方法不能调用非静态方法,反之可以。
5.java只有值传递。
6.一旦定义了有参构造,无参就必须显示定义。(快捷键:alt+insert生成构造器)
7.引用类型:对象是通过引用来操作的:栈–>堆。
8.程序设计要追求“高内聚,低耦合”。高内聚:类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
继承
1.在java中,所有的类都默认直接或间接继承object类;java中只有单继承,没有多继承。
2.super注意点:
-
super调用父类的构造方法,必须在构造方法的第一个
-
super必须只能出现在子类的方法或者构造方法中
-
super和this不能同时调用构造方法
VS this: -
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用 -
前提
this:没有继承也可以使用
super:只能在继承条件下才可以使用 -
构造方法
this():本类的构造
super():父类的构造
重写
需要有继承关系,子类重写父类的方法;
1.方法名和参数列表必须相同,方法体不同;
2.修饰符:范围可以扩大 public>protected>Default>private;
3.抛出的异常:范围可以被缩小,但不能扩大。
多态
同一方法可以根据发送对象的不同而采取多种不同的行为方式
1.一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类);
2.多态是方法的多态,属性没有多态;
3.父类和子类,有联系;(类型转换异常:ClassCastException)
4.存在条件:继承关系,方法需要重写,父类引用指向子类对象(father f1 = new Son());
5.不能重写的方法:
- static方法:属于类,不属于实例
- final:常量
- private方法:私有,不能重写
6.如果是父类指向子类的引用,父类中定义了方法而子类中没有定义,则使用父类中的方法;父类子类同时定义,则使用子类中的方法;只有子类中定义,无法使用。
7.访问成员变量的两种方式: - 直接通过对象名称访问成员变量:看等号左边是谁,则优先用谁,没有则向上找。
- 间接通过成员方法访问成员变量。
成员变量:编译看左边,运行还看左边
成员方法:编译看左边,运行看右边
类型转换
1.父类引用指向子类的对象;
2.把子类转换为父类,向上转型;
格式: 父类名称 对象名 = new 子类名称();
含义: 右侧创建一个子类对象,把它当作父类来看待使用;
注意事项: 向上转型一定是安全的,从小范围转向更大范围。
3.把父类转换为子类,向下转型:强制转换。
格式: 子类名称 对象名=(子类名称)父类对象
**含义:**将父类对象,【还原】成为本来的子类对象。
注意事项:
- 必须保证对象本来创建的时候就是猫(假设动物是父类,猫狗是子类),才能向下转型成为猫。
- 如果对象创建的时候本来不是猫,现在非要向下转型成为猫,就会报错。
- 如何知道一个父类引用的对象,本来是什么子类?
格式:
对象 instanceof 类名称
这将会得到一个boolean值,判断前面的对象能不能当作后面类型的实例。
static
1.静态方法是和类一起加载的;非静态方法是类实例化之后才存在的,所以静态方法不能调用非静态方法,反之可以。
2.static可用于静态导入包
3.被final修饰的类不能被继承
抽象类
1.抽象类的所有方法,继承了它的子类,都必须要实现它的方法,除非这个子类也是抽象类;
2.不能new这个抽象类,只能靠子类去实现它;
3.抽象类中可以写普通的方法;抽象方法必须在抽象类中;
4.抽象类中可以有构造方法。
接口
1.定义一些方法,让不同的人实现;
2.implements可以实现多个接口;
3.接口中的属性默认为常量public static final;方法默认为public abstract;
4.接口不能被实例化,接口中没有构造方法;
5.必须要重写接口中的方法。
匿名对象
1.只有右边的对象,没有左边的名字和赋值运算符;
2.匿名对象只能使用唯一的依次,下次用需要重新创建新对象。
15.异常
选中代码 用Ctrl+Alt+T可以自动补全异常代码块
1.五个关键字:try、catch、finally、throw、throws;
2.try/catch必须要有,finally可以没有(一般用于IO流,关闭操作);
3.在多重catch块后面,可以加一个catch(Exception)来出合理可能会被遗漏的异常;
16. IO
16.1 基本信息
1.输入:将硬盘中的数据读取到内存中使用
2.输出:将内存中的数据写到硬盘中保存
3.数据流分为字节流和字符流
16.2 字节流
1.字节输出流OutPutStream:抽象类,所有字节输出类的超类
- FileOutputStream:把内存中的数据写入到硬盘的文件中
- 写入数据的原理:java程序->JVM->OS->OS调用写数据的方法,把数据写入文件中。
2.字节输入流InputStream:抽象类,所有字节输入类的超类 - FileInputStream:吧硬盘文件中的数据,读取到内存中使用
- 读取数据的原理:java程序->JVM->OS->OS读取数据的方法->读取文件
16.3 序列化与反序列化
1.把对象以流的方式,写入到文件中保存,叫写对象,也叫对象的序列化。
2.把文件中保存的对象,以流的方式读取出来,叫做读对象,也叫对象的反序列化。
3.类通过实现Serializable接口以启用其序列化功能,未实现此接口的类将无法使其任何状态序列化或反序列化。