Java基础包括基本类型,面向对象,数组,重载,重写,访问修饰符,关键字
JAVA8大基本类型
- byte
- short
- int
- long
- float
- double
- char
- boolean
Java面向对象的特征
面向对象的四个基本特征是:封装,继承,多态和抽象。
封装:封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。
封装的好处:
-
通过隐藏对象的属性来保护对象内部的状态。
-
提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。
-
禁止对象之间的不良交互提高模块化。
继承:继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的可重用性,也可以在不修改类的情况下给现存的类添加新特性。
多态:多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。
抽象:抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象类。这种抽象技术的主要目的是把类的行为和实现细节分离开。
Java中的访问修饰符
访问权限控制
访问权限控制的对象
-
类的访问控制
-
类成员的访问控制
访问权限修饰符(四种):
Public
Protected
默认
Private
类的访问修饰符
Public修饰符:公有访问级别,java项目下的包都可以使用(任何地方),公有访问级别;
默认修饰符:包级私有访问级别。只有同一个包里的可以访问,其他包的就访问不了。
四种访问权限的区别
作用域 修饰符 | 同一个类中 | 同一个包中 | 子类中 | 任何地方 |
---|---|---|---|---|
Private | 可以 | 不可以 | 不可以 | 不可以 |
默认修饰符 | 可以 | 可以 | 不可以 | 不可以 |
Protected | 可以 | 可以 | 可以 | 不可以 |
Public | 可以 | 可以 | 可以 | 可以 |
方法重载和方法重写
重载:
-
必须具有不同的参数列表,和返回值无关。
-
存在于父类和子类、同类中。
-
可以有不同的返回类型,只要参数列表不同就可以。
-
可以有不同的访问修饰符,可以抛出不同的异常。
重写:
-
参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
-
返回类型必须与被重写的方法返回类型相同,否则不能称其为重写而是重载。
-
不能缩小重写方法的访问修饰符。
-
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
-
存在于父类和子类之间。
方法被定义为final不能被重写。
抽象类和接口有什么区别
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的;而抽象类是可以有私有方法或私有变量的,另外,实现接口就一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承。
final,finally,finalize的区别
-
final:修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
-
finally:在异常处理时提供 finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入finally块。
-
finalize是方法名:Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。 这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
异常
异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。
Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。
多态
-
理解多态性:可以理解为一个事物的多种形态。
-
何为多态性:
对象的多态性;父类的引用指向子类的对象(或子类的对象赋给父类的引用)
-
多态的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译,看左边;运行,看右边;
-
多态性的使用前提:
- 类的继承关系
- 方法的重写
-
对象的多态性,只适用于方法,不适用与属性(编译和运行都看左边)
多态是编译行为还是运行时行为
运行时行为
==和equals的区别
- ==既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址。
- equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
- 具体要看自定义类里有没有重写Object的equals方法来判断。
- 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。
实例方法和静态方法的区别
-
加载周期不同
静态方法比实例方法早加载到内存中,jvm方法区(静态区)
-
调用方式不同
静态方法可以使用类名.静态方法名的方式直接调用
实例方法必须通过实例对象.方法名调用
-
实例方法可以直接访问静态成员,静态方法无法直接访问实例成员
-
实例方法中可以使用对象专属this、super关键字指向调用对象本身、父类
synchronized关键字的作用是什么
Java 中关键字 synchronized 表示只有一个线程可以获取作用对象的锁,执行代码,阻塞其他线程。
作用:
- 确保线程互斥地访问同步代码
- 保证共享变量的修改能够及时可见
- 有效解决重排序问题
用法:
- 修饰普通方法
- 修饰静态方法
- 指定对象,修饰代码块
特点:
- 阻塞未获取到锁、竞争同一个对象锁的线程
- 获取锁无法设置超时
- 无法实现公平锁
- 控制等待和唤醒需要结合加锁对象的 wait() 和 notify()、notifyAll()
- 锁的功能是 JVM 层面实现的
- 在加锁代码块执行完或者出现异常,自动释放锁
原理:
- 同步代码块是通过 monitorenter 和 monitorexit 指令获取线程的执行权
- 同步方法通过加 ACC_SYNCHRONIZED 标识实现线程的执行权的控制
基础题
下列说法正确的有( BCD )
A. 环境变量可在编译source code时指定
B. 在编译程序时,所能指定的环境变量不包括class path
C. javac一次可同时编译数个Java源文件
D. javac.exe能指定编译结果要置于哪个目录(directory)
JAVA中,下列语句哪一个正确( C )
- class中的constructor不可省略
- constructor必须与class同名,但方法不能与class同名
- constructor在一个对象被new时执行
- 一个class只能定义一个constructor