java 学习日志
标签(空格分隔): java
java环境搭建
- 下载JDK并安装:
- 配置环境变量: 将解压安装完毕的jdk1.8.0_20放在/usr/lib/jdk下。 sudo vim /etc/profile 修改配置信息,在末尾添加 export JAVA_HOME = /usr/lib/jdk/jdk1.8.0_20 export PATH = $JAVA_HOME/bin:PATH export CLASSPATH = .:$JAVA_HOME/lib
- 替换系统原有的JDK:
sudo update-alternatives --install /usr/bin/java java 用户的jdk的bin目录/java 300
sudo update-alternatives --install /usr/bin/java java 用户的jdk的bin目录/javac 300
sudo update-alternatives --config java 选择可替换的JDK
数据类型
- java 中的数据类型所占用的内存空间不根据计算机硬件的变化而变化(为了可移植),例如int就占4个字节,因此数据类型所能表示的范围是一定的。(废物)
- java 中的char类型与c++/c中的不太一样,它占2个字节,16位
作用域问题
c++/c中不同作用域中变量名可以重复,而java中不可以
//在c++/c中
int a = 10;
{
int a = 8; //编译不会报错
}
//在java中
class A
{
public static void main(String args[])
{
int a = 10;
{
int a = 9;//编译会报错
}
}
}
注意类型自动提升问题
byte a = a * 2;//2是int 编译器计算表达式时会自动提升为int,此时编译就会出错
byte a = (byte)a*2;//correct
运算符的相关问题
- java中模运算符%既可以用于整数类型也可以用于浮点数类型
- »右移运算注意,如果要移走的值为负数,每次右移都要在左边补1,反之如果要移走的值为正数,每次右移都在左边补0,这叫符号位扩
- -1右移总是-1
- »>无符号右移。记住在表达式中过小的值总是被自动扩大为int.这意味着符号位扩展和移动总是发生在32位
- java中条件判断不能写成if(done)的形式,只能写成if(done == 0 )的形式
- 注意逻辑运算与短路运算(&& 与 & )的差别
类和继承
- Java中的类的声明与实现都要在同一个源文件中,这与C++不一样
- new运算符为对象动态分配(即在运行时分配)内存空间,并返回对它的一个引用
- 引用赋值是浅拷贝
- Java对象传递是按照的引用传递
- 声明Static方法的几条限制: 1.只能调用其他Static方法 2.只能访问Static数据 3.不能以任何方式引用this或super
- 关键字final:类似于c++中的const
- 内部类是非static嵌套类,它可以访问外部类的所有变量喝方法,可以直接引用它们。
- Java中爸爸类叫超类(超累。。),用extends创建继承子类
- 超类的一个引用变量可以被任何从该超类派生的子类的引用赋值,就是爸爸的引用可以被儿子的引用赋值
- 使用super调用直接超类构造函数,以此减少重复代码。super必须是子类构造函数第一行执行的代码
- super还可以用于调用超类被隐藏的成员变量
- java中定义抽象类要在类前加关键字abstract,即 abstract class。相关的虚函数也在其前加上abstract
- final关键字的作用: 1.用它创建一个已命名常量的等价物 2.使用它防止重载 eg. final method…. 3.使用它防止继承
包和接口
- Java用文件系统目录来存储包。
package MyPackage;
//则声明MyPackage的类,即.class文件都存储在MyPackage目录中,**目录名和包名必须严格匹配**
- 接口(高内聚低耦合): 1.关键字int要erface 2.接口不允许实例化 3.接口中所有方法不允许被实现 4.一个类可以有多个接口,用implements关键字 5.要实现一个接口方法时,它必须声明为public
class A implemets interface1, interface2,....
//通过接口引用实现接口
interface Callback
{
public void callback(int a);
}
class Client implements Callback
{
void callback(int a)
{
System.out.println("a is " + a);
}
}
class Test implements Callback
{
public static void main(String [] args)
{
//特别注意这里
Callback c = new Client();
c.callback(43);
}
}
- 接口中变量本质上都是static的,而且是final类型的,即必须要初始化。在Java开发中经常把变量定义在接口中,作为全局变量6. 一个接口不能继承类,但是可以继承别的接口
异常处理
- try块中发生异常抛出, catch捕捉,throw手动引发异常。任何在方法返回前绝对被执行的代码放置在finally中
- subroutine方法用来显示栈轨迹
- 使用多catch语句时,记住异常子类必须在它们任何父类之前。因为运用父类的catch将捕获该类型及其所有子类类型的异常。
- 嵌套try语句: 每次进入try语句,异常的前后关系都会推入堆栈。如果一个内部的try语句不含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配,这个过程将继续直到一个catch语句匹配成功,或者是直到所有的嵌套try语句检查耗尽。
数组
- 对象数组要注意一下,需要new一个数组之后再new一个对象
多线程
- java中线程的优先级是用来决定何时从一个运行的线程切换到另一个,即上下文转换
- 不同的操作系统下等优先级线程的上下文转换可能出现错误
- Thread类sleep方法可能引发InterruptedException异常。这种情形在其他线程想要打搅沉睡线程时发生
- 当一个类继承Thread类时,必须重载run方法,这个run方法是新线程的入口
- 如何判断一个线程是否结束: 1.调用isAlive方法(不常用),如果所调用线程仍在运行,isAlive返回true,否则返回false 2.调用join方法
- 设置线程的优先级: final void setPriority(int level) level 范围在MIN_PRIORITY(1)~MAX_PRIORITY(10)之间,通常为NORM_PRIORITY(5)
- 线程的同步:synchronized关键字
- 线程间通信:
wait,notify, notifyAll仅在synchronized方法中才能调用 final void wait() throws InterruptedException final void notify final void notifyAll
- 线程的挂起和恢复 final void suspend 挂起 final void resume 恢复
IO输入输出流
- Java定义了两种流,字符流与字节流
- System.out标准输出流,System.in标准输入,System.err标准错误流
- 读取字符: int read() throws IOException 遇到流的末尾返回-1
- 读取字符串: String readLine() throws IOException
- PrintWriter类,字符流
PrintWriter(OutputStream outputStream, boolean flushOnNewLine)
outputStream是OutputStream类的对象,flushOnNewline控制Java是否在println方法被调用时刷新输出流。如果flushOnNewline为true,刷新自动发生,若为false,则不发生
- 文件读写
//打开文件
FileInputStream(String fileName) throws FileNotFoundException
FileOutputStream(String fileName) throws FileNotFoundException
//关闭文件
void close() throws IOException
//读文件
int read() throws IOException
读到文件尾则返回-1
- Applet 小程序
import java.awt.*;//包含了基于图形界面的支持
import java.applet.*;
swing事件处理
- java事件是采取“委派事件模型”,指当事件发生的时候,产生事件的对象(事件源),会把次信息传递给事件的监听者,就是java.awt.event的类库中所创建的对象。
String 类
- 构造:注意这个构造方法String(char chars[], int startIndex, int num)
- 当一个类的对象在连接表达式中使用或出现在调用println中,该类的toString方法自动被调用
- 注意用于比较的equals方法,与运算符==的区别,前者是比较的字符串的字符,后者是比较两个对象引用,看他们能否引用相同的实例