Java学习笔记

0, Java四大名著:

Java编程语言(第三版)---Java四大名著----James Gosling(Java之父)

 Java编程思想(第4版)----Java四大名著----------------Bruce Eckel

JAVA 2核心技术 卷I:基础知识---Java四大名著-----Cay Horstmann

JAVA 2核心技术 卷II:高级特性---Java四大名著-----Cay Horstmann

Effective Java中文版------Java四大名著--------Joshua Bloch

1, 第一个Java项目容易遇到的问题排查:

1、你的文件名对吗?
JAVA要求你的文件和你的类名严格对应的。
比如 public class HelloWorld{ .....
那么文件名一定只能是HelloWorld.java,看仔细了!

2、你的程序中有main方法吗?参数什么的对吗?
main方法的声明应该是这样子的:
public static void main(String[] args),注意String中的S必须是大写的。
事实上如果你用开发工具来做的话,是不会错的。如果你用UltraEdit之类的来写程序的话,就一个字不要改的照抄吧!

3、记住,javac后面跟的参数是文件名,但java 后面跟的是类名!
这是我开始学JAVA是犯的错,java HelloWorld.class,然后就报错。后来才弄明白,应该是java HelloWorld。

4、设置了classpath了吗?【jdk6以及以后的版本都不用再配CLASSPATH,而且也不建议去配】
不仅是在安装JDK时要设置的内容,一般来说最好还要自己设置一个目录来存放自己的类文件的。比如d:class目录。
设置classpath=%classpath%;d:class
那么,现在将HelloWorld.class文件COPY到d:class目录下,再java HelloWorld应该就OK了。

5、结合第3点和第4点
如果你的类是属于某一个包的,比如这样一个类sony.test.HelloWorld,那么按照我在第4点中说的目录来说,就应该将HelloWorld.class文件存放到d:classsony est目录下。
执行的时候应该参考第3点中说的,按类名执行:java sony.test.HelloWorld。

6.  安装jdk时会有两个jre文件夹。外部的jre是公共的java运行环境,jdk文件夹内的jre是私有的java运行环境,intellij idea工具依赖的是jdk/jre私有的java运行环境。

7. 运行java Class 命令时,具体用到的是d:/jre/bin/java.exe还是d:jdk/bin/java.exe 应该是看机器环境变量Path配置的先后顺序。Path寻找是按照配置的先后顺序逐个找的,找到了就不继续找了,所以哪个在前用的就是哪个。

8.  win10中 配置了环境变量javac,jar等命令依然提示找不到:将jdkin路径配置成绝对路径就好了。

9.

2,反编译Java的class文件

1,使用 cfr  进行反编译class文件。

2,  cfr其实就是一个jar包,以正常的java -jar就能运行,然后传入指定的class文件。如:java -jar path/to/cfr_0_146.jar xxx.class

3, 其后可以指定一些参数。java -jar path/to/cfr_0_146.jar xxx.class  --sugarenums false //这个参数是将enum类的语法糖解开,不加这个参数反编译的enum的class文件和源文件差不多,依然是还有语法糖的,加了这个参数就可以把enum的语法糖去掉。很有用!

4, 可以使用--help 查看各个参数的介绍。 java -jar path/to/cfr.jar --help

5,一个例子:

源文件:

enum RGB {
    RED, GREEN, BLUE;
}

反编译后的代码:

final class RGB
extends Enum<RGB> {
    public static final /* enum */ RGB RED = new RGB("RED", 0);
    public static final /* enum */ RGB GREEN = new RGB("GREEN", 1);
    public static final /* enum */ RGB BLUE = new RGB("BLUE", 2);
    private static final /* synthetic */ RGB[] $VALUES;

    public static RGB[] values() {
        return (RGB[])$VALUES.clone();
    }

    public static RGB valueOf(String string) {
        return Enum.valueOf(RGB.class, string);
    }

    private RGB(String string, int n) {
        super(string, n);
    }

    static {
        $VALUES = new RGB[]{RED, GREEN, BLUE};
    }
}

3,[Ljava.lang.Object    Java中的这个符号什么意思?【参见此文章

[Ljava.lang.Object;是名称Object[].classjava.lang.Class表示的类的阵列Object

命名方案记录在Class.getName()

如果此类对象表示不是数组类型的引用类型,则返回类的二进制名称,如Java语言规范(第13.1节)所指定。

如果此类对象表示基本类型或void,则返回的名称是与基本类型对应的Java语言关键字void

如果此类对象表示一个数组类,则名称的内部形式由元素类型的名称组成,前面是一个或多个'['表示数组嵌套深度的字符。元素类型名称的编码如下:

Element Type        Encoding

boolean             Z

byte                B

char                C

double              D

float               F

int                 I

long                J

short               S 

class or interface  Lclassname;

[Ljava.lang.Object   是这个名单上的最后一个, [ 表示一维数组。这里有些例子:

// xxxxx varies

System.out.println(new int[0][0][7]); // [[[I@xxxxx

System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx

System.out.println(new boolean[256]); // [Z@xxxxx


4,记录一个Java反射应用的例子

public class HighChinese {
    // 这里每次启动程序时是变化的,需求就是根据这个变量的值确定调用的方法。
    private static Integer rule = 1;

    public static void convert() {
        String methodName = String.format("method%s", rule);
        /**
         * getDeclaredMethod 第一个参数是方法名,第二个参数是方法的所有参数的类型,是个Class数组
         * getDeclaredMethod 返回自定义方法,getMethod 返回所有方法
        */
        Method method = HighChinese.class.getDeclaredMethod(methodName, new Class[]{B.class, C.class, D.class});

        /**
         * invoke 方法第一个参数是 方法所在的实例,如果方法是静态的,则第一个参数设为 null
         * 后面的参数即是调用的方法的参数。
        */
        method.invoke(null, b, c, d);
    }

    public static void method1(B b, C c, D d) {}
    public static void method2(B b, C c, D d) {}
    public static void method3(B b, C c, D d) {}
}

5,两层for循环,用break跳出的是只是最近的一层, 用return则是“跳出”两层

6,

7,

8,

9,

10,

原文地址:https://www.cnblogs.com/everest33Tong/p/10320294.html