java小概念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheidou123/article/details/57962931

1.java重载和重写以及隐藏

2.构造方法

3.访问修饰符

4.接口,抽象类以及它们的区别

5.关键字和保留字

6.析构函数

7.JAVA事件处理模型

8.JAVA程序的种类

9.JAVA标识符

10.JAVA中lang sql util包

11.super和this关键字

12.JDK中的包和他们的基本功能

13.object类的基本方法

14.final关键字

15.什么是原子性操作

16.鲁棒性(Robust,即健壮性)

17.J2EE常用名词

18.加载驱动的三种方式

19.java编译后缀

20.cmd运行方式

21.Cookie Session 以及它们的区别

22.前台线程和后台线程

23.静态方法(类方法),静态变量,静态代码块

24.java表达式转型规则

25.基本数据类型和引用数据类型

26.面向对象五大原则

27.JDK JRE JVM的区别

28.@Resource @Autowired的区别

1.java重载和重写以及隐藏

重载(overload):是一个类中多态性的一种表现,只要方法名 一致 ,但要求每个方法具有不同的参数的类型或参数的个数,方法的返回类型、修饰符可以相同,也可不同。这里需要注意的是,函数重载不能基于返回值类型
重写(overriding):
1.“两小” :子类方法的返回值类型、抛出的异常 均应小于等于父类方法的
2.“两同”:子类方法的方法名、参数列表均应该与父类方法相同
3.“一大”:子类方法的访问权限应该大于等于父类方法的访问权限
隐藏:
隐藏是针对父类中的成员变量和静态方法而言 。当子类声明了与父类相同的变量名的变量时就实现了对父类成员变量的隐藏。当子类声明了与父类的静态成员方法中相同方法名,相同参数列表和相同返回类型的方法,则实现了对父类静态方法的隐藏

2.构造方法

构造函数=构造方法
⑴方法名必须与类名相同。
⑵构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
⑶构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
⑷一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
⑸构造方法可以重载,以参数的个数,类型,顺序。
构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public、private、protected修饰
⑺如果不写构造函数的就是使用一个默认的空的构造函数
⑻不能被继承,只能被显式或隐式的调用。
⑼父类如果没有无参的构造函数,子类就需要在自己的构造函数中显式调用父类的构造函数,否则会编译报错
添加super("XX");
⑽构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象中的属性的问题,所以不需要同步
3.访问修饰符
public可以被当前类,子类,包,其他包,访问,
protected 可以被当前类,子类,包访问
default可以被可以被当前类,包内访问;
private只能被当前类访问
这里要注意一点:private的属性和方法子类是可以继承的,但是不能调用!

4.接口,抽象类以及它们的区别

⑴抽象类
如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。它的出发点就是为了继承,抽象类有方法体但是抽象方法没有方法体
在使用抽象类时需要注意几点:
抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
②抽象方法必须由子类来进行重写,也就是说抽象类中的抽象方法子类必须实现它。如果子类没有实现它的抽象方法那么子类也是抽象类。
③只要包含一个抽象方法就是抽象类。
④抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
⑤子类中的抽象方法不能与父类的抽象方法同名。
⑥abstract不能与final并列修饰同一个类。
⑦abstract 不能与private、static、final或native并列修饰同一个方法。
⑵接口
①一个类可以 实现 多个接口
②接口中的常量和方法必须是public的访问权限,可以写出来或者不写,不写就是默认
③在接口中只有方法的声明,没有方法体。
④接口中所有的方法必须都是抽象的,接口中也可以定义数据成员,但必须是常量
⑤接口中没有构造方法,也不能实例化接口的对象。
⑥接口可以实现多继承
⑦接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法,.则实现类定义为抽象类。
⑧接口中不能包含静态方法
⑶联系
①接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
②接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类(子类若为抽象类除外)都必须实现这些抽象方法。
⑷区别
①一个子类只能继承一个抽象类,但能实现多个接口
抽象类可以有构造方法,接口没有构造方法
③抽象类可以有普通成员变量,接口没有普通成员变量
④抽象类和接口都可有静态成员变量,抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
⑤抽象类可以没有抽象方法,抽象类可以有普通方法,接口中在JAVA8之前都是抽象方法,但是接口在JAVA8之后有了默认方法
⑥抽象类可以有静态方法,接口不能有静态方法
⑦抽象类中的方法可以是public、protected;接口方法只有public,JDK9接口可以定义私有方法,但不能是抽象的。

5.关键字和保留字
⑴Java 关键字列表 (依字母排序 共50组):
abstract, assert, boolean, break, byte, case, catch, char, class, const(保留关键字), continue, default, do, double, else, enum, extends, final, finally, float, for, goto(保留关键字), if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while
⑵保留字列表 (依字母排序 共14组),Java保留字是指现有Java版本尚未使用,但以后版本可能会作为关键字使用:
byValue, cast, false, future, generic, inner, operator, outer, rest, true, var, goto (保留关键字) , const (保留关键字) , null

6.析构函数

与 构造函数 相反,当对象结束其 生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

7.java事件处理模型

Java 提供的事件处理模型是一种人机交互模型。它有三个基本要素:
1) 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件;
2) 事件(Event):事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;
3) 事件监听器(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件;

8.JAVA程序的种类

(a)内嵌于Web文件中,由浏览器来观看的_Applet
(b)可独立运行的 Application
(c)服务器端的 Servlets

9.JAVA标识符

Java语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为Java标识符。
标识符可以包括这4种字符:字母、下划线、$、数字;开头不能是数字;不能是关键字
简单的可以记为:数字划钱
注意:不能有空格!

10.JAVA中lang sql util包

java.lang 提供利用 Java 编程语言进行程序设计的基础类
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。

11.super和this关键字

this表示当前对象,也就是当前类对象,super表示当前类的父类。
举例:你定义一个新的类:A,这个A继承了类B,也就是说B是A的父类。那么如果A中 有个方法:aa();B中也有个方法: aa();
那么在A 中用this.aa()调用的就是A中定义的方法,而super.aa()调用的就是A的父类B中定义的方法aa();

注意:
①this和super需要放在构造方法的第一行
②都是对象,所以均不可以在static环境中使用
③不能同时出现在同一个构造函数里
Super中的参数表示的就是调用父类相同形参的构造方法

12.JDK中的包和他们的基本功能

JDK常用的包主要有以下几种
①java.lang:语言包 自动引入的
②java.util:实用包 实用包提供了各种实用功能的类,主要包括日期类、数据结构类和随机数类等
③java.awt:抽象窗口工具包 要用于编写GUI程序,包括按钮、标签等常用组件以及相应的事件类
④javax.swing:轻量级的窗口工具包,这是目前使用最广泛的GUI程序设计包
⑤java.io:输入输出包 java.io提供了系统输入输出类和接口,只要包括输入流类InputStream和输出流OutputStream就可以实现文件的输入输出、管道的数据传输以及网络数据传输的功能
⑥java.NET:网络函数包 java.Net提供了实现网络应用程序的类,主要包括用于实现Socket通信的Socket类,此外还提供了便于处理URL的类
⑦java.applet:编制applet用到的包(目前编制applet程序时,更多的是使用swing中的JApplet类)。 java.applet是专为创建Applet程序提供的包,它包含了基本的applet类和通信类,目前基本上被JApplet类所代替。

13.object类的基本方法

⑴clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
①浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
②深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
⑵getClass方法
final方法,获得运行时类型。
⑶toString方法
返回该对象的字符串表示
⑷finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
⑸equals方法
该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
⑹hashCode方法
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
⑺wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
①其他线程调用了该对象的notify方法。
②其他线程调用了该对象的notifyAll方法。
③其他线程调用了interrupt中断该线程。
④时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
⑻notify方法
该方法唤醒在该对象上等待的某个线程。
⑼notifyAll方法
该方法唤醒在该对象上等待的所有线程。

14.final关键字

final修饰类、方法、属性!不能修饰抽象类,因为抽象类一般都是需要被继承的,final修饰后就不能继承了。
final修饰的方法不能被重写(覆盖)而不是重载!
final修饰属性,此属性就是一个常量,不能被再次赋值! 

15.什么是原子性操作

A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作:
我们把这种要么一起成功(A帐户成功减少1000,同时B帐户成功增加1000),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。
如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性

16.鲁棒性(Robust,即健壮性)

Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生 的错误。通过集成的面向对象的例外处理机制,在编译时,Java揭示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。另外, Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。

17.J2EE常用名词

web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使 JSP,SERVLET直接更容器中的环境变量接**互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

18.加载驱动的三种方式

⑴.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
⑵. DriverManager.registerDriver(new com.mysql.jdbc.Driver());
⑶.System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");

19.java编译后缀

java中源文件的后缀为.java,
经过javac.exe编译后生成字节码文件,后缀为.class,
再经过java.exe编译为可执行文件,后缀为.exe。
Java程序经编译后会产生byte code

20.CMD运行方式

已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的?( )
args[0] = "MyTest a b c"
args[0] = "MyTest"
args[0] = "a"
args[1]= "b"


对于java命令,类名后面跟着的就是main函数的参数,多个参数则用空格隔开。main方法的形参是一个string数组所以对于java mytest a b c传入的参数算是一个string数组。 即args[0]=a args[1]=b args[2]=c

21.Cookie Session 以及它们的区别

⑴Session原理

①创建Session的时候,服务器将生成一个唯一的sessionid然后用它生成一个关闭浏览器就会失效的cookie。当一个 Session 开始时,Servlet 容器将创建一个 HttpSession 对象,Servlet 容器为 HttpSession 分配一个唯一标识符,称为 Session ID。Servlet 容器将 Session ID 作为 Cookie 保存在客户的浏览器中。每次客户发出 HTTP 请求时,Servlet 容器可以从 HttpRequest 对象中读取 Session ID,然后根据 Session ID 找到相应的 HttpSession 对象,从而获取客户的状态信息。

②然后再将一个与这个sessionid关联的数据项加入散列表。

例如这样一段代码:Session["UserName"]=23;
假设sessionid为123那么散列表中会追加一行
sessionid username
   123              23

③当浏览器端提交到服务器时,会通过sessionid=123去散列表中寻找属于该用户的Session信息。

另外:

当客户端浏览器中禁止 Cookie,Servlet 容器无法从客户端浏览器中取得作为 Cookie 的 Session ID,也就无法跟踪客户状态。
Java Servlet API 中提出了跟踪 Session 的另一种机制,如果客户端浏览器不支持 Cookie,Servlet 容器可以重写客户请求的 URL,把 Session ID 添加到 URL 信息中。

HttpServletResponse 接口提供了重写 URL 的方法:public java.lang.String encodeURL(java.lang.String url)
该方法的实现机制为:
● 先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。
● 再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。

⑵cookie的内容主要包括:名字,值,过期时间,路径和域。

⑶session和cookie的区别:

①cookie数据存放在客户的浏览器上,session数据放在服务器上。
②cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
③session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
④单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
⑤所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中

22.前台线程和后台线程

前台线程是程序必须完成的,main()函数就是一个前台线程,前台线程结束则程序终止,而后台线程不管有没有结束都会随之终止,只要有一个前台线程未终止程序就不会停止
前台线程可以通过设置Thread.IsBackground 属性修改为后台线程
前台线程或者后台线程出现异常都会使程序终止
托管线程池中线程是后台线程,New Thread方式创建的默认为前台线程

23.静态方法(类方法),静态变量,静态代码块

⑴静态方法中不能引用非静态方法和非静态属性—理由很简单,因为静态方法直接可以不经过实例化就可以使用。但是非静态方法必须借助一个实例才能使用。静态方法中没有this指针
静态方法可以重载
static的方法在装载class得时候首先完成,比 构造方法早,此时非static得和方法还没有完成初始化,所以不能调用。
方法是static静态方法,直接使用"类.方法"即可,因为静态方法使用不依赖对象是否被创建。
⑵静态代码块优先于主方法,且只执行一次
⑶只有类才存在静态的变量 ,非静态成员函数中可以调用静态成员,方法只能对静态变量的操作 不能在方法内试图定义静态变量
搜索
否则的话会抛出编译错误

⑷执行顺序

其中涉及:静态初始化代码块、构造代码块、构造方法
当涉及到继承时,按照如下顺序执行:
1、执行父类的静态代码块 
static {
        System.out.println("static A");
    }
输出:static A
2、执行子类的静态代码块
static {
        System.out.println("static B");
    }
输出:static B
3、执行父类的构造代码块
{
        System.out.println("I’m A class");
    }
输出:I'm A class
4、执行父类的构造函数
public HelloA() {
    }
输出:无
5、执行子类的构造代码块
{
        System.out.println("I’m B class");
    }
输出:I'm B class
6、执行子类的构造函数
public HelloB() {
    }
输出:无
24.java表达式转型规则
Java表达式转型规则由低到高转换:

byte→short(char)→int→long→float→double
⑴所有的byte,short,char型的值将被提升为int型;
⑵如果有一个操作数是long型,计算结果是long型;
⑶如果有一个操作数是float型,计算结果是float型;
⑷如果有一个操作数是double型,计算结果是double型;
⑸被final修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。
记住:

⑴所占位数少的可以转换为所占位数多的类型,比如byte转char,char转int等;
⑵而所占位数多的转为所占位数少的默认情况下不能实现转换,需要强制类型转换,这样可能会丢失一部分原始数据;
⑶此外,boolean类型数据和其他七种不能互相转换。
看一种会产生信息丢失的情况:
int a=(int)8846.0 double转int会信息丢失

例题:

下列代码片段中,存在编辑错误的语句是(134)

byte b1=1,b2=2,b3,b6,b8;

final byte b4=4,b5=6,b7;

b3=(b1+b2);  /*语句1*/

b6=b4+b5;    /*语句2*/

b8=(b1+b4);  /*语句3*/

b7=(b2+b5);  /*语句4*/

System.out.println(b3+b6);

语句1错误:b3=(b1+b2);自动转为int,所以正确写法为b3=(byte)(b1+b2);或者将b3定义为int;

语句2正确:b6=b4+b5;b4、b5为final类型,不会自动提升,所以和的类型视左边变量类型而定,即b6可以是任意数值类型.

语句3错误:b8=(b1+b4);虽然b4不会自动提升,但b1仍会自动提升,所以结果需要强转,b8=(byte)(b1+b4);

语句4错误:b7=(b2+b5); 同上。同时注意b7是final修饰,即只可赋值一次,便不可再改变。
25.基本数据类型和引用数据类型

基本类型(属于原生类)只能保存一些常量数据,引用类型除了可以保存数据,还能提供操作这些数据的功能;
为了操作基本类型的数据,java也对它们进行了封装, 得到八个类,就是java中的基本类型的封装类;他们分别是:
八种基本类型: byte short int long float double char boolean
对应的包装类 : Byte Short Integer Long Float Double Character Boolean
引用类型包括类、接口和数组类型以及特殊的null类型。
引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值

26.面向对象五大原则

单一职责原则(SRP)
开放封闭原则(OCP)
里氏替换原则(LSP)
依赖倒置原则(DIP)
接口隔离原则(ISP)


单一职责原则(SRP)
• 一个类应该仅有一个引起它变化的原因(最简单,最容易理解却最不容易做到的一个设计原则)
职员类例子:
比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿,并且上述三种的职员类型,不论哪一种发生需求变化,都会改变职员类!这个是大家所不愿意看到的!

开放封闭原则(OCP)
• 既开放又封闭,对扩展是开放的,对更改是封闭的!
• 扩展即扩展现行的模块,当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求!

更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!
这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!

里氏替换原则(LSP)
• 子类可以替换父类并且出现在父类能够出现的任何地方
• 这个原则也是在贯彻GOF倡导的面向接口编程!
在这个原则中父类应尽可能使用接口或者抽象类来实现!

子类通过实现了父类接口,能够替父类的使用地方!
通过这个原则,我们客户端在使用父类接口的时候,通过子类实现!
意思就是说我们依赖父类接口,在客户端声明一个父类接口,通过其子类来实现
这个时候就要求子类必须能够替换父类所出现的任何地方,这样做的好处就是,在根据新要求扩展父类接口的新子类的时候而不影响当前客户端的使用!

依赖倒置原则(DIP)
• 传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也
称为高层依赖低层!
所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖低层模块,所以称之为依赖倒置原则!

ISP 接口隔离原则

• 这个原则的意思是:使用多个专门的接口比使用单个接口要好的多!

27.JDK JRE JVM的区别

JDK:JAVA语言开发工具包,在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。

JRE:包含JVM标准实现和JAVA核心类库,JRE是JAVA运行环境而不是开发环境,不包含任何开发工具(如编译器和调试器)

JVM:JAVA虚拟机,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。


JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。

当我们安装完JDK后会出现两个JRE,这是为什么呢?

一个jre是放在jdk文件夹下面的,这个是开发使用的jre.

一个是供系统其他java应用使用的jre使用的。如果我们不进行开发只运行JAVA程序的话,就不需要安装JDK

28.@Resource @Autowired的区别

@Resource       按照名称进行bean装配

@Autowired      按照类型进行bean装配

举个例子来看一下:

现在有一个接口Human和两个实现类ManImpl、WomanImpl,在service层的一个bean中要引用了接口Human:

接口Human:

package testwebapp.com.wangzuojia.service;  
  
public interface Human {  
      
    public void speak();  
      
    public void walk();  
}  

实现类ManImpl:

package testwebapp.com.wangzuojia.service.impl;  
  
import org.springframework.stereotype.Service;  
  
import testwebapp.com.wangzuojia.service.Human;  
  
@Service  
public class ManImpl implements Human {  
  
    public void speak() {  
        System.out.println(" man speaking!");  
  
    }  
  
    public void walk() {  
        System.out.println(" man walking!");  
  
    }  
  
}  

实现类WomanImpl:

package testwebapp.com.wangzuojia.service.impl;  
  
import org.springframework.stereotype.Service;  
  
import testwebapp.com.wangzuojia.service.Human;  
  
@Service  
public class WomanImpl implements Human {  
  
    public void speak() {  
        System.out.println(" woman speaking!");  
  
    }  
  
    public void walk() {  
        System.out.println(" woman walking!");  
  
    }  
  
}  

主调类SequenceServiceImpl:

package testwebapp.com.wangzuojia.service.impl;  
  
import java.util.Map;  
  
import javax.annotation.Resource;  
  
import org.springframework.stereotype.Service;  
  
import testwebapp.com.wangzuojia.dao.SequenceMapper;  
import testwebapp.com.wangzuojia.service.Human;  
import testwebapp.com.wangzuojia.service.SequenceService;  
  
@Service  
public class SequenceServiceImpl implements SequenceService {  
  
    @Resource  
    private SequenceMapper sequenceMapper;  
    public void generateId(Map<String, String> map) {  
        sequenceMapper.generateId(map);  
          
    }  
    //起服务此处会报错  
    @Resource  
    private Human human;  
  
}  

这时候启动tomcat会报错,报错的地方有一句:but found 2: manImpl,womanImpl   

解决方案:

package testwebapp.com.wangzuojia.service.impl;  
  
import java.util.Map;  
  
import javax.annotation.Resource;  
  
import org.springframework.stereotype.Service;  
  
import testwebapp.com.wangzuojia.dao.SequenceMapper;  
import testwebapp.com.wangzuojia.service.Human;  
import testwebapp.com.wangzuojia.service.SequenceService;  
  
@Service  
public class SequenceServiceImpl implements SequenceService {  
  
    @Resource  
    private SequenceMapper sequenceMapper;  
    public void generateId(Map<String, String> map) {  
        sequenceMapper.generateId(map);  
          
    }  
      
    @Resource(name = "manImpl")//注意是manImpl不是ManImpl,因为使用@Service,容器为我们创建bean时默认类名首字母小写  
    private Human human;  
  
}  

如果是使用的@Autowired注解,要配上@Qualifier("manImpl"),代码如下:

package testwebapp.com.wangzuojia.service.impl;  
  
import java.util.Map;  
  
import javax.annotation.Resource;  
  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.beans.factory.annotation.Qualifier;  
import org.springframework.stereotype.Service;  
  
import testwebapp.com.wangzuojia.dao.SequenceMapper;  
import testwebapp.com.wangzuojia.service.Human;  
import testwebapp.com.wangzuojia.service.SequenceService;  
  
@Service  
public class SequenceServiceImpl implements SequenceService {  
  
    @Resource  
    private SequenceMapper sequenceMapper;  
    public void generateId(Map<String, String> map) {  
        sequenceMapper.generateId(map);  
          
    }  
      
    @Autowired  
    @Qualifier("manImpl")  
    private Human human;  
  
}  




猜你喜欢

转载自blog.csdn.net/cheidou123/article/details/57962931
今日推荐