< -->

Java学习日志

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);
    }
}
  1. 接口中变量本质上都是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方法,与运算符==的区别,前者是比较的字符串的字符,后者是比较两个对象引用,看他们能否引用相同的实例