美文网首页
Java学习笔记

Java学习笔记

作者: MikleLi | 来源:发表于2017-07-29 12:16 被阅读0次

    这个来作图床,方便插入图片。
    1、设置环境路径和临时环境路径。set path = ...;%path%
    2、设置可执行文件路径。java指令优先寻找的路径。set classpath=c:\ 加和不加分号;的区别就是不加分号只在classpath目录里找文件,加会再从当前目录找,最好不加。set classpath=.;%classpath% 用点 . 来代表当前目录。
    3、心得。低于int这个默认类型大小的变量不能直接等于别的几个变量的运算,但是int不回报错。(例如x=x1+x2)
    4、static修饰的是静态,存在静态存储区,只分配一次内存,可直接用类名来调用。相比之下,非静态的实例变量或者方法,每创建一个对象就分配一次内存,只能用对象名来调用。
    5、堆栈。
    存的是可让程序员自主申请的对象的实体(对象名放在栈里)。每个实体都有首地址,每一个变量都有默认初始化值。整数是0,小数是0.0或者0.0f,boolean false char '\u0000',指针的称呼变为引用。释放对象用系统垃圾回收机制自动进行。
    存放的是操作系统自动分配释放的变量对象,如局部变量。

    6、二维数组。int[][] arr = new int[] 先不指定一维的个数,这是可以。arr[0]=new int[2] arr[1]=new int[3] arr[2]=new int[1] 可以在同一个二维数组里制定不同范围的一维数组。
    7、[I@1fb8ee3。@左边是实体的类型,右边是实体的哈希值。
    8、一个java文件只能一个public类。但是可以有多个非public类在同一个文件中
    9、this(a); 构造函数中调用构造函数
    10、
    静态变量或函数。
    与非静态在生命周期,调用方式,存储位置等等上不同。在使用时,要注意:1.静态方法只能访问静态成员。(非静态都可以访问) 2.不可以使用this或super。
    11、主函数所在类 要特别注意。主函数所在类,被调用的变量和方法大部分都该是静态的。
    12、用静态函数 在无需访问非静态变量时,就把函数定义为静态函数。
    13、静态代码块 static{ } 随着类的加载而执行,并且比构造代码块优先执行,可用于给类进行初始化一些静态变量等。
    14、构造代码块 就是类里面仅用{}扩起来的代码块。不扩会报错。用来作通用性的执行,减少构造函数的代码量。 执行顺序: 静态代码块 -> 构造代码块 -> 构造函数 (面试用)
    15、java文档。/**
    这个是文档注释,可以用javadoc -d . myclass -author -version xxxx.java 这样的命令行来执行生成文档包。
    java文件中用@param x 什么什么什么;@return 什么什么;@author xxx;@version V1.0
    */
    16、设计模式。1、单例设计模式,所有程序共用一个对象,直接在类中建立一个私有初始化的对象,并同时在该类中创建静态对象,写个get函数返回对象。该私有的私有,该静态的静态。
    饿汉式用的比较多,懒汉式一般面试会考到多线程安全问题。方法是加两层null判断,内层用一个同步锁。
    17、继承。 class Student extends Person{} 直接用。优点:提高复用性,联系起类与类,给多态提供前提。
    18、单继承。 Java只支持单继承,但对C++的多继承进行改良,避免调用的不确定性。
    19、多层继承。 C继承B,B继承A。
    20、super可用来访问父类成员变量。this:代表一个本类对象的引用,super:代表一个父类空间。
    21、覆盖。子类同名方法权限大于父类方法权限,会发生覆盖,静态方法不要参与覆盖。当对一个类进行子类的扩展时,子类需要父类的功能声明,但是要定义子类中该功能的特有内容时,就使用覆盖来完成。覆盖只出现在函数上
    class Demo
    {
    int show(int a, int b){return 0;}
    }下面哪些函数可以存在于Demo的子类中。
    A.public int show(int a, int b){return 0;}//可以
    B.private int show(int a, int b){return 0;}//不可以,权限不够。
    C.private int show(int a, long b){return 0;}//可以,子类特有方法
    D.public short show(int a, int b){return 0;}//不可以,调用的不确定性。
    E.static int show(int a, int b){return 0;}//不可以,静态只能覆盖静态。
    22、子类构造函数的隐式语句。在子类构造函数的第一句是super();空参数那句
    23、构造函数第一行放了this(),this()也只能放第一行,如果放了第一行,要保证子类中会有其他的构造函数访问父类构造函数。
    24、子类实例化顺序(有父类时)。成员变量先默认初始化为0,再运行构造函数第一句父类构造函数,然后才显示初始化,int a=10;显示初始化总是在父类构造函数之后的最开始。
    25、final最终化修饰符。由于继承打破了封装性,final来帮忙保持封装性。const被final代替。final类不可被继承,方法不可被覆盖。
    26、书写规范。函数和变量都是第二个单次开始首字母大写;常量所有字母都大写,多个单次,中间用_连接。
    27、使用抽象。拥有共性的事物,可以抽出来。比如不同类的同名函数,可以抽出来,直接加 ; 和 abstract。后面的类继承这样的抽象类。
      其特点是:1,方法只有申明没有实现时,该方法就是抽象方法,需要被abstract修饰。抽象方法必须定义在抽象类中,该类也必须被abstract修饰。
      2、抽象类不可以被实例化。
      3、抽象类必须有其子类覆盖所有的抽象方法后,该子类才可以被实例化。否则,这个子类还是抽象类。
      其细节有:1、有构造函数,给子类对象进行初始化。
      2、抽象类可以不定义抽象方法,这样目的是不让该类创建对象。AWT
      3、抽象类关键字,不能使用private,static,final.
      4、抽象类与一般类的异同:
      相同点:抽象类和一般类都是用来描述事物的,都在内部定了成员。
      不同:1.一般类有足够的 信息描述事物。抽象类描述信息一般不足。
        2.一般类中可定义抽象方法,同时也可以定义非抽象方法。
        3.一般类可以被实例化,抽象类不可被实例化。
      4、抽象类一定是个父类。因为需要子类覆盖其方式后才可以对子类实例化,否则子类还是抽象的。
    28、接口interface定义的类。成员变量固定默认为public static final修饰,是全局常量;成员方法固定public abstract修饰。少写了某个修饰符没事。
      接口是对外暴露的规则;
      接口是程序的功能扩展;
      接口的出现降低耦合度;
      接口可以用来多实现;
      类与接口之间是实现关系,且类可以继承一个类的同时实现多个接口。
    当抽象类中的所有方法都是抽象的时候,可以将该抽象类用接口interface来修饰。由其他类implements这个接口类才可以实例化使用。
    29、多实现,由多继承改造而来。可以一次性覆盖多个抽象。并且一个类在继承另一个类的同时,还可以实现多个接口。class Test extends Q implements A,Z
    30、接口之间可以多继承。原理是因为方法体不存在,所以不会冲突。
    31、抽象和接口的异同。 相同点:都是不断向上抽取。
    不同点:1.抽象类需要被继承,单继承。接口需要被实现,多实现。
    2.抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。接口中只能定义抽象方法,必须由子类去实现。
    3,抽象类的继承是is a关系,在定义该体系的基本共性内容。接口的实现是like a关系,在定义体系额外功能。
    32、接口对象的引用 都是指向自己的子类对象。useUSB(USB u) 其中USB是接口。
    33、多态就是父类或者接口的引用指向其子类对象。如 动物 cat = new 猫()
    多态好处就是更好地复用和扩展,不同的子类用同一个父类传入参数,就可以只顶一个操作函数。 前期定义的代码可以使用后期的内容,提高后期可维护性。
    多态的弊端就是前期定义的内容不能使用后期子类特有内容。
    多态的前提:1.必须有关系,继承、实现。 2.要有覆盖。
    自动类型提升要注意,Animal a = new Cat(); 猫类型提升为动物类型,就不能使用猫类的特有功能,反过来用作限制对特有功能的访问。
    向下转型 如果用了多态自动提升,还想用特有功能,可以向下转型 Cat c = (Cat)a;
    多态的外貌 要注意的是用了Animal a = new Cat();的多态,用a来调用父类被覆盖的函数会用覆盖后的结果,另外a不能调用子类特有功能(因编译不能过),像是a穿着父类的外貌找不到a本身特有的东西,但实际内在还是会按规则变动,该覆盖还要覆盖,毕竟实例化的是子类。具体看下面多态特点。
    instanceof用于引用类型,去判断该对象的具体类型,if(a instanceof Cat)
    多态特点
    1、成员变量上。编译运行都参考等号的左边的类。
    2、成员函数(非静态)上。编译看左,运行看右。记得还有继承的函数。一提多态就想到向山转型,将子类型隐藏。就不能使用子类的特有方法。
    3、静态函数上。固定绑定在类上,编译运行看左边引用类型的类。其实静态方法调用是不需要对象的,直接类名来调用就OK。
    34、内部类。编译完成内部类也算一个单独的类带有外部类名作前缀。内可访问外,外不可访问内。
    背景:是一般用于类的设计,封装。在分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。这时就把还有的事物定义成内部类来描述。
    举例比如心脏定义在人体类里面作为内部类。
    修饰符。内部类没修饰符,那么要两次new来实例化内部类;内部类是静态的,直接new,甚至静态内部类定义了静态方法,可以直接用类名.类名调用;注意如果内部类定义了静态函数,该内部类也必须是静态的。
    1 = new Outer().new Inner();普通
    2 = new Outer.Inner();内部类静态,相当于一个外部类
    3 Outer.Inner.function();内部类和成员都静态,直接调。
    局部变量的调用 在内部类中可以用类名+this.来指定某个被冲突的变量。
    局部位置的内部类只能访问局部中用final修饰的局部变量。
    匿名内部类 是内部类简写格式。
    但必须有前提,内部类必须继承或实现一个外部类或者接口。
    其实父类接口名 in = new 父类or接口{子类内容}就是匿名子类对象,简化了封装动作一气呵成。
    常见使用场景之一:当函数参数是接口,而且接口中方法不超过三个,有用匿名内部类作为实际参数传递,就是show(new Inter{public void show1();public void show2();});
    有个细节。如果匿名内部类对象不向上转型( 不Object in = new Object(){...}.方法(); )可以直接用新定义在该子类中的特有方法,否则不行。这样可进一步简化。
    35、对象初始化过程。隐式初始化->父类构造函数->显示初始化->构造代码块->该类构造函数。在父类构造函数同样顺序进行。
    36、抛异常。用 throw new ArrayIndexOutOfBoundsException("错误了:" + index); 参考他人总结
    自定义异常类。 class xxxx extends Exception 用的时候记得在方法后声明throws出来(包括main方法),并且用父类初始化super(msg); 若继承RuntimeException 可以不处理(throws)。
    异常的分类:
    一、编译时检测异常Checked异常。Exception和其子类都是,除了子类RuntionException体系,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种
    1 当前方法知道如何处理该异常,则用try...catch块来处理该异常。
    2 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
    二、运行时异常。Exception中和RuntimeException和其子类。这种问题一般编译直接通过,不在编译时处理。运行时中断,让调用者处理。如果程序能直接处理,就用try catch捕捉异常 try{}catch(异常类 变量){}。
    Error是让虚拟机都没法处理的东西了,不应捕捉抛出,直接中断。

    throws 和 throw的区别
    1、throws使用在函数上,抛出的是异常类,可以多个。
    2、throw使用在函数内,抛出的是异常对象,抛一个。

    37、异常处理原则:
    1、函数内容如果抛出需要检测的异常,函数上必须申明。
    2、如果调用到了声明(throws)异常的函数,要么try catch要么throw,比如在main函数中调用了一个函数。
    3、功能内容可以解决异常的,用catch;解决不了,用throws告诉调用者,由调用者解决(可以在catch里用throw来中断 记得throws声明下)。
    4、一个功能如果抛出多个异常,那么必须由多个catch进行针对性处理。有几个异常抛几个,就catch几个。
    38、finally{}。通常用于关闭(释放)资源。
    它是在try{}catch{}finally{}中一定会执行的代码,比如在catch中加个return;代码运行到catch完就停止,但除了final会仍然运行。但除了退出虚拟机会不执行finally里的语句,System.exit(0);其他情况都会执行。
    举例:
    try{
    //开启资源。
    throw new Exception();
    }
    finally{
    //关闭资源。
    }
    这里异常无法直接catch处理,但是资源需要关闭。
    总结起来有时候在函数里出现的异常,可以用try catch来捕捉,没必要非要来个if(函数()) throw new 对象来处理,或者直接在函数里抛出,又要在调用这个方法的函数里声明throws出来,特别是checked异常多用try,可以不用声明了,更可以抛给调用者另一个对于他比较熟悉的异常。又或者情况常是方法内部处理掉了异常不抛那就算是隐藏异常,得抛一个调用者熟悉的异常!
    Computer类方法里抛几个异常,User类方法里捕捉异常并处理,处理的了的就继续调用这个方法或其他继续进行操作,处理不了的再抛一个新的异常让调用User类方法的调用者知道,不能隐藏。
    异常的注意事项:1、子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者异常的子类。原因:在多态的情况下,调用父类方法catch的异常类型和子类抛的不同,这是不允许。
    2、如果父类抛出多个异常,那么子类只能抛出父类异常的子集。即:子类覆盖父类只能抛出父类的异常或者子类或者子集。
    注意:如果父类或接口的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try!!。比如多线程run()方法
    39、equal()方法特别重要,自己写一个传入obeject x为参数,记得向下强制转型时候要先判断instanceof对应类,不是要抛运行异常中断掉。
    40、hashcode()方法 实际就是把地址的后几位16进制转成10进制。hash值重写!默认是用地址来做hash值,重写hash值有助于性能。先放着。。
    41、getClass()和字节码文件对象 p1.getClass();得到p1对象所属的字节码文件,即对应那个类文件 xxx.class
    class Class{
    name
    field
    constructor
    method
    }这就是所有类文件的类,类文件(字节码文件)都是一个对象,所属这个类。
    42、toString()也很重要。和上上面两个一样最好都重写。
    43、包package。分类管理和封装,让源文件和字节码文件相分离,提供多层命名空间,所以类全名是包名.类名。
    package 包名全小写
    javac -d . xxx.java
    java mypack.xxx来运行
    包与包之间的类进行访问,被访问的包中的类必须是public,被访问的包中类的方法也必须是public。
    protected关键字只允许不同包的子类访问,不允许非子类不同包无关者访问。这是第四种权限。
      public protected default private
    同类 ok  ok   ok  ok
    同包 ok  ok   ok
    子类 ok  ok
    不同包 ok
    44、类名.java会被编译器找,编译时,new一个对象,会先找对象对应的类文件,没有类文件就找对应类的源文件,如果源文件有所属的包,则要找名称为 所属包.类名 的文件。
    45、通配符:* 有用在import 包.* 加入该包内所有类。
    导入包的原则:用到哪个类,导入哪个类
    46、jar:JAVA的压缩包。
    jar -cf 压缩包名.jar 要压缩的文件1 文件2
    jar -xvf 压缩包名.jar
    把classpath设置到压缩包,就可以直接运行压缩包里的class文件了,这就是驾包的用处之一。

    相关文章

      网友评论

          本文标题:Java学习笔记

          本文链接:https://www.haomeiwen.com/subject/kpqkcxtx.html