文章目录
- Java语言特点
- JVM、JRE和JDK的关系
- 什么是字节码?采用字节码的好处是什么?
- 面向对象
- 面向对象的三大特征:封装,继承,多态
- 关键字
- 抽象类和接口特点和区别
- ==和equals的区别
- String、StringBuffer、StringBuilder
- 异常
Java语言特点
Java是sun公司在1995年提出一门高级编程语言,Java之父是詹姆斯高斯林,Java语言特点:简单易学,可靠安全,跨平台性(通过Java编写的应用程序在不同的系统平台都可以运行,在Java应用程序的操作系统上安装一个JVM(Java虚拟机)即可),面向对象。
JVM、JRE和JDK的关系
JDK中包含JRE和Java开发工具(编译工具、打包工具),JRE是Java运行环境,其中包含JVM和Java核心类库
什么是字节码?采用字节码的好处是什么?
在Java中,JVM可以解释的代码就叫字节码(.class文件),他不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
java程序从源代码到运行过程如下:
.java—>javac编译—>.class—>解释器&JIT—>机器可理解的代码—>电脑执行
.class到机械码这一步中,JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度相对比较慢。
面向对象
面向对象即OOP是一种编程思想,对象在我们生活中处处都存在,比如说把大象装进冰箱里,如果是面向编程的话,我们有三个流程,第一步将冰箱门打开,第二步把大象装进冰箱,第三步关闭冰箱门,但是在面向对象思想中,人是一个对象,大象是一个对象,冰箱也是一个对象,在冰箱对象中可以有,开门关门两个方法,在大象对象中可以有大象进入冰箱方法,然后在人这个对象中,人可以控制,冰箱对象和大象对象,在java中万物皆对象,面向对象两个要素:类(对一类事物的描述,是抽象的),对象(是实际存在的,该类事物的每个个题),设计类的话有,属性,方法。
面向对象的三大特征:封装,继承,多态
封装就是将不同的功能抽取出来方便调用,减少大量代码的冗余;说到封装性,就提到了private关键字,private用来定义属性和方法只能由本类进行调用,封装性体现的是将属性私有化,同时提供公共的get和set方法来对属性获取和操作,类的内部数据操作自己完成,不允许外部干涉,进对外暴露部分少量的方法便于调用,简单点说就是将该隐藏的隐藏起来,该暴露的暴露出来,只对外公开简单的接口,便于外界调用。
继承的作用就是减少了冗余代码,让子类与父类之间产生关系,为多态打下基础;子类可以继承父类,然后子类就会拥有父类中的属性和方法,private修饰的不能直接调用,子类可以重写父类中的方法,一个类可以被多个子类调用,一个类只能有一个父类,直接父类、间接父类都可以获取其中的结构。
多态就是一个接口,多种方法,通过继承实现不同的对象调用相同的方法,进而有不同的行为;多态就是一个事务多种形态,对象的多态性就是可以new一个对象子类,多态使用时,当调用子父类同名同参的方法时,实际执行的是子类重写父类的方法,不能调用子类特有的方法。
关键字
static:
static关键字是静态的,用来修饰属性、方法、代码块、内部类;修饰属性时为静态属性(静态变量),当创建类的多个对象时,多个对象共用一个静态变量,一个对象中对这个静态变量进行了修改,其他对象中的也会修改,静态变量会随着类加载而加载,可通过类进行调用,静态变量要早于对象的创建,由于类只会加载一次,则静态变量也只存在一份,存在方法的静态域中,在静态方法中,只能调用静态方法和静态属性,非静态方法不能调用非静态方法和属性。
final:
final关键字可以用来修饰类、方法、变量。当用来修饰类时,此类不能被其他类继承;用来修饰方法时,此方法不可以被重写;用来修饰变量时,这时这个变量就相当于一个常量,也就是被final修饰的变量不能被修改,static final 用来修饰属性的话就是全局常量。
abstract:
abstract关键字可以用来修饰类、方法,用来修饰类的话这个类就是抽象类,抽象类不能被实例化;修饰方法的话为抽象方法,抽象方法只有方法的声明,没有方法体,抽象方法的类一定时抽象类,反之抽象类中是可以没有抽象方法的,若子类中重写了父类中所有的抽象方法,则子类可以实例化。
Interface:
接口和类是两个并列结构,在创建接口时,只能定义全局常量和抽象方法(jdk7及以前),定义静态方法和默认方法(jdk7之后),接口中不能定义构造器,意味着不可以实例化。
抽象类和接口特点和区别
**共同点:**都不能被实例化,都可以包含抽象方法,都可以有默认实现方法(jdk8可以用default关键字在接口中定义默认方法)
区别:
① 接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码的复用,强调的是所属关系。
② 一个类只能继承一个类,但是可以实现多个接口。
③ 接口中的成员变量只能是public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认default,可在子类中被重新定义,也可被重新赋值。
==和equals的区别
一个是运算符,一个是方法;
**
==
:**可以使用在基本数据类型和引用数据类型中,如果对象是基本数据类型,则比较的是数值是否相等,如果是引用数据类型,则比较的是对象的地址是否相等
**
equals()
: **只能用于引用数据类型,在Object类中,方法equals与==的功能是相同的,都是判断对象的地址是否相等,但是像String、Date、File等包装类中都是重写了equals方法,重写后就是用来比较两个对象的内容是否相同。
String、StringBuffer、StringBuilder
共同点:
底层都是使用char[]存储
不同点:
String是不可变的字符序列
StringBuffer可变的字符序列,底层是可扩容的数组,当需要追加数据时,底层的数组长度不够时,它会再创建一个扩容后的新数组,然后将原来的数据复制过去,然后再在新数组后面追加,线程安全的,效率低
StringBuilder可变的字符序列,jdk5新增的,线程不安全,效率高
异常
在程序运行过程中一般有两种异常事件,Error,Java虚拟机无法解决的问题,Exception:编程错误等可以针对性代码处理,两种处理方式,try-catch-finally,将可能出现问题的代码包装起来,在执行过程中一旦出现异常就去与catch进行匹配,然后进入相应的catch进行处理,一般子类在父类之上,finally是不管有无都会运行finally里面的东西;throws+异常类型处理,写在方法声明处,如果代码执行出现异常直接抛出,还可以通过throw手动生成一个异常