• Java学习指南学习笔记


    1, Java是一种静态类型、动态绑定的语言。具体来说,每一个对象都是编译时确定的良好类型。同时,可以在运行时检查一个对象究竟是什么。

    2, Java中除了基本数字类型之外,Java中所有的对象都是通过引用来访问。

    3, 跟C++相同,不同的类实例的数据是不同的,但是方法都是相同的。

    4,所有实例变量均被设置为默认值0、false或者NULL。如果使用尚未初始化的对象,将会导致一个运行时错误。

    5,命令行运行java/javac时,需要在项目classpath。何为项目classpath,如果代码中没有package语句,则classpath为当前目录。如果有package语句,则根目录为根据package上移目录。如果通过java -d指定了别的output目录,则运行java class的时候也需要指定classpath到对应目录。

      比如javac selfequal.java, java self.equal

    6, jar -cvf abc.jar abc 将abc目录里的内容打包为abc.jar

         -xvf abc.jar 将abc.jar的内容解压  

         -tvf abc.jar 查看abc.jar的内容  

         -cvmf mypairvalue.mf abc.jar abc 将abc的内容打包,同时设置mypairvalue中的属性。可以指定Main-Class 为abc.classname,jar包就可以通过java -jar abc.jar      运行

    7,   一场包括受查异常(throw声明的)和非受查异常(RuntimeException和Error的子类),可以通过printStackTrace看到异常的栈轨迹

    8,   Java的构造函数不能用abstract, synchronized, final修饰

    9,   显示的调用System.gc()方法可以提示垃圾回收器进行一次清扫。在一个对象被垃圾回收器删除之前,其finalize方法会被调用

    10,  接口取代了在C++中使用的多重继承

    11,  可以用this在构造函数入口处调用另一个构造函数,也可以通过super在构造函数入口处调用基类的构造函数。因为默认情况下基类的默认构造函数会被隐式调用,super的调用仅用来调用基类带参数的构造函数。

    12,  Java的interface中函数默认为public,abstract的,implements该interface的类必须实现所有的函数,否则必须为abstract

    13,  可以在任何大括号间声明一个类. 

    p190, 内部类的一个重要用途是建立适配器类。适配器类的作用是绑定至一个类,同时不破坏其封装性。方法的内部类引用的任何方法的局部变量都必须为final,因为在一次方法的调用中,所建立的所有的内部类实例必须看到相同的局部变量。

    p199,   ==检查同一性,只有指向同一个对象时才相等,equals检查相等性,值相等,就相等。自定义的类可以覆盖equal函数(还有toString)

    p201, 对象可以使用Object的clone方法建立自己的副本(浅拷贝),前提是要实现java.lang.Cloneable接口。clone是保护方法,可以通过重定义来声明为public

        Sheep one = new Sheep();

        Sheep another = (Sheep)one.clone();

        如果要实现深拷贝,必须在clone函数中,手动拷贝每一个变量

    p204, 通过实例的getclass方法,或者类的.class方法都可以得到一个特定类的引用(Class对象)。通过这个实例,可以调用getName或者newInstance方法创建实例,注意返回的是Object,需要强制转化为对应类型。

       还可以通过forName查找一个特定类的的引用 Class sneakersClass = Class.forName("Sneakers"); 

    p212, 创建对象除了可以通过classname.newInstance(),也可以先Date.class.getConstructor,再调用构造函数的newInstance

    p214, 反射使我们能够在运行时完成编译时能完成的任何工作。

    p221,  为什么要使用泛型,直接用Object类不行么?

    p258,  Runnable的run方法必须没有任何参数,也没有任何返回值。

    p261, 实现Runnable接口比继承Thread类更好,因为后者需要提供Thread类所有的公共API

    p262, 启动一个线程 

            new Thread(){
                public void run(){System.out.println("Hello World!");}
            }.start()

    p263,stop、suspend和resume都已经废弃不再使用,因为这个方法以一种不合作的方式得到线程的控制,容易导致意想不到的结果,如死锁。应使用interrupt()

    p264,调用join()方法将导致调用者阻塞,知道目标线程完成为止;

    p265, 可以通过setDeamon来设置后台运行,后台运行的程序当所有程序结束时也会被系统自动结束

    P273,notify()会唤醒等待中的一个线程,如果多个线程在等待,java会按任意条件选择其中的一个

    p278, 如果我们希望不同的线程使用不同的值,则需要使用ThreadLocal

    p279, 优先级高的线程会抢占低优先级的线程的执行。相同的线程会一直执行当前线程,直至:

        1,调用Thread.sleep()或者wait()

        2,等带锁,运行一个同步方法

        3,在I/O中被阻塞

        4,通过yield调用交出控制权

        5, 完成或者调用stop()

    p284, 线程组主要是为了识别和控制某一项任务的所有线程,如限制其行为。线程组可以在创建线程的时候传递给构造函数

  • 相关阅读:
    Java 知识点(转)
    List集合的clear方法
    WPF中控件TextBlock使用(简单)
    数据结构(严蔚敏、吴伟民)——读书笔记-2、 线性表及其基本运算、顺序存储结构
    微信公众号智能绑定功能实现(2014年10月24日 更新)
    多线程操作数据拷贝要加线程锁
    Oracle 静态监听注冊具体解释
    windows下solr7.9+tomcat7环境搭建
    "Hello World " —— 深入理解程序从编译到执行
    zoj 3822 Domination 概率dp 2014牡丹江站D题
  • 原文地址:https://www.cnblogs.com/dracohan/p/4509334.html
Copyright © 2020-2023  润新知