一、Java基础语法

1.参数传递

void change(String s, Integer x, Double f, ArrayList<Integer> list, Node node, char[] a);

  • 前三个是传值调用,方法里修改形参不会对原来的值造成影响;
  • 后三个是引用调用,方法里修改形参会对原来的值(地址中的值)造成影响;

2.静态变量能否用this调用?

在语法上行得通,但是静态变量是所有实例共享的一个变量,而this通常指当前对象;用对象名调用普通变量,用类名调用静态变量更加直观。许多题目把this调用直接打死,按它们的来。

3.形参引用

静态变量或普通变量a和方法形参a同名,不论类型是否相同,在方法里都是优先使用形参。方法里形参是老大,所以set方法形参同名需要加上this,不同名可以不加this。

4.初始化二维数组

不一定按照n*m矩阵来初始化

int[][] a=new int[][]{ {1,2},{3,4,5,6,7},{1},{33},{21,352} };

a.length=5;a[0].length=2;a[1].length=5;

等号左边合法的有:int[][] a、int[] b[]、int c[][];等号右边合法的有new int[5][5]、new int[5][]、{}、{{}};

5.try-catch-finally

  • try中有异常不会执行异常语句后的代码,因此有异常时try中的return作废;
  • catch,有异常才会执行,return等级>try的return;
  • finally,有没有异常都会执行,return等级>catch>try;
  • try必然要有,catch和finally至少保留一个;

(1)try和finally都没有return

  • 如果try没有异常则执行try→finally;
  • 如果try有异常,则执行try→catch→finally;
  • 并且会继续执行finally后的代码块,若是停了那就体现不出捕获异常的作用了;

如果try里有异常并且finally里又有异常,如果不捕获finally里的异常则程序终止(不会运行finally后的代码),捕获则按常理度之;

(2)try有return,catch没有return,finally没有return

由于try中异常语句后的代码不会执行,所以finally代码块后还有需要有return语句兜底;

  • 如果try有异常,执行try-catch-finally,最终返回值取finally代码块后的return;(如果catch里有return 则取catch里的,最后的return语句作废;)
  • 如果没有异常,执行try代码块就跑了,返回值取try里的;

(3)try有return,catch有return,finally没有return

  • try没有异常,返回值取try的;
  • try有异常,返回值取catch的;

finally代码块后不可以有代码,因为try或者catch会返回函数,不执行到后面;

(4)finally有return

不论try和catch有没有return,返回值都取finally里的,并且finally代码块后不允许有代码了;

(5)没有catch,有finally

无返回值时,发生异常程序终止(不会执行finally后的语句),因此catch是解决异常的关键;

6.运算&赋值

  • System.out.println( (5>4)?8:4.05 );//输出8.0
  • (short)10/10.2*2; 结果是double类型,先将10强转为short,又因为运算过程自动向上转型变成double的运算,最后结果是double类型
  • int x=20,y=5;System.out.println(x+y+""+(x+y)+y);//25255 
  • System.out.println(5+6+""+5+7);//1157 任何字符与字符串相加都是字符串,但是字符串前面的按原格式相加后拼接,字符串后面的直接按字符串拼接
  • 运算优先级:>、<、&&、||。例如b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;变成b=(x>50&&y>60)||(x>50&&y<-60)||(x<-50&&y>60)||(x<-50&&y<-60);
  • 乘除模运算优先级相同,10%3*2=1*2=2;
  • int a=1_0_2_4;数值间插入下划线这是合法的;
  • char、byte和short参与运算时会自动将这些值转换为int类型再进行运算;short a1=3,a2=4,a3;a3=a1*a2;这样会报错,但是a3=3*4;不会报错;

7.Java变量

  • 实例变量:定义在类中但不在方法里,即类的成员属性。具有默认值,数值类型默认0,布尔类型默认false,引用类型默认null,可以在声明时指定,也可以在构造方法中指定;
  • 局部变量:方法中的变量,需要先赋值再运算。不赋值直接使用会导致 编译不通过。在方法中任意写个花括号也属于一个局部,在花括号内定义的变量不能用在括号外;
  • 静态变量:类似方法,只加载一次,放在堆里,类的多个对象共享一个静态变量(方法);

8.StringBuilder、StringBuffer、String

  • 线程安全性:StringBuffer和String线程安全,StringBulider线程不安全。
  • 运行速度:StringBuilder>StringBuffer>String。

9.数组复制效率

System.arraycopy > clone > Arrays.copyOf > for循环

System.arraycopy和clone都是native方法,记一下就好。Arrays.copyOf是对System.arraycopy的调用,多了一层肯定不是最快的,for循环我都会写肯定是最慢的

10.Java程序的种类

内嵌于Web文件中由浏览器观看的Applet;可独立运行的Application;服务器端的Servlets。

11.注释与编译

注释是给人看的,不是给机器看的。编译器不会编译注释中的内容;字节码文件也没有注释内容;注释过多也不会导致编译后的程序尺寸变大。

点开一些jar包的看看字节码文件.class,发现全都没有注释,然而Java文件就有注释。

12.基本数据类型的声明

        double d0=1;//正确,输出1.0
        double d1=1.0;//正确,输出1.0
        Double d2=1.0;//正确,输出1.0
        Double d3=1;//错误;正确的是1D,输出1.0
        double d4=666.00;//正确,输出666.0

        float f1=4.0;//错误;正确的是4.0F,输出4.0
        float f2=4;//正确,输出4.0
        Float f3=4;//错误;正确的是4F,输出4.0
        Float f4=4.0;//错误;正确的是4.0F,输出4.0
        
        int i=(int)true;//错误,boolean不可以和其他类型转换

        long l1=012;//正确 0前导表示八进制,0x表示十六进制
        long l2=12;//正确
        Long l3=12;//错误;正确的是12L
        Long l4=012;//错误;正确的是012L

13.集合类的线程安全

14.构造方法

  • 构造方法没有返回值,并不是void;
  • 构造方法优先级最低;
  • 构造函数不能被继承,构造方法只能被显式或隐式的调用。

15.初始化代码执行顺序

父类静态变量→父类静态代码块→子类静态变量→子类静态代码块→

父类普通变量→父类普通代码块→父类构造方法→

子类普通变量→子类普通代码块→子类构造方法

严格的说,静态变量+静态代码块=静态域,不包括静态方法,谁先谁后根据在类中的位置,由于一般都是先声明变量的,所以有这样的总结。这里有一个难以想象的题目,十有八九会被坑,详看代码及注释,节省篇幅。

public class B {
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}


/**
 输出:
 构造块
 构造块
 静态块
 构造块
 --------------------------------------------------
 解释:
 1.加载B.class
 2.按照顺序先对t1和t2进行初始化,默认为null
 3.又需要对t1和t2进行显示初始化,所以需要加载默认的构造方法和普通代码块
 4.为什么不会加载静态代码块呢?
 5.因为刚开始加载B.class时就算是加载了静态域,现在还没加载完,又不能重复加载,所以没有在初始化t1的时候输出静态块
 6.t1和t2加载完了按顺序就轮到静态代码块了
 7.走main方法,又创建一次B对象,执行构造方法和普通代码块
 
 要点:静态域只加载一次,不能重复加载
 */
View Code

相关文章:

  • 2021-05-13
  • 2021-07-28
  • 2021-05-25
  • 2021-08-09
  • 2022-01-19
猜你喜欢
  • 2021-10-14
  • 2022-01-02
  • 2022-01-17
  • 2021-05-23
  • 2021-10-29
相关资源
相似解决方案