huangchucai/BEE-blog

Java语法

huangchucai opened this issue · 0 comments

Java语法

一. 编译

  • Java编译器(javac):把我们平时写的*.java的文件,编译成*.class(是一种特殊的二进制文件)

    // 会生成一个hello-world.class文件
    $ javac hello-world.java  
  • 字节码:字节码是已经经过编译,但是并不是特定的机器码的一种中间代码。需要解释器转译后才能成为机器码

  • Java解释器: 是JVM中的一部分,用来把字节码转译成机器码来执行程序。

  • JVM(Java虚拟机)

    1. JAM有自己的完善的硬件架构,如处理器,堆栈,寄存器等。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可以在不同的平台不加修改地运行。由于JVM可以适应不同的操作系统(只需要安装对应的JVM到不同的操作系统上),所以这就成就了Java可以适应在不同的操作系统上。
    2. JVM只负责运行字节码: JVM把每一条要执行的字节码交给解释器翻译成对应的机器码,然后由解释器执行
  • 环境和问题

    1. 安装Java程序和配置环境变量

      export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home
      export PATH=$JAVA_HOME/bin:$PATH
      export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    2. java命令就在CALSSPATH目录下找对应的class文件

      // 会在CLASSPATH目录下寻找HelloWorld.class文件
      java HelloWorld
      
      // 会在CLASSNAME找hcc目录,然后再到hcc目录上面找Text.class文件
      java hcc.Test
    3. 如果配置错误,例如CLASSPATH漏了".:",那么就不会再当前目录查找了

      java -cp . HelloWorld

    参考链接

    1. JAVA类找不到主类

二. 数据类型

2.1 基本数据类型

  • 六种数据类型: byte short int long float double ,主要是取值范围和所占内存的区别,90%的情况下都是用int/long

  • 字符类型: char

    注意: 1. char和String的区别,char是单引号,一个字符

  • 布尔型 true/ false

总结: 8种基本类型对应的包装类(Integer Long Short Byte Double Float Character Boolean)这些包装类都存放在java.lang.xxx

  • 相互转换

    # 1. int to String  (n is int)
    String s = String.valueOf(n);
    String s = Integer.toString(n)
    String s = "" + n

2.2 引用数据类型

  • 对象和数组

三. 修饰符

Java中修饰符的作用主要有两种,一种访问修饰符(用来控制权限),一种用来控制非访问修饰符(比如值是否可以修改,访问的方式,是否可覆盖)

3.1 访问权限方面
  • 类内可访问
  • 包内可访问
  • 子类可访问
3.2 变量的修饰符

Java 的变量分为2中,类变量(实例的属性)和方法变量,方法内的变量只能用一种修饰符final表示常量,不能更改,下面主要讨论类变量

  • 访问权限的控制(public, protected,private,default

    public String publicString = "public";
    protected String protectedString = "protected";
    private String privateString = "private";
    String defaultString = "default";
    `
    public: 任何地方都可以访问,对访问类变量无限制
    protected: 同一个包内可以访问,或者不同包的子类访问
    private: 同一个类内可以访问
    默认(default): 同一个包内可以访问
    `
  • 非访问修饰(static final

    class Test {
        static String staticString = "static";
    	final String finalString = "final"
    }
    `
    static: 静态变量,就是可以不实例就可以访问,例如 Test.staticString, 但是也实例也可以访问,Test test = new Test() test.staticString但是不推荐实例访问
    final: 常量,一旦赋值了就不能修改,对象的指针不能被改变
    `
3.3 方法修饰符
  • 访问权限的控制(public, protected, private, default):功能与类变量的一样

    // 关于方法的修饰符
    public void printPublic() {
        System.out.println("public method")
    }
    protected void printProtected() {
    	System.out.println("protected method")
    }
    private void printPrivate() {
        System.out.println("private method")
    }
    void printDefault() {
        System.out.println("default method")
    }
  • 非访问控制的(static, final, abstract

    static void printStatic() {
        System.out.println('static method')
    }
    final void printFinal() {
        System.out.println('final method')
    }
    abstract void printAbstract() {
    }
    `
    static: 和类变量的功能一样,类可以直接调用
    final: 表示在继承的关系中,这个方法不能被子类覆盖重写
    abstract: 指定子类必须实现的方法
    `
3.4 构造函数的修饰符(只有访问权限的修饰符)
  • 访问修饰符

    class Test {
        public Test(){
    
        }
        protected Test(int i){
    
        }
        private Test(int i,int j){
    
        }
        Test(String string){
    
        }
    }
    `
    private: 用来修饰构造函数的时候,其他类不能通过new的方式来获取实例,能够有效的控制创建行为
    `
3.5 类修饰符
  • 只有4种public default abstract final

    // public,默认,abstract,final。
    public class Test1 {}
    class Test2{}
    abstract class Test3{}
    final class Test4{}
    `
    abstract:表示该类为一个抽象类,不能实例化该类,即不能使用Test3 test3 = new Test3();的方式获取Test3的实例。
    final:表示该类不能被子类继承,该类即为最终类,不可再被继承
    `

四. I/O

4.1 名词解释
  • 内外: 在电脑上的数据有三种储存方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的,外存的存储量是最大的,其次是内存,最后是缓存,但是外存的数据读取也是最慢,其次是内存,缓存最快,所以我们从外存读取数据到内存以及将数据从内存写到外存中。
  • 输入流(Input Stream): 程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道
  • 输出流(Output Stream):程序向输出流写入数据。将程序中的数据输出到外界(显示器,打印机,文件,网络)
  • 流:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。
4.2 数据流分类

流中的数据主要是分为2类,一类是未经过加工的原始二进制数据,一类是经过一定编码处理后符合某种格式规定的特定数据。

字节流:数据流中最小的数据单元就是字节。

  1. InputStream 输入
    • System.in
    • FileInputStream
  2. OutputStream 输出
    • System.out
    • FileOutputStream
  3. BufferedInputStreamBufferedOutputStream
  4. Stream用于直接处理字节

字符流: 数据流中最小的数据单元是字符。Java中一个字符占用2个字节。例如:InputStreamReader中的read(char[]);

  1. Reader : 把字节转换成字符,图片,音乐
    • InputStreamReader (FileReader)
    • BufferedReader(bufferedReader.readline())
  2. Writer: 把字符转换成字节然后再转换成stream存入设备
    • OutputStreamWriter (FileWriter)
    • BufferedWriter(bufferedWriter.write(String))
4.2 实例
  • java系统自带的标准数据流:java.lang.System

  • 输出流(System.out): 向标准输出设备输出数据。

    1. 数据类型为PrintStream

    2. 方法

      Void print(参数)
      Void println(参数)
  • 输入流(System.in): 读取标准输入设备数据(从标准输入获取数据,一般是键盘)

    1. 数据类型为InputStream

    2. 方法

      int read() //返回ASCII码。若,返回值=-1,说明没有读取到任何字节读取工作结束。
      int read(byte[] b) //读入多个字节到缓冲区b中返回值是读入的字节数