一、重写(override)和重载(overload)的区别

二者除了名字相似,其实没什么联系

范围不同:重载发生在同一个类的不同方法之间。重写发生在父类和子类自荐。

前提:

重载要求:方法名相同,参数列表不同,对于返回值类型不要求相同。

重写要求:方法名形同,参数列表也相同。重写是实现多态的关键,注意如果父类中的方法是private类型,那么子类中对应方法不算重载,而相当于是定义了一个新方法。

二、final的用法

修饰类:该类不能被继承

修饰方法:该方法不能被重写

修饰属性:该属性初始化后不能被修改

1,方法可以多态,Fields不能实现多态。

2,利用父类的引用调用子类的方法呈现子类的特征成为多态。

3,不能利用父类的引用去调用子类没有实现的方法,除非进行强制转换。

三、java实现的几种设计模式

3.1单例模式

作用:对于某些系统资源,比如可能只有一个窗口管理器等等,取消自由创建对象的系统开销。

单例类创建的注意点:

1)有一个该类的实例作为类属性。

2)构造函数为private类型

3)通过一个类方法获取类的唯一实例

  1. package com.bobo.interview;
  2.  
  3. public class Singleton {
  4.  
  5. private static Singleton instance;
  6.  
  7. private Singleton() {
  8.  
  9. }
  10.  
  11. public Singleton getInstance() {
  12. if (instance == null) {
  13. instance = new Singleton();
  14. }
  15. return instance;
  16. }
  17.  
  18. }

单例模式

这种有一个隐藏的问题,多线程,试想,如果两个线程同时去判断instance是否为空,那么就可能生成两个不同的对象,对此解决方法是

1)加同步锁(注意加的位置)

  1. package com.bobo.interview;
  2.  
  3. import java.util.concurrent.locks.Lock;
  4.  
  5. public class SingleTon2 {
  6. private SingleTon2 instance;
  7.  
  8. private SingleTon2() {
  9.  
  10. }
  11.  
  12. public SingleTon2 getInstance() {
  13. if (instance == null) {
  14. synchronized (this) {
  15. if (instance == null) {
  16. instance = new SingleTon2();
  17. }
  18. }
  19. }
  20. return instance;
  21.  
  22. }
  23.  
  24. }

单例类实现方式1

注意,判断两次是否为空,只有再第一次生成对象的时候,才需要加同步锁。而不是每次判断为空的时候都加,从而提高代码效率

2)使用类成员变量

  1. package com.bobo.interview;
  2.  
  3. public class SingleTon3 {
  4. private static SingleTon3 instance=new SingleTon3();
  5. private SingleTon3(){
  6.  
  7. }
  8. public SingleTon3 getInstance(){
  9. return instance;
  10. }
  11.  
  12. }

基于类成员变量实现单例模式

3.2不可变类

作用:利用java.lang.String等,并且绝对线程安全

创建的注意点:

1)使用private和final修饰类的field

2)提供代参数的构造器,用户根据传入参数来初始化类的field

3)仅仅提供getter,不能提供setter

4)如果有必要,重写类的equals和hashcode方法(根据关键的field来判断)

有些情况,还可以为不可变类增添缓存。

3.3简单工厂模式

作用:“面向接口”编程,降低耦合。

  1. 第一步:定义接口
  2. package com.bobo.desing;
  3.  
  4. public interface Output {
  5. int MAX_CHCHE_LINE=;
  6. void out();
  7.  
  8. }
  9.  
  10. 第二部:定义接口的实现类
  11. package com.bobo.desing;
  12.  
  13. public class Print1 implements Output{
  14.  
  15. @Override
  16. public void out() {
  17. System.out.println("print2的out方法");
  18.  
  19. }
  20.  
  21. }
  22.  
  23. package com.bobo.desing;
  24.  
  25. public class Print2 implements Output{
  26.  
  27. @Override
  28. public void out() {
  29. System.out.println("print1的out方法");
  30.  
  31. }
  32.  
  33. }
  34.  
  35. 第三部:定义工厂类
  36. package com.bobo.desing;
  37.  
  38. public class PrintFactory {
  39. public Output getOutput(){
  40. return new Print1();
  41. }
  42. }
  43.  
  44. 第四部:构建最终的实体类
  45. package com.bobo.desing;
  46.  
  47. public class Computer {
  48. private Output op;
  49.  
  50. public Computer(Output output) {
  51. this.op=output;
  52. }
  53. public void work(){
  54. op.out();
  55. }
  56. /**
  57. * @param args
  58. */
  59. public static void main(String[] args) {
  60. PrintFactory factory=new PrintFactory();
  61. //这样如果需要为计算器更换打印机时,只需要factory返回不同的print对象即可,从而避免了硬耦合
  62. Computer co=new Computer(factory.getOutput());
  63. co.work();
  64. }
  65.  
  66. }

简单工厂设计模式

3.4命令模式

对于下列场景:某个方法需要完成某一个行为,但是这个行为的具体实现无法确定,必须等到执行该方法的时候才可以确定。也就是说,方法不仅仅需要根据传入的数据变换,而且方法的执行体也需要变化。

  1. 第一步:实现接口
  2. package com.bobo.desing;
  3.  
  4. public interface Command {
  5. void process(int[] target);
  6.  
  7. }
  8.  
  9. 第二部:实现了接口的相关类
  10. package com.bobo.desing;
  11.  
  12. public class AddCommand implements Command {
  13.  
  14. @Override
  15. public void process(int[] target) {
  16. int sum = ;
  17. for (int var : target) {
  18. sum += var;
  19. }
  20. System.out.println(sum + "");
  21. }
  22.  
  23. }
  24.  
  25. package com.bobo.desing;
  26.  
  27. public class PrintCommand implements Command{
  28.  
  29. @Override
  30. public void process(int[] target) {
  31. // TODO Auto-generated method stub
  32. for(int var:target){
  33. System.out.print(var+" ");
  34. }
  35. System.out.println();
  36. }
  37.  
  38. }
  39.  
  40. 第三部:
  41. package com.bobo.desing;
  42.  
  43. public class ProcessArray {
  44.  
  45. public void process(int[] target, Command cmd) {
  46. // TODO Auto-generated method stub
  47. cmd.process(target);
  48. }
  49.  
  50. }
  51.  
  52. 第四部:
  53. package com.bobo.desing;
  54.  
  55. public class CommandTest {
  56.  
  57. public static void main(String args){
  58. ProcessArray pa=new ProcessArray();
  59. int array[]={,,,};
  60. Command cmd=new AddCommand();
  61. Command cmd2=new PrintCommand();
  62. pa.process(array,cmd2);
  63. }
  64.  
  65. }

命令模式

四、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知识查漏补缺的更多相关文章

  1. Java基础查漏补缺(2)

    Java基础查漏补缺(2) apache和spring都提供了BeanUtils的深度拷贝工具包 +=具有隐形的强制转换 object类的equals()方法容易抛出空指针异常 String a=nu ...

  2. Java基础查漏补缺(1)

    Java基础查漏补缺 String str2 = "hello"; String str3 = "hello"; System.out.println(str3 ...

  3. Go语言知识查漏补缺|基本数据类型

    前言 学习Go半年之后,我决定重新开始阅读<The Go Programing Language>,对书中涉及重点进行全面讲解,这是Go语言知识查漏补缺系列的文章第二篇,前一篇文章则对应书 ...

  4. Java面试查漏补缺

    一.基础 1.&和&&的区别. [概述] &&只能用作逻辑与(and)运算符(具有短路功能):但是&可以作为逻辑与运算符(是“无条件与”,即没有短路的功 ...

  5. JavaScript学习(一)——基础知识查漏补缺

    标签script 我们知道,html要使用js就要使用<script>标签. 两种方式: 一是直接在<script>这里</script>写入代码. 二是在别的文件 ...

  6. java知识点查漏补缺-- 2020512

    jvm: jdbc statement: JDBC statement中的PReparedStatement的占位符对应着即将与之对应当值,并且一个占位符只能对应一个值,如果能对应多个就会引起混淆.s ...

  7. Flutter查漏补缺1

    Flutter 基础知识查漏补缺 Hot reload原理 热重载分为这几个步骤 扫描项目改动:检查是否有新增,删除或者改动,直到找到上次编译后发生改变的dart代码 增量编译:找到改变的dart代码 ...

  8. Java基础知识查漏 一

    Java基础知识查漏 一 Jdk和jre Jdk是java程序设计师的开发工具,只要包含编译程序,jvm和java函数库 Jre中只有jvm和java函数库,没有编译程序的相关工具,适合只运行不撰写j ...

  9. 今天開始慢下脚步,開始ios技术知识的查漏补缺。

    从2014.6.30 開始工作算起. 如今已经是第416天了.不止不觉.时间过的真快. 通过对之前工作的总结.发现,你的知识面.会决定你面对问题时的态度.过程和结果. 简单来讲.知识面拓展了,你才干有 ...

随机推荐

  1. mongodb 数据操作(1)

    切换/创建数据库 use test 添加数据db.student.save({name:"J33ack",age:25}) 查看数据库show dbs 删除当前数据库 db.dro ...

  2. 转载Spring Data JPA 指南——整理自官方参考文档

    转载:https://blog.csdn.net/u014633852/article/details/52607346 官方文档 https://docs.spring.io/spring-data ...

  3. [转载]ubuntu常用命令

    1.帮助      --help简单的帮助      help command 较详细的帮助      man command 最详细的帮助2.ls 命令      ls -a 显示全部的文件及文件夹 ...

  4. python读写txt文件

    整理平常经常用到的文件对象方法: f.readline()   逐行读取数据方法一: >>> f = open('/tmp/test.txt') >>> f.rea ...

  5. 学会这 2 点,轻松看懂 MySQL 慢查询日志

    MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句. 2)慢查 ...

  6. 06 基本数据结构 - 双端队列(Deque)

    一.双端队列(Deque) - 概念:deque(也称为双端队列)是与队列类似的项的有序集合.它有两个端部,首部和尾部,并且项在集合中保持不变. - 特性:deque 特殊之处在于添加和删除项是非限制 ...

  7. vue实现登录路由拦截

    第一步 在router.js里面 把需要判断是否登录的路由添加meta对象属性 在meta对象里面自定义一个属性值 第二步 : 在router.js里面 与const router = new Rou ...

  8. NLP 基于kashgari和BERT实现中文命名实体识别(NER)

    准备工作,先准备 python 环境,下载 BERT 语言模型 Python 3.6 环境 需要安装kashgari Backend pypi version desc TensorFlow 2.x ...

  9. 关于Vue-$router传参出现刷新页面或者返回页面丢失数据的问题

    也算是踩到坑了,但不是我踩到的,不过还是得说下这个问题,很严重,对于小白和初学者是比较有帮助的,如果使用到路由传参,请选择你想要的传参方式params或者query 1.query this.$rou ...

  10. Java 基础知识点滴(1)

    1. ==与equals的区别 ==是用来判断两个变量的值是否相等.要比较两个基本变量或引用变量是否相等,只能用==: equal用来判断两个独立对象里面的内容是否一样. 例子: String s1 ...