有关Java的学习记录One

本文详细介绍Java语言的基础知识,包括编译与运行机制、基本数据类型、数组操作、面向对象编程概念,以及高级特性如多态、泛型、异常处理、线程管理等内容。
  1. Java代码首先被编译成字节码文件,再由Java虚拟机(JVM)将字节码文件翻译成特定平台下的机器码然后运行(注意:跨平台的是Java程序,不是JVM,JVM是由C/C++开发的,是编译后的机器码,不能跨平台。)
  2. 即时编译:JVM可以将使用最频繁的字节码翻译成机器码并保存。目前因为JVM可以监控运行时信息,即时编译器甚至超过了传统编译器。
  3. Java有三个版本:J2SE、J2EE和J2ME(学习编程从J2SE入手)
  4. Java中的类可以看成C语言中结构体的升级版。在Java中,必须通过new关键字来完成内存空间的分配。面向对象编程是面向过程的升级版。
  5. JDK(Java类库、JavaAPI):环境变量CLASSPATH来指明类库的路径,它的值为.;%JAVA_HOME%lib
  • .p1\Test.class(“.”表示当前路径) 
  • D:\Program Files\jdk1.7.0_71\lib\p1\Test.class     
  1. Java是一种强类型的语言,声明变量时必须指明数据类型。8种基本数据类型:包括4种整型(byte、short、int、long),2种浮点型(float、double),1种字符型(char),1种布尔型(Boolean)
  2. 整型通常使用int类型。数据很大的时候再用long类型。byte和short类型主要用于特定应用场合,例如,底层文件处理或者需要控制占用存储空间量的大数组。浮点数通常使用double类型。
  3. Java不支持无符号类型(unsigned)。     
  4. 自动数据类型转换:(低->高)byte,short,char->int->long->float->double
  5. 数组定义:type arrayName[] = new type[arraySize];
    import java.util.*;
    public class Demo {
        public static void main(String[] args){
            int intArray[] = new int[5];
            long total = 0;
            int len = intArray.length;
           
            // 给数组元素赋值
            System.out.print("请输入" + len + "个整数,以空格为分隔:");
            <strong>Scanner sc = new Scanner(System.in);</strong>
            for(int i=0; i<len; i++){
                <strong>intArray[i] = sc.nextInt();</strong>
            }
           
            // 计算数组元素的和
            for(int i=0; i<len; i++){
                total += intArray[i];
            }
           
            System.out.println("所有数组元素的和为:" + total);
        }
    }

  6. foreach循环
    int arrayDemo[] = {1, 2, 4, 7, 9, 192, 100};
    for(<strong>int x: arrayDemo</strong>){
        System.out.println(x + ", ");
    }

  7. 由于Java把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一堆的大小相同。
  8. 静态数组容量确定不可以修改。如果需要运行程序时改变容量,就需要数组列表(ArrayList)或向量(Vector)
  9. String被初始化后长度不变,内容也不变。如果要改变它的值,就会产生新的字符串
  10. 字符串操作:①length()返回字符串长度。  ②charAt()按照索引值获得字符串中的指定字符   ③contains()检测字符串是否包含某个子串  ④replace()替换字符串中所有指定的字串  ⑤split()以指定字符串作为分隔符,对当前字符串进行分配,结果为一个数组。
  11. StringBuffer默认分配16字节长度的缓冲区,当字符串超过改大小,自动增加缓冲区长度。只能通过new来创建对象。主要方法:①append()用于向当前字符串的末尾追加内容,指向内容变了,不是指向变了。  ②deleteCharAt() 删除指定位置的字符   ③delete(,)一次性删除多个字符  ④insert()在指定位置插入字符串  ⑤setCharAt()修改指定位置的字符 
  12. StringBuilder不是线程安全,速度略快
  13. Java访问修饰符(补充:私有变量只能通过get/set public 方法获取与操作)
  14. 变量的作用域分为四个级别:类级、对象实例级、方法级、块级  ①类级变量:静态变量 static 类定义后存在,占用内存空间,通过类名来访问,不需要实例化  ②对象实例级:成员变量,实例化才会分配内存空间  ③方法级:方法内部定义变量,局部变量  ④块级:块内部变量,生命周期就是这个块   方法级和块级的变量必须被显示地初始化,否则不能访问
  15. this作为方法名来初始化对象,相当于调用本类的其他构造方法,它必须作为构造方法的第一句。
  16. 方法重载:方法名相同,参数列表不同。声明为final的方法不能被重载,声明为static的方法不能被重载,但是能够被再次声明。初始化一个类,必须先初始化它的属性,再回到构造方法。
  17. 包装类:Byte、Short、Integer、Long、Character、Float、Double、Boolean。  intValue,parseInt,toString  自动拆箱和装箱
  18. 执行javac命令需要进入当前目录,而执行Java命令需要进入当前目录的上级目录,并且类名前面要加上包名。
  19. 继承:子类可以继承父类除private以外的所有的成员;构造方法不能被继承
  20. this用来表示当前类的实例,super用来表示父类(super:调用父类中声明为private的变量;点取已经覆盖了的方法;作为方法名表示父类构造方法
  21. super不是一个对象的引用,不能将super赋值给一个对象变量,它只是一个指示编译器调用父类方法的特殊关键字
  22. 覆盖不会删除父类中的方法,而是对子类的实例隐藏, 暂时不使用。覆盖方法不能比原方法访问性差(访问权限不允许缩小)不能是final,private,static
  23. 多态是指一个事物有不同的表现形式或形态:要有继承、要有重写、父类变量引用子类对象(优先调用子类)
  24. 判断一个变量所实际引用的对象的类型,Java使用instanceof操作符,对象的类型转换在程序运行时检查,向上转型会自动进行,向下转型的对象必须是当前引用类型的子类。
  25. 静态方法不能直接调用非静态方法,只能访问静态变量,不存在当前对象,不能使用this,super,不能被非静态方法覆盖。构造方法不允许声明为static的,局部变量不能使用static修饰。静态初始器仅仅在类装载的时候执行一次,往往用来初始化静态变量。
  26. final修饰的成员变量必须在声明时同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能在构造方法中显示赋值,然后才能使用。引用类型的变量标记为final,该变量不能指向任何其他对象,但可以改变对象的内容,因为只有引用本身是final。static或private修饰的方法会被隐式的声明为final。
  27. 引用类型数据比较的是引用,即内存地址,基本数据类型比较的是值。equals()只能比较引用类型,“==”可以比较引用类型及基本类型。equals()比较类型与内容而不考虑引用是否是同一个实例。
  28. 如果两个对象相同,它们的hashCode值一定要相同。如果两个对象的hashCode值相同,它们并不一定相同。
  29. 内部类可以访问外部类中的数据,包括私有数据。可以对同一个包中的其他类隐藏起来。内部类是一种编译器现象,与虚拟机无关。编译器会把内部类翻译成用¥符号分隔外部类名和内部类名的常规类文件。非静态内部类中不能声明任何static成员
  30. 局部类只能使用定义它们的代码块中的任何局部final变量。不可以是static和定义static成员。不可以使用public、private、protected修饰,可以使abstract。
  31. 匿名内部类必须继承一个父类或实现一个接口
  32. 接口中声明的成员变量默认都是public static final 必须显示的初始化。不能在接口中定义实例变量、非抽象的实例方法及静态方法,没有构造方法,不能被实例化。一个类不能实现该接口的所有抽象方法,那么这个类必须被定义为抽象类。接口作为引用类型来使用,任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类中所实现的接口中的方法,Java运行时系统会动态地确定应该使用哪个类中的方法,实际上是调用相应的实现类的方法。
  33. 类型参数(泛型参数)由尖括号包括,多个参数由逗号分隔。类型参数需要在类名后面给出,一般,K表示键,V表示值,E表示异常或错误,T表示一般意义上的数据类型。泛型类在实例化时必须指出具体的类型,也就是向类型参数传值。className variable<dataType1, dataType2> = new className<dataType1, dataType2>();
  34. Java泛型使用<? super T><? extends T>(<? extends T>T类的某一种子类,表示包括T在内的任何T的子类,<? super T>T类的某一种超类,表示包括T在内的任何T的父类)PECS:生产者使用extends,消费者使用super。
  35. 异常子类必须在它们任何子类之前使用是很重要的。throw:异常的抛出。throw是:抛出方法的异常,每一个try语句至少需要一个catch或finally子句。
  36. Java的内置异常:http://www.weixueyuan.net/view/6021.html
  37. 断言:①assert 《布尔表达式》 ②assert《布尔表达式》:《细节描述》。如果布尔表达式的值为false,将抛出AssertionError异常,细节描述是AssertionError异常的描述文本。
  38. 断言推荐使用方法:用于验证方法中的内部逻辑,包括(内在不变式,控制流程不变式,后置条件和类不变式【不推荐用于公有方法内的前置条件的检查】)
  39. 多任务处理有两种截然不同类型:基于进程和基于线程。线程可以正在运行(running),只要获得CPU时间它就可以运行,运行的线程可以被挂起(suspend),并临时中断它的执行。一个挂起的线程可以被恢复(resume),允许他从停止的地方继续运行。一个线程可以在等待资源时被阻塞(block)。在任何时候,线程可以终止(terminate),立即中断了它的运行,一旦终止,线程不能被恢复。
  40. 线程优先级是用来决定何时从一个运行的线程切换到另一个。线程可以自动放弃控制。在I/O未决定的情况下,睡眠或阻塞由明确的让步来完成。在这种假定下,所有其他的线程被检测,准备运行的最高优先级线程被授予CPU;线程可以被高优先级的线程抢占。不同的操作系统下等优先级线程的上下文转换可能会产生错误。管程可以用来防止共享的资源被多个线程操纵。
  41. 消息传递:允许一个线程进入一个对象的一个同步方法,然后在那里等待,直到其他线程明确它出来:Thread类和Runnable接口
  42. currentThread()是Thread类的公有静态成员。
  43. 通过实现Runnable接口的方法创建每一个对象的线程,run方法能像主线程一样调用其他方法,引用其他类,声明变量。仅有的不同是run在程序中确立另一个并发的线程执行入口。当run返回时,该线程结束。
  44. 可以在线程中调用isAlive()来判断一个线程是否结束。join方法等待线程结束。setPriority(int level)来设置线程的优先级,level的值必须在1和10之间。
  45. 管程(同步的关键)是一个互斥独占锁定的对象,或称互斥体。在给定的时间,仅有一个线程可以获得管程,当一个线程需要锁定,它必须进入管程。所有其他的试图进入已经锁定的管程的线程必须挂起直到第一个线程退出管程。这些其他的线程被称为等待线程。一个拥有管程的线程如果愿意的话可以再次进入相同的管程。
  46. 使用同步方法: 因为所有对象都有它们与之对应的隐式管程。进入某一对象的管程,就是调用被synchronized关键字修饰的方法。当一个线程在一个同步方法内部,所有试图调用该方法(或其他同步方法)的同实例的其他线程必须等待。为了退出管程,并放弃对对象的控制权给其他等待的线程,拥有管程的线程仅需从同步方法中返回。任何在多线程情况下,你有一个方法或多个方法操纵对象的内部状态。都必须用synchronized关键字来防止状态出现竞争。记住,一旦线程进入实例的同步方法,没有其他线程可以进入相同实例的同步方法。然而该实例其他不同步方法仍然可以被 调用。
  47. 使用同步语句:在这类定义的方法调用放在一个synchronized块内可以解决不能在相关方法前加synchronized修饰的类。一个同步块确保对object成员方法的调用仅在当前线程成功进入object管程后发生。
  48. 轮询通常由重复检测条件的循环实现。一旦条件成立,就要采取适当的行动,浪费了CPU时间。为避免轮询,Java包含了通过wait(),notify()和notifyAll()方法实现的一个进程间通信机制。这些方法在对象中是用final方法实现的,所以所有的类都含有它们,这三个方法仅在synchronized方法中才能被调用。
  49. 线程通信最经典的例子:消费者与生产者
    1. 生产者线程对象
    2. 消费者线程对象
    3. 资源类(如,生产包子的容器)
    4. wait方法和notify方法(切换运行,达到互相唤醒)
    5. 实现条件是判断容器中的资源是否变化,到达一定变化时,调用wait方法,等待唤醒。
    6. 反之亦然,notify通知沉睡的线程,继续执行。
  50. 需要避免的与多任务处理有关的特殊错误类型是死锁。死锁发生在当两个线程对一对同步对象有循环依赖关系时。程序过多地出现同步就会造成线程死锁。
  51. 由一个指示线程状态的标志变量来完成。只要该标志设为“running”,run()方法必须继续让线程执行。如果标志为“suspend”,线程必须暂停。若设为“stop”线程必须终止。
  52. 线程技术掌握部分:
    1. 创建线程的方式(接口)
    2. 同步(块、对象)
    3. 避免死锁出现
    4. wait和notify(理解)
    5. 线程组设计(优化)

      参考总结:http://www.weixueyuan.net/java/rumen_1/


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值