@1228205642qq.com JAVA基础总结
这是一篇关于自己的JAVA学习的总结
2020年三月,到了自己找实习的时间了,本以为自己在实验室做过一个项目,应该还可以。本着初生牛犊不怕虎的心态毫无准备地面试了京东JAVA实习生,一个个java基础问题下来我发现自己好像什么都不懂。(PS:我在某C9之下的985大学学的信息安全专业)
**
什么是JAVA
**
我们都知道JAVA是一门纯面向对象语言,一门解释型语言。
纯面向对象: java中除了基本类型外所有类型都是类。有时候我们看不懂代码的时候回头想想这句话,有些东西比如注解啊什么的,不理解的东西至少我们能知道它就是一个类。
解释型语言:什么是解释型语言呢?我们这里又会涉及到编译型语言的区别。我们要理解的是给人看的代码机器看得懂吗?答案是看不懂,所以代码肯定会有一个转换成机器码的过程。编译型语言(如C/C++)执行过程是 源代码----->可执行的二进制代码,
而解释型语言(JAVA/PYTHON)是 源代码——>编译器——>字节码(.class文件)——>JVM执行。 所以有了虚拟机,我们的java代码就能做到一次编译到处执行了。至于jvm,我会在之后的文章中更新。
JAVA的特性
抽象、封装、继承、多态
封装指的是隐藏实现的细节和属性,对外提供修改属性的接口。如何解释封装又是一片文章了,大家可以自行去查找相关解释。
继承:这个就不用说了吧。。
多态:多态的概念是不同对象对同一消息做出的不同行为。大家可以去看看其他文章讲多态与方法的重写与重载
JAVA——单继承多实现
java只支持单继承,也就是说一个类最多只能继承一个类,但是可以通过实现多个接口来达到多继承的效果(面试题可能会考:java如何实现多继承?)
接口和抽象类
这个是常考的面试题了,接口满足的抽象类的定义。但是接口和抽象类还有一下区别
1.格式上 接口是public修饰 抽象类默认是default。
2.都不能被实例化,子类或实现类都必须重写抽象方法才能被实例化。
3.抽象类的变量默认为default,也可以定义为public,可以被子类覆盖或重新定义。而接口中的变量是常量即 public static final 修饰的。
抽象类没有接口那么常用,接下来说一下接口的知识:
1.接口的变量是常量。
2.java8之后接口中允许定义默认方法(default)和静态方法。
3.java9之后可以定义私有方法。
插播一小点GC
垃圾回收器回收一个对象前先调用了该对象的finalize()方法。
final、finalize、finally区别
final:是一个关键字,被final修饰的变量是常量,被final修饰的方法不可被重写,被final修饰的类不可被继承(final把它断子绝孙了嘿嘿)
finalize:是Object的一个方法,见上文,看过别人对finalze的调查,实际上这个方法没什么卵用(对于我这种水平的five来说)。
finally:用在try catch语句之后的声明被finally包裹的代码块不管有没有捕获异常都会被执行。 1.如果try/catch中有ruturn,则会在ruturn之前执行finally语句块。
2.如果try中有ruturn,则会覆盖try/catch中的ruturn。
ps:finally不被执行的情况有哪些呢?
第一种是 没有执行try代码块
第二种是在try/catch中使用System.exit(0) 强制退出
重写与重载
重写:发生在子类和父类之间,参数列表、返回值都必须相同,只有方法中的逻辑不同。
重载:只有方法名相同,即一个类中可以有多个同名的方法,但是根据参数可以选择不同 的方法来处理。
JAVA初始化顺序
三个原则:1.静态变量先于非静态变量
2.父类先于子类
3.成员变量先于方法(包括构造方法)
初始化顺序在学习了JVM之后会更能理解,现在就先背一背三个原则吧
作用域和可见性
private:当前类
default:当前类、当前包
protect:当前类、当前包、子类
public:当前类、当前包、子类、其他包
ps:子类只能继承父类的非私有方法和成员变量:public、protect
java文件
这道题笔试常考:一个java文件中可以有多个类(class)、但是只能由一个类被public修饰且类名与文件名相同。
clone()方法
当我们想创建一个副本的时候,可以调用clone()方法,赋值一个对象。当然,被赋值的对象必须实现cloneAble接口并且重写clone()方法。这里又牵扯到深复制和浅复制的区别。看下图
内部类
有四种:1.静态内部类 2.成员内部类 3.局部内部类 4.匿名内部类
内部类不太常考,也不太常见,但还是要了解,至少看到的时候知道这是什么。
静态内部类:顾名思义,就是在类中还有一个static class 。。。{};
成员内部类:比静态内部类少了个static
局部内部类:在某类的方法中的 class 。。。{}
匿名内部类:必须实现一个接口或继承一个父类。
匿名内部类越来越少见了,我就没有深入研究了,有兴趣的小伙伴可以研究一下。
接下来讲一下static
1.静态变量:被static修饰的变量在类被加载时,会分配内存空间。分配到哪里呢?在jvm运行时数据区的方法区中的常量池中。因为被分配内存了,所以我不需要创建这个对象就可以访问这个类的该变量。
2.静态方法:同理,静态发发可以直接访问无需创建对象。
3.static:可以用来实现单例模式。单例模式:隐藏构造方法,提供静态方法获取类的实例。即全局只有一个该单例对象。
4.内部类可以被static修饰。
上述是static的用途。static又涉及到类的加载过程,又牵扯到JVM,所以说JVM是学习java的核心。