Java基础知识

Java语言的特点

  • 简单易学
  • 是一门面向对象的语言(封装、继承、多态)
  • 平台无关性(JAM的存在,可以让Java代码编译后的字节码文件在不同的平台上运行)
  • 支持多线程
  • 安全性、可靠性
  • 支持网络编程并且十分的方便
  • 编译与解释并存
    “Write once,run anywhere” 一次编译处处运行,这一句话对于Java程序员来说是广为流传的。但是就目前的形式的来看,跨平台已经不是Java语言的卖点了,比如Docker就很容易实现跨平台了,Java强大的生态圈才是它的卖点,没有任何语言能与它媲美。

JDK、JRE、JVM的区别

JDK

JDK是Java Development Kit的缩写,它是功能齐全的Java SDK,它包含了JRE的全部,同时还有编译器(javac)和工具。可以创建和编译程序。

JRE

JRE是Java Runtime Enviroment的缩写,它是运行已经编译好的java文件所有的内容的集合,里面包含了JVM、java类库、java命令和其他一些基础组件,但是它不能用户创建新的程序。

JVM

JVM是Java Vritual Machine的缩写,Java虚拟机。JVM针对于不同的平台有不同的实现,目的就是使Java程序编译之后的字节码文件可以在不同的平台进行运行且运行的结果是相同的。
JVM并不是只有一种,只要满足JVM规范,就可以开发出自己专属的JVM。

字节码文件使什么?采用字节码文件有什么样的好处?

在Java种,JVM可以理解的文件就是字节码文件(即以.class结尾的文件),它不面向任何特定的处理器,只面向JVM。字节码文件的使用可以提高程序的执行效率。

Java文件执行过程

在这里插入图片描述

为什么说Java语言是“编译与解释并存”的

因为Java程序的运行需要需要进行两个过程:

  • javac 编译成字节码文件 这一步就是编译
  • JMV 识别字节码文件 这一步就是解释

Oracle JDK 与 Open JDK

  • Open JDK 是完全开源的,而Oracle JDK是Open JDK的一个实现,并不是完全开源的。
  • Oracle JDK 比Open JDK更稳定、性能更好。

Java与C++的区别

Java语言与C++语言都是面向对象的语言,支持封装、继承和多态。
不同点:

  • Java语言不使用指针能访问内存,比较的安全。摒弃指针对于程序员来说是比较友好的。
  • Java是单继承的,但是可以多实现。Java中的interface可以多继承interface
  • Java语言有自动回收垃圾的机制(gc)
  • C++语言可以实现方法重载和运算符重载,Java语言只能实现方法重载

标识符与关键字

标识符

在我们编写java程序的时候,需要给类、变量、方法、接口等取一个名字,那么这个名字就称为标识符。

关键字

在java语言中,一些标识符被赋予了特定的含义,那么这个标识符就称为关键字。

java中的关键字

在这里插入图片描述

自增自减运算符

自增:++
自减:- -
运算符的位置不同那么结果也不同,如果是在变量的前面,那么是先自增或自减,再运算;如果是在变量的后面,那么是先运算,再自增或自减。

public static void main(String[] args) {
        int a,b,x,y;
        a=b=x=y=0;
        /*
        System.out.println(a++); //a=1
        System.out.println(++x); //x=1
        System.out.println(b++); //b=1
        System.out.println(++y); //y=1
         */
        int c = (a++)+(b++);
        System.out.println(c+" "+b+" "+b);//c=0,a=1,b=1

        c = (++x)+(++y);
        System.out.println(c+" "+x+" "+y);//c=2,a=1,b=1
    }

移位运算符

在计算机的底层都是01机器码,所以通过移位运算可以提高计算机的运行效率。

  • >> 右移 最高位补符号位,右移一位相当于缩小到原来的一半
  • << 左移 左移一位相当于扩大到原来的两倍
  • >>> 无符号右移 和>>一样,不过最高位是直接补0
    Java语言只支持char、byte、int、short、long进行移位运算,对float和double不支持。

continue、break和return的区别

  • continue:结束当前的这一次循环,进入到下一次循环
  • break:结束整个循环体、进行循环体下面的代码
  • return:return;用于没有返回值函数的调用结束函数、return object;用于有返回值的函数调用结束函数。

变量

成员变量与局部类变量区别

  • 语法形式上:成员变量是属于类的,局部变量是在代码块或者是方法中的变量或者是参数。成员变量可以被private、public、protected、static进行修饰,但是局部变量是不可以的。成员变量和局部变量都可以被final修饰。
  • 存储方式:如果成员变量是被static进行修饰的,那么就意为着这个变量是属于这个类的,否则的话是属于这个类的实例对象的。对象是存储在堆内存中的,所以成员变量是存在于堆内存中的,局部变量是存在于栈内存中的。
  • 生存时间:成员变量是存在对象中的,随着对象的创建而产生;而局部变量是随着方法的调用而产生,随着方法的调用结束而消亡。
  • 默认值:成员变量是有默认值的,如果没有显示的赋值,会以类型的默认值赋值,局部变量没有默认值。(final修饰的变量必须显示的赋值,这是一种特殊的情况)

静态变量有什么作用

静态变量是被所有的类的实例共享的,无论一个类创建了多少个对象,它们都共享同一份静态变量。通常情况下,静态变量会被final修饰称为常量。

字符常量和字符串常量有什么区别

  • 形式:字符是由一个单引号引起来的,字符串常量是由一个双引号引起来的。
  • 含义:字符常量是一个整数(0-127 ASCII),可以进行运算。字符串常量是一个地址(这个地址指向字符串在内存中的位置)。
  • 大小:字符常量在java语言种占两个字节,较其他语言比较特殊。字符串常量占若干字节。

静态方法为什么不能调用非静态方法

  • 静态方法是属于类的,在类加载的时候就会分配内存,可以直接通过类名进行调用。非静态方法是属于实例的,创建实例后才分配了内存,因此需要实例去调用。
  • 类加载的时候静态方法就已经存在了,此时非静态方法还不存在,如果静态方法调用非静态方法就属于非法操作了。

静态方法和实例方法有什么区别

  • 调用方式:在调用静态方法的时候可以使用 '类名.方法’和’对象.方法‘进行调用,实例方法只能通过后面一种方式进行调用。但是不提倡使用’对象.方法‘来调用静态方法,因为这样比较容易混淆且静态方法是不属于实例的。
  • 访问控制:静态方法在使用的时候,只能调用静态成员(方法和变量),实例方法不存在这样的限制。

重载和重写的区别

  • 重载是发生在一个类中。函数名相同,参数的类型、个数、位置不同都是可以构成重载的,但是返回值类型不同不可以构成重载。发生在编译时期。
  • 重写是发生在子类中,函数名、参数名、个数和父类一样。对父类的方法进行重写、覆盖。重写的时候需要注意两点,子类的权限访问修饰符要大于等于父类,返回值的类型和抛出的异常需要小于等于父类。如果父类的方法是private进行修饰的,那么这个方法是不能被子类重写的。发生在运行时期。

Java的基本数据类型

Java中的8中基本数据类型

  • 数值类型6种
    • 整型:byte、short、int、long
    • 浮点型:float、double
  • 字符型
    • char
  • 布尔型
    • boolean

基本数据类型的大小和默认值

  • byte:1个字节,默认值0
  • short:2个字节,默认值0
  • int:4个字节,默认值0
  • long:8个字节,默认值0L(long在进行赋值的时候,需要在后面加上L,否则的话就会当作整型)
  • float:4个字节,默认值0f
  • double:8个字节,默认0d
  • char:2个字节,默认’u0000‘
  • boolean:具体几个字节官方没有定义,需要依赖于JVM的实现,默认false。

基本类型和包装类的区别

  • 包装类的默认值是null,基本类型的默认值不是null。
  • 包装类可以当作泛型,基本类型不可以当作泛型。
  • 不考虑static的话,基本数据类型的局部变量存放栈内存中,基本数据类型成员变量存放在堆内存中。所有的包装类都是存放在堆内存中。
  • 基本数据类型相较于包装类所占的空间更小。

包装类的缓存机制

float和double的包装类没有缓存机制。
Byte、Short、Integer、Long默认都创建了[-128,127]的缓存,Character默认创建了[0,127]的缓存,Boolean直接返回false或者是true。如果超出了缓存的范围就会创建新的对象,缓存的大小只是在资源和性能之间的权衡。

自动拆箱与装箱

  • 装箱:将基本数据类型使用它的包装类包装起来。调用包装类的valueOf()方法
  • 拆箱:将包装类型变为它的基本类型。调用xxxValue()方法。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值