一:java语言基本特征:
class | 自身由什么构成(属性) |
---|---|
能干什么事(方法) |
java为面向对象语言,通过class实现对一类事物进行抽象,通俗讲抽象后的class主要由两部分构成:
体对象来完成任务,java中将class到对象的过程叫着实例化,java面向对象有三大基本特性:
1: 封装:目的是抽象形成类或者接口,并对类中的方法和属性加上适当限制访问权限(每个人都有隐私,此处可以理解为分配个人隐私和可见的权限)
2: 继承:子类继承父类(,java对象有唯一的祖先Object,同时,java是单继承,即一个父亲可以有多个孩子,但不会出现一个孩子有多个父亲的情况(血缘关系上的))
3:多态:实际生活中往往具体存在的都是一个一个对象,(如张三、李四、王五都是学生,学生只是他们共有特征的抽象,在运行时,需要将学生这个class绑定为张三、李四或者王五,当编译后就能确定是具体人员时,这就实际失去了神秘感,还有一种情况是要运行时,才能确定具体对象,这种在java中叫做动态绑定,所以一个class可能有多种身份,此处可以理解为多态,多态存在着向上转型
二:数据库相关:
一个系统通常由输入、执行处理、输出三大部分构成。输入的是为处理系统提供必要的初始执行数据,输出是将计算结果进行规范化存储,这两个本质是解决拿数据和存数据的问题,而管理数据通常由数据库来完成,那数据库管理数据需要注意那些问题呢?
1.:数据库访问:数据库大致分为关系性数据库和非关系性数据库,在关系型数据库中常用的又有oracle、mysql、sqlserver等,数据库种类繁多,不同的数据库底层驱动不一样,这时jdbc通过定义规范,由不同的数据库厂商来实现具体驱动的方式解决了多种类型数据库的访问问题;
2:数据库连接池:数据库访问必须要获取连接,频繁的建立连接和释放需要的代价比较大,通过连接池的方式管理连接资源,供用户使用,这种方式极大的提升了效率。
3:ORM:在关系性数据库中基本载体为表,表是由一条条记录组成,这与java的类中属性表示方法不太一致,就像一个只会说汉语的中国人和一个只会英语的外国人进行交流,这样很难指导对方说的什么,为了解决这中差异,方便java和数据库中表的互适,聪明的人们实现了ORM框架(以mybatis、hibernate为代表);
4:数据库自身基本知识:上文描述了数据库怎么访问,如何将两种不同的语言体系通过桥梁进行互通,但数据库自身还有很多需要学习的地方,如数据库事务,数据隔离级别,并发异常等
三:注解
java注释不参与编译,而注解与类、接口、枚举是在同一个层次,可以成为java 的一个类型,是java的一种元数据类型,参与编译,英名为Annotation,它是JDK5.0及以后版本引入的一个特性,下文将展示一个注解
package reflect.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cloumn {
int id() default 10;
String value() default "cloumn";
int age() default 56;
}
注解中可以定义该注解修饰的对象(类、属性、方法等),同时还需定义注解的生命周期,此处为RetentionPolicy.RUNTIME;
目前使用的spring、springboot等框架大量的使用的注解,对注解的深入理解有利于后续的学习。
四:反射
java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)获取类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值;
下文将展示通过反射,获取类中属性、调用方法,获取注解等;
public class Test {
public static void main(String[] args) throws Exception{
Class<?> aClass = Class.forName("reflect.test.Persion");
for(Field field:aClass.getDeclaredFields()) {
System.out.println("befor set value ----args = " + field.getName());
}
Persion student=(Persion) aClass.newInstance();
for(Field field:aClass.getDeclaredFields()) {
field.setAccessible(true);
if(field.getName().equals("id")){
field.set(student,10);
}else if(field.getName().equals("name")){
field.set(student,"lisw");
}else if(field.getName().equals("age")){
field.set(student,34);
}else{
System.out.println("No filed find in this class");
break;
}
}
System.out.println("student = "+ student.toString());
//get annatation/
for(Field field:aClass.getDeclaredFields()) {
field.setAccessible(true);
if(field.getName().equals("id")){
Cloumn annotation = field.getAnnotation(Cloumn.class);
if(annotation!=null)
System.out.println("id-annatation = " + annotation.id());
}else if(field.getName().equals("name")){
Cloumn annotation = field.getAnnotation(Cloumn.class);
System.out.println("name-annatation = " + annotation.value());
}else if(field.getName().equals("age")){
Cloumn annotation = field.getAnnotation(Cloumn.class);
System.out.println("age-annatation = " + annotation.age());
}else{
System.out.println("No filed find in this class");
break;
}
}
}
}
五:代理模式
生活中经常出现“代理人”的说法,现在比较流行的“代购”也是代理的一种体现。以代购为例,买方不直接和商品的卖家接触,而是通过第三方“代理”的方式获取商品。这样代理可以在买家获取商品的行为上增加其他买方希望的服务,常用的spring中AOP通过代理模式实现。
代理分为静态代理和动态代理。
1:静态代理相对比较简单,代理和商品生产者实现相同的接口,买方保留一个该接口的属性,通过调用传入的代理对象的方法来获取商品。下面通过借用网上的一幅图来展示静态代理的理解:
2:动态代理相对比较复杂,需要实现InvocationHandle接口,通过java自身提供的proxy类实现(此处后续需要进一步深入理解)