java学习笔记

java学习笔记

之前一直都是用c++去写acm题,最近因为更上的项目是用java写的,所以也想趁这个机会去系统的学一门语言。之前还是太水了,没有很好的去了解一些问题,主要还是去用一下stl的函数。而且课上教的东西也就那么点,没啥深入的,确实也没用到过。不过语言这种东西,通一门,门门通。不过我也不是什么都写,我写的都是我之前没有去了解过的东西.

java基础

基础环境

大佬们的博客

  • JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。
  • JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)
  • JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。实现跨平台的关键部分

堆和栈

这个在我之前打acm里,就有接触过,像我们大数组都是开在全局,如果直接开在某个函数的话,可能还没开始,程序就崩了。这里主要还是和内存有关系。

jvm内存划分

  • 寄存器
  • 本地方法区
  • 方法区
  • 栈内存
  • 堆内存

栈内存

栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。(一个线程一个独立的线程栈)

堆内存

存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。(所有线程共享堆内存)

基本数据类型与包装数据类型

这个也是一个很奇怪的地方。我之前写代码的时候,发现在建立hashmap的时候以int总是出错,因为在c++的时候写没有问题,我一开始还以为是自己语法错了。后来发现这个是java的基础语法.不能放int要放integer

基本数据类型的意义在于计算速度快
包装数据类型则是满足java一切皆对象的思想

基本类型 二进制位数 包装器类
boolean 1 Boolean
byte 8 Byte
char 16 Character
short 16 Short
int 32 Integer
long 64 Long
float 32 Float
double 64 Double

了解一下

传参类型

之前写c++的时候都会碰到那个传指针的操作,也就是引用传参,然后java里面没有指针。查了一下,除了基本类型是传数值,其他都是传地址。python也是一样[寒假写这个传对象真的搞死了].

java修饰符

访问修饰符

  • default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
  • 对所有类可见。使用对象:类、接口、变量、方法
  • 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。

很奇怪的是每个java类都只能有一个public类,而且文件名和类名必须相同。
非访问修饰符

  • static 修饰符,用来修饰类方法和类变量。
  • final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
  • abstract 修饰符,用来创建抽象类和抽象方法。
  • synchronized 和 volatile 修饰符,主要用于线程的编程。[这个我还没有去用到过,嘤嘤嘤]

java正则表达式

这个听说过,在c++里面一直都是手动实现,难受,有一次要我们去做爬虫倒是了解过一点点。还有xpath这个玩意。这个东西怎么说呢,学会查文档估计就差不多了。
基础教程

方法的命名规则

  • 方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。
  • 下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。一个典型的模式是:test<MethodUnderTest>_<state>,例如 testPop_emptyStack

想我之前写的那个c++函数都是瞎写,变量的命名都是那啥csl 啊,shu啊,mwh啊…
之前写了项目里面的一个函数,就是接触到了一个叫驼峰命名法,用的是小驼峰命名。用之前的写法,好像确实是挺丢面的啊。既然确定要去搞项目了,还是规范点。看那些大佬写的代码,真的挺好看的,自己写的代码确实奇奇怪怪。

方法的定义

1
2
3
4
5
6
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}

static

这个我一直觉得挺奇怪的,c++里面好像没有用到过,这个我就了解一下。

在《java编程思想里面》介绍是

static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。

看别人的介绍就是

方便在没有创建对象的情况下来进行调用(方法/变量)

  • 用在方法和变量上面就是调用问题,感觉好像就是那个c++的全局变量问题。

exception

这个其实我在之前写数据库前端的时候就看到过,唉那个时候,就感觉自己的代码风格太草率了,我都是直接来的,然后就容易莫名其妙的程序卡死,一点鲁棒性都不留的。然后看别人数据库的代码都是try和catch哎呀,就很尴尬。嘤嘤嘤。
java里面的有关exception的

异常和错误

  • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
  • 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  • 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

怎么重写

  • 首先确定要你这个catch到的exception是存在的,其次就是再你的那个try语句里,你得确定,它是可以抛出这个你要catch的exception
  • 也就是说分为exception类的重写,以及exception抛出的方法的重写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
try {
// 所执行的语句
// 语句中确定要抛出下面的exception
}
catch(ExceptionName1 e){
// 就是出错了,所该做的事
}
catch(ExceptionName2 a){
// 抓到第二个不同的错误,应该做啥。
}
finally{
这个是不管会不会出错,都会去执行的
}

public stastic void test() throw ExceptionName1 e,ExceptionName2 a{
// 语法了解一下
throw new ExceptionName1 e;
throw new ExceptionName2 a;
}

java面向对象

继承

用法extendsimplements

java继承类型

单继承,多重继承,不同类继承同一个类[讲道理我好像没有看到过多继承存在的]

重写与重载

也就是一种特性把,重写比较常见的就是继承下面对父类的方法的重写,重载就是对于同一个名称的方法,对于不同的参数传入方法,有不同的操作的。常见的啊。

多态

这个感觉就是上面的

抽象类

没啥好说的,就是不能上实例呗。

接口

不是说java不能多继承吗,这里的意思就是这样,可以implements多个接口,相当于打标签把,接口的英文时interface

这个还挺有用的,我之前用的maven创建项目,在导入其他的类文件时总是会出错,然后发现,在导入其他文件时,必须让这个文件属于一个包才可以去导入。

java常用数据结构

我在c++里面经常用stl里面的vector,set,map,其他也没怎么用,在java里面好像有好多其他的数据结构。
主要分下面几种,具体的实现思想我到时候再看看

  • 枚举
  • 位集合
  • 向量
  • 字典
  • 哈希表
  • 属性

集合框架

这个就是说了很多的那个集合之间的一些继承的问题。
感觉需要知道的和常用的应该也就那些把hashmap,treemap,hashset,treeset,sortedset,sortedmap,vector,stack,queue,iterator 这些了解一下。

泛型

这个好像和我在数据结构的课上看到的那个对于不同的数据据结构进行操作。