Ignite

你不知道的Java(一)

2017-07-09

关于java基础的一些概念性、理论性的东西,好久没碰了,现在回过头来看看,有助于自己更深层次的提高,所以在此总结一下。

方法的重写
  1. 概念:子父类出了同名的函数,这个我们就称作为方法的重写。
  2. 方法重写的前提: 必须要存在继承的关系。
  3. 什么是时候要使用方法的重写:父类的功能无法满足子类的需求时。
  4. 方法重写要注意的事项:(“两同两小一大”)
  • 方法重写时,方法名与形参列表必须一致。(“两同”)
  • 方法重写时,子类的返回值类型必须要小于或者等于父类的返回值类型(“小”)
  • 方法重写时,子类抛出的异常类型要小于或者等于父类抛出的异常类型(“小”)
  • 方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符(“一大”)
1
2
Exception(最坏)
RuntimeException(小坏)
方法的重载
  1. 概念:在一个类中 存在两个或者两个 以上的同名函数,称作为方法重载。
  2. 方法重载的要求
  • 函数名要一致
  • 形参列表不一致(形参个数或形参的类型不一致)
  • 与返回值类型无关
java运算符优先级助记口诀

单目乘除为关系,逻辑三目后赋值。

  • 单目:单目运算符+ –(负数) ++ – 等
  • 乘除:算数运算符* / % + -
  • 为:位移运算符<< >>
  • 关系:关系运算符> < >= <= == !=
  • 逻辑:逻辑运算符&& || & | ^
  • 三目:三目运算符A > B ? X : Y
  • 后:无意义,仅仅为了凑字数
  • 赋值:赋值=
java的四种访问权限
public protected default(包权限) private
同一类中的成员
同一包中的成员
不同包的子类
不同包的非子类

protected可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类)。被protected修饰的成员,能在定义它们的类中,同包的类中被调用。如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类(即有继承关系)。
表格解释:

  1. public:任何地方均可访问;
  2. private:只限类的内部访问;
  3. protected:受保护的,类的内部可访问;同一个包下的不管是否有继承关系均可访问;不同包下只有有继承关系的才可访问;
  4. 默认(default):类的内部可访问;同一个包下不管是否有继承关系均可访问;不同包下不管有没有继承关系都不能访问。
java并发之原子性、可见性与有序性
  1. 原子性
    原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。Java的concurrent包下提供了一些原子类,我们可以通过阅读API来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。
  2. 可见性
    可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。比如 volatile int a = 0;之后有一个操作 a++;这个变量a具有可见性,但是a++ 依然是一个非原子操作,也就这这个操作同样存在线程安全问题。
  3. 有序性
    volatile。JVM规定,在volatile之前的操作,不能重排序到volatile之后。

synchronized。同步代码块对于不同线程来说串行进入的。

线程的创建方式
  1. 继承Thread类,重写run()方法,该run方法的方法体,代表了线程需要完成的任务
  2. 实现Runnable接口,重写该接口的run()方法,run()方法也为线程执行体
其他小知识

在java7中下列说法:
(1)Arrays.asList()将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的静态内部类!用这个对象对列表进行添加删除更新操作,就会报UnsupportedOperationException异常。

(2) ConcurrentHashMap使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全。

(3)抽象类和接口都不能实例化;抽象类可以不包含抽象方法,但是包含了抽象方法一定要声明为抽象类;抽象类可以继承抽象类

(4) Spring Framework是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,Spring中包含的关键特性:
1.强大的基于JavaBeans的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
2.一个可用于从applet到Java EE等不同运行环境的核心Bean工厂。
数据库事务的一般化抽象层,允许声明式(Declarative)事务管理器,简化事务的划分使之与底层无关。
3.内建的针对JTA和单个JDBC数据源的一般化策略,使Spring的事务支持不要求Java EE环境,这与一般的JTA或者EJB CMT相反。
4.JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码),简化了错误处理,大大减少了程序员的编码量。再次利用JDBC时,你无需再写出另一个’终止’(finally)模块。并且面向JDBC的异常与Spring通用数据访问对象(Data Access Object)异常等级相一致。
5.以资源容器,DAO实现和事务策略等形式与Hibernate,JDO和iBATIS SQL Maps集成。利用众多的翻转控制方便特性来全面支持,解决了许多典型的Hibernate集成问题。所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范。
6.灵活的基于核心Spring功能的MVC网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如JSP、FreeMarker、Velocity、Tiles、iText以及POI。值得注意的是,Spring中间层可以轻易地结合于任何基于MVC框架的网页层,例如Struts、WebWork或Tapestry。
7.提供诸如事务管理等服务的面向方面编程框架。

另外,Spring并没有提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。

(5)SpringMVC的原理:
SpringMVC是Spring中的模块,它实现了mvc设计模式的web框架,首先用户发出请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映射器查找匹配该url的handler,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handler进行处理并返回给前端控制器一个modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户。
DispatcherServlet作为springMVC的前端控制器,负责接收用户的请求并根据用户的请求返回相应的视图给用户。
实现业务操作时在service层

(6) java8中,忽略内部接口的情况,不能用来修饰interface里的方法的有
private protected

(7)

1
2
3
Integer s=new Integer(9);
Integer t=new Integer(9);
Long u=new Long(9);

(s==t) , s 是指向一个 9 的引用,而 t 也是一个指向 9 的引用,虽然都是指向 9 ,但却是指向不同的 9 ,即是两个不同的引用。因此 == 比较返回的是假。

1
2
3
4
5
6
7
(s.equals(t)) , Integer 的 equals 方法如下:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false ;
}

是 Integer 的实例且 value 值也相等的情况下返回真,其他返回假。
在这里, s 和 t 都是 Integer 类型且值都为 9 ,因此结果为真。

(s.equals(9)) , 在进行 equals 比较之前,会对 9 调用 Integer.valueOf 方法,进行自动装箱 , 由于 IntegerCache 中已经存在 9 ,所以,直接返回其引用,引用相同, equals 就自然相同了。所以结果为真

(s.equals( new Integer(9)) ,直接创建了一个新的 Integer 实例,但且值也为 9 ,所以,满足条件,返回真。

Tags: Java
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章