java知识查漏补缺
一、重写(override)和重载(overload)的区别
二者除了名字相似,其实没什么联系
范围不同:重载发生在同一个类的不同方法之间。重写发生在父类和子类自荐。
前提:
重载要求:方法名相同,参数列表不同,对于返回值类型不要求相同。
重写要求:方法名形同,参数列表也相同。重写是实现多态的关键,注意如果父类中的方法是private类型,那么子类中对应方法不算重载,而相当于是定义了一个新方法。
二、final的用法
修饰类:该类不能被继承
修饰方法:该方法不能被重写
修饰属性:该属性初始化后不能被修改
1,方法可以多态,Fields不能实现多态。
2,利用父类的引用调用子类的方法呈现子类的特征成为多态。
3,不能利用父类的引用去调用子类没有实现的方法,除非进行强制转换。
三、java实现的几种设计模式
3.1单例模式
作用:对于某些系统资源,比如可能只有一个窗口管理器等等,取消自由创建对象的系统开销。
单例类创建的注意点:
1)有一个该类的实例作为类属性。
2)构造函数为private类型
3)通过一个类方法获取类的唯一实例
package com.bobo.interview; public class Singleton { private static Singleton instance; private Singleton() { } public Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
} }
单例模式
这种有一个隐藏的问题,多线程,试想,如果两个线程同时去判断instance是否为空,那么就可能生成两个不同的对象,对此解决方法是
1)加同步锁(注意加的位置)
package com.bobo.interview; import java.util.concurrent.locks.Lock; public class SingleTon2 {
private SingleTon2 instance; private SingleTon2() { } public SingleTon2 getInstance() {
if (instance == null) {
synchronized (this) {
if (instance == null) {
instance = new SingleTon2();
}
}
}
return instance; } }
单例类实现方式1
注意,判断两次是否为空,只有再第一次生成对象的时候,才需要加同步锁。而不是每次判断为空的时候都加,从而提高代码效率
2)使用类成员变量
package com.bobo.interview; public class SingleTon3 {
private static SingleTon3 instance=new SingleTon3();
private SingleTon3(){ }
public SingleTon3 getInstance(){
return instance;
} }
基于类成员变量实现单例模式
3.2不可变类
作用:利用java.lang.String等,并且绝对线程安全
创建的注意点:
1)使用private和final修饰类的field
2)提供代参数的构造器,用户根据传入参数来初始化类的field
3)仅仅提供getter,不能提供setter
4)如果有必要,重写类的equals和hashcode方法(根据关键的field来判断)
有些情况,还可以为不可变类增添缓存。
3.3简单工厂模式
作用:“面向接口”编程,降低耦合。
第一步:定义接口
package com.bobo.desing; public interface Output {
int MAX_CHCHE_LINE=;
void out(); } 第二部:定义接口的实现类
package com.bobo.desing; public class Print1 implements Output{ @Override
public void out() {
System.out.println("print2的out方法"); } } package com.bobo.desing; public class Print2 implements Output{ @Override
public void out() {
System.out.println("print1的out方法"); } } 第三部:定义工厂类
package com.bobo.desing; public class PrintFactory {
public Output getOutput(){
return new Print1();
}
} 第四部:构建最终的实体类
package com.bobo.desing; public class Computer {
private Output op; public Computer(Output output) {
this.op=output;
}
public void work(){
op.out();
}
/**
* @param args
*/
public static void main(String[] args) {
PrintFactory factory=new PrintFactory();
//这样如果需要为计算器更换打印机时,只需要factory返回不同的print对象即可,从而避免了硬耦合
Computer co=new Computer(factory.getOutput());
co.work();
} }
简单工厂设计模式
3.4命令模式
对于下列场景:某个方法需要完成某一个行为,但是这个行为的具体实现无法确定,必须等到执行该方法的时候才可以确定。也就是说,方法不仅仅需要根据传入的数据变换,而且方法的执行体也需要变化。
第一步:实现接口
package com.bobo.desing; public interface Command {
void process(int[] target); } 第二部:实现了接口的相关类
package com.bobo.desing; public class AddCommand implements Command { @Override
public void process(int[] target) {
int sum = ;
for (int var : target) {
sum += var;
}
System.out.println(sum + "");
} } package com.bobo.desing; public class PrintCommand implements Command{ @Override
public void process(int[] target) {
// TODO Auto-generated method stub
for(int var:target){
System.out.print(var+" ");
}
System.out.println();
} } 第三部:
package com.bobo.desing; public class ProcessArray { public void process(int[] target, Command cmd) {
// TODO Auto-generated method stub
cmd.process(target);
} } 第四部:
package com.bobo.desing; public class CommandTest { public static void main(String args){
ProcessArray pa=new ProcessArray();
int array[]={,,,};
Command cmd=new AddCommand();
Command cmd2=new PrintCommand();
pa.process(array,cmd2);
} }
命令模式
四、java接口
java的接口可以同时继承多个接口,不能继承类;java中的类只能实现单继承
接口中的方法,默认是public类型,接口中的field,默认是public static final类型
接口和抽象类的区别:
区别主要体现在设计目的上,接口体现的是一种规范,作为系统和外部交互的窗口。抽象类体现的则是一种模板式的设计理念。
在目的上:
1)接口中只能包含抽象方法;抽象类可以包含普通方法,抽象类可以不包含抽象方法,但包含抽象方法的一定是抽象类。
2)接口中不能定义静态方法,抽象类可以
3)接口只能定义public static final类型的field。
4)接口可以继承多个接口,抽象类只能单继承
5)接口不能包含构造器;抽象类可以,抽象类的构造器并不是为了创建对象,而是供子类的构造器调用。
类和组合的方式:
一个是is a的关系,一个是has a的关系
五、常见的jar命令
jar与zip文件的区别在于多了清单文件:META_INF/MANIFEST.MF
1,创建jar文件 jar cvf test.jar test
2, 解压缩:jar xvf test.jar
3,添加main,生成一个可执行的jar文件:jar cvfe test.jar test *.class
4,执行带有main的jar: java -jar test.jar或者javaw test.jar
六、几个类的区别
StringBuffer与StringBuilder:StringBuffer线程安全,StringBuilder反之
ArrayList与vector:Vector线程安全,ArrayList反之
Hashtable与hashMap:前者线程安全,后者反之;hashtable不允许使用null作为key或者value,Hashmap则可以
集合实现线程安全可以使用Collections工具类的synchronizedXxx()的方法,此外,这个工具类还有shuffle,rotate等方法
七、java中的集合和泛型
java中的集合分为set、list和map三大体系
SET:hashSet、LinkedSet(按照插入顺序维护顺序)、TreeSet(基于红黑树,维度大小顺序)
LIST:ArrayList:基于数组,LinkList:基于链表;Deque:双边队列,可以实现栈或者队列
泛型:本质是一种类型参数
1,集合中使用泛型:菱形
2,泛型类或者泛型接口:public interface List<K,V>{}等
本质上没有泛型类,它们在运行时都是同一种类型,并且List<Person>也不是List<Object>的子类
3,利用extends设定泛型的上限,定义传给其的参数需要是该上限的子类或者上限本身;利用super设定泛型的下限
4,泛型方法:pulbic static<T> functionName(T a){}
八、java异常
java中的异常有两种:
checked异常:系统要求必须处理的,如io异常。runtime异常:可以处理也可以不处理的,如空指针异常。
throw抛出一个异常的实例,用在方法体中;throws抛出异常类,用在方法签名中
java知识查漏补缺的更多相关文章
- Java基础查漏补缺(2)
Java基础查漏补缺(2) apache和spring都提供了BeanUtils的深度拷贝工具包 +=具有隐形的强制转换 object类的equals()方法容易抛出空指针异常 String a=nu ...
- Java基础查漏补缺(1)
Java基础查漏补缺 String str2 = "hello"; String str3 = "hello"; System.out.println(str3 ...
- Go语言知识查漏补缺|基本数据类型
前言 学习Go半年之后,我决定重新开始阅读<The Go Programing Language>,对书中涉及重点进行全面讲解,这是Go语言知识查漏补缺系列的文章第二篇,前一篇文章则对应书 ...
- Java面试查漏补缺
一.基础 1.&和&&的区别. [概述] &&只能用作逻辑与(and)运算符(具有短路功能):但是&可以作为逻辑与运算符(是“无条件与”,即没有短路的功 ...
- JavaScript学习(一)——基础知识查漏补缺
标签script 我们知道,html要使用js就要使用<script>标签. 两种方式: 一是直接在<script>这里</script>写入代码. 二是在别的文件 ...
- java知识点查漏补缺-- 2020512
jvm: jdbc statement: JDBC statement中的PReparedStatement的占位符对应着即将与之对应当值,并且一个占位符只能对应一个值,如果能对应多个就会引起混淆.s ...
- Flutter查漏补缺1
Flutter 基础知识查漏补缺 Hot reload原理 热重载分为这几个步骤 扫描项目改动:检查是否有新增,删除或者改动,直到找到上次编译后发生改变的dart代码 增量编译:找到改变的dart代码 ...
- Java基础知识查漏 一
Java基础知识查漏 一 Jdk和jre Jdk是java程序设计师的开发工具,只要包含编译程序,jvm和java函数库 Jre中只有jvm和java函数库,没有编译程序的相关工具,适合只运行不撰写j ...
- 今天開始慢下脚步,開始ios技术知识的查漏补缺。
从2014.6.30 開始工作算起. 如今已经是第416天了.不止不觉.时间过的真快. 通过对之前工作的总结.发现,你的知识面.会决定你面对问题时的态度.过程和结果. 简单来讲.知识面拓展了,你才干有 ...
随机推荐
- 从入门到自闭之python三大器--装饰器进阶
装饰器的进阶 有参装饰器: # def warpper(func): # def inner(*args,**kwargs): # user = input("user:") # ...
- 【Tomcat】热部署的遗留配置导致服务器无法启动
1.问题描述: 今天用myeclipse写了个小demo,然后用Tomcat7 部署了,接着点击启动服务器,服务器居然报错: 严重: Error starting static Resources j ...
- Jquery table相关--工时系统
1.jquery 的弹出对话框,单击事件之后 if (confirm("确定要删除?")) { // //点击确定后操作 } 2.对某个table中的checkbox是否被选中的遍 ...
- Git复习(十一)之常见命令用法
创建版本库 git init 进入一个文件,执行该命令此时目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了. ...
- hadoop离线数据存储和挖掘架构
前序: 当你把你知道的东西,写下来,让人看明白是一种境界:当你能把自己写下来的东西给人讲明白,又是另一种境界.在这个过程中,我们都需要历练. 基于hadoop集群下海量离线数据存储和挖掘分析架构: 架 ...
- mysql中页的组成
页InnoDB采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB.也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最 ...
- Object Pascal异常的种类
- windows时钟服务设置
运行Regedit,打开注册表编辑器. 找到注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\,将Anno ...
- 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理
蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...
- 细数meta标签的奥秘
因为看到了一个很不错的h5自适应网站,觉得很不错,于是好奇心作祟,让我翻开了它的源码一探究竟,最先研究的是它的meta标签,好了,废话不多说,以下是我总结的和比较实用的meta标签,如有错误,请多多指 ...