Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java语法 #5

Open
huangchucai opened this issue Jan 7, 2019 · 0 comments
Open

Java语法 #5

huangchucai opened this issue Jan 7, 2019 · 0 comments

Comments

@huangchucai
Copy link
Owner

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中返回值是读入的字节数
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant