-
接口不能用new创建对象,为什么接口数组可以用new创建对象,请教啊
2017-03-14 07:50:45 CharSequence是一个接口 -
java为什么要用接口声明对象而具体类创建对象?
2017-09-13 21:55:34一 首先接口不能实例化对象这是毋庸置疑的 !!!! 原因:1.实际语义是实例化一个实现该接口的匿名内部类,接口本身是用来抽象的,实例化接口没有意义。 2.实例化实际意义是在jvm的堆中开辟出一块内存空间,比如...一 首先接口不能实例化对象这是毋庸置疑的 !!!!
原因:1.实际语义是实例化一个实现该接口的匿名内部类,接口本身是用来抽象的,实例化接口没有意义。
2.实例化实际意义是在jvm的堆中开辟出一块内存空间,比如Student s = new Student();此处声明Student对象s,并且实例化一个Student对象,实则是在堆中开辟出一块空间来存放Student对象,s则是指向这块空间,也就是内存中的一块地址。这块地址中所存放的值就是我们这个Student对象的一些属性。而接口是抽象,没有具体方法的实现,但是有静态变量。
3.本人认为 类继承实现了接口就类似于子类继承父类(因为你继承接口的时候把方法重写了,就类似于直接季继承了父类,在这理解为向上转型。) 而且new dd()可以理解为一个匿名类,这样的话返回的值向上兼容,这样的话,接口引用c就指向了具体的实现接口的对象,多态的体现。
这样的好处在于通过接口c来调用的方法可以屏蔽掉具体的方法实现。换而言之,我只需要知道c要做什么,而不需要知道c怎么做。。
也就是在JAVA编程中经常用到的接口回调,即面向接口的编程
更为重要的一点是Collection c只是引用,是一个指向具体实现类的引用。 -
抽象类为甚不能创建对象以及接口与抽象类的异同
2020-07-10 14:37:49因为抽象类多用于在同类事物中有无法具体描述的方法的场景,所以不能通过创建对象来实例化这个事物。 什么是抽象类: 如果一个类中包含抽象方法,那么这个类就是抽象类(abstract class)。 注意: 只要包含...抽象类为甚不能直接创建对象?
- 子类更具体,父类更抽象 直接创建父类对象对象本身没有意义
- 如果创建的是父类对象在调用方法的时候,调用的是父类中的方法。
- 因为父类引用指向子类对象时,调用的方法是子类重写的方法,那么在创建子类对象时需要先调用父类的构造方法。
什么是抽象类:
如果一个类中包含抽象方法,那么这个类就是抽象类(abstract class)。
注意:
- 只要包含一个抽象方法的类就必须声明成抽象类。
- 抽象类可以声明方法的存在而不去实现它,被声明的抽象方法不能包含方法体。
- 抽象类在使用过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。
说到抽象类我们必然想到了接口,那么为甚要有接口?
- 引入接口是因为java中不支持多继承,就是一个类只能有一个父类,所以可以采用多个接口来实现多重继承的目的,接口是一种特殊的抽象类。
注意:
- 没有声明任何方法也就是说实现这些接口的类不需要重写任何方法,也叫表示接口,他只充当一个标识的作用。
接口与抽象类的相同点:
- 都不能被实例化。
- 接口的实现类或抽象类的子类都只有实现 了接口或抽象类中的方法后才能被实例化。
接口与抽象类的不同点:
- 接口只有定义。
- 接口需要实现,但抽象类只能被继承。
- 接口强调特定功能的实现,抽象类强调所属关系。
- 接口中定义的成员变量默认为public static final,数据成员必须赋初值,所有成员方法都是public abstract的。抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法。抽象类中的抽象方法不能用private,static ,synchronized,native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号。
-
为什么不能通过new List()方式创建对象
2014-01-08 09:38:29在java.util里面List是一个接口,所以不能直接初始化,所以会编译错误 你可以List l =new ArrayList();这样是可以的,因为 ArrayList是实现List接口的 或者List l = new LinkedList(); LinkedList同样实现了List...在java.util里面List是一个接口,所以不能直接初始化,所以会编译错误
你可以List l =new ArrayList();这样是可以的,因为 ArrayList是实现List接口的
或者List l = new LinkedList(); LinkedList同样实现了List接口 我们一般使用List都是new ArrayList();
-
Spring框架getBean()方法返回对象为什么只能转成接口对象,转换成接口的实例会报错?
2020-01-17 14:03:40问题的出现是因为有人问我,为什么他在学习Spring框架的时候,他在xml文件当中定义了一个Bean,最后在调用getBean()方法获取这个Bean的时候,必须转换成这个Bean对应的接口,而不能转换成这个接口的实现类。...问题的出现是因为有人问我,为什么他在学习Spring框架的时候,他在xml文件当中定义了一个Bean,最后在调用getBean()方法获取这个Bean的时候,必须转换成这个Bean对应的接口,而不能转换成这个接口的实现类。
我在网上一查,发现也有对应的问题,但是感觉对应的答案都不够正确,或者不够解答我的疑惑
现在我们开始重现这个问题
第一步:创建接口和对应的实现类
//对应接口 public interface ICar { void move(); } //对应的实现类 @Transactional public class MyBenz implements ICar { @Override public void move() { System.out.println("my car"); } }
第二步:编写对应的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:myname="http://www.example.org/schema/user" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.example.org/schema/user http://www.example.org/schema/user.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置HikariDataSource数据源 --> <bean id = "dataSource" class = "com.zaxxer.hikari.HikariDataSource"> <property name="username" value="root"></property> <property name="password" value="123456"></property> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3307/my_oracle?serverTimezone=GMT"></property> </bean> <!-- 定义事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /><!-- ref:引入数据源 --> </bean> <!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务启动事物注解 transaction-manager的值必须和上面这个bean的id一样--> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false" /> <!--配置bean,class属性我们设置为实现类--> <bean id="myBenz" class="com.fsl.springbootjunit.spring.test3.MyBenz"></bean> </beans>
第三步:进行测试
public static void main(String[] args) { ApplicationContext bf = new ClassPathXmlApplicationContext("spring/applicationContext-beans.xml"); MyBenz myBenz = (MyBenz)bf.getBean("myBenz"); myBenz.move(); }
结果如下,会出现java.lang.ClassCastException:
我们在配置文件当中配置的Bean的class属性明明就是com.fsl.springbootjunit.spring.test3.MyBenz,但是为什么我们getBean()的时候,转成对应的类型会报类型转换错误呢?
问题解答
首先我们要知道的是,Spring的AOP的实现底层是使用的代理模式,它就是通过创建对应的代理对象,通过对代理对象的方法运行前后进行处理来达到目的。我们使用的事务也是如此,给创建一个代理对象,在这个方法运行之前,Spring帮助开启事务,方法运行之后,Spring帮助我们提交事务或者回滚事务。
Spring创建代理对象的代码如下:
@Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { //在创建代理对象之前进行一系列判断,来决定是使用JDK代理还是CGLIB代理 //isOptimize:使用cglib代理是否使用激进的优化策略 //isProxyTargetClass:是否对目标本身进行代理,而不是对目标类的接口进行代理 //hasNoUserSuppliedProxyInterfaces:是否不存在代理接口 if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class<?> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: " + "Either an interface or a target is required for proxy creation."); } if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); } }
在创建对象开始之前,会进行判断来决定使用JDK动态代理还是CGLIB动态代理,因为这两种代理模式对代理对象的要求不同,比如JDK动态代理就要求被代理的对象实现了某个接口。
其中有一个属性很重要,isProxyTargetClass,这个就用来判断,是否对目标本身进行代理,而这个属性,默认是false
现在我们就能够知道,原来代理对象在生成的过程当中,是去找到被代理对象的接口,依据那个接口来生成的对象,而不是依据目标本身生成的。
ApplicationContext bf = new ClassPathXmlApplicationContext("spring/applicationContext-beans.xml"); Object myBenz = bf.getBean("myBenz"); //这里返回true,因为是依据这个接口生成的代理对象 System.out.println(myBenz instanceof ICar); //这里返回false,因为这个是代理目标类,但是Spring默认的不以这个去生成代理对象 System.out.println(myBenz instanceof MyBenz);
那假如我们就想以目标类去生成代理对象呢?
通过上面的分析,大家肯定也能够回答出来,我把proxyTargetClass属性设置为true就可以了。
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
在执行下面的这个代码,我们就能够看到对应的效果
ApplicationContext bf = new ClassPathXmlApplicationContext("spring/applicationContext-beans.xml"); Object myBenz = bf.getBean("myBenz"); //返回true System.out.println(myBenz instanceof ICar); //返回true System.out.println(myBenz instanceof MyBenz);
-
Java对象为什么要事先序列化接口
2018-11-04 11:54:18客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累... -
解析java为什么不能创建FilterInputStream流
2016-04-05 21:31:34FilterInputStream这个流很奇怪,它本身是个很正常的类:public class FilterInputStream extends InputStream ,既不是接口也不是抽象类,可是使用的时候发现根本不能创建FilterInputStream 流对象 ,看它的源... -
Spring学习笔记:创建复杂对象、控制Spring工厂创建对象的次数
2020-05-24 15:12:09Spring工厂创建复杂对象的3种方式2.1 FactoryBean接口开发步骤简单对象与复杂对象的比较细节分析ConnectionFactoryBeanFactoryBean的实现原理[简易版]FactoryBean总结2.2 实例工厂ConnectionFactory2.3 静态工厂... -
面试题:为什么使用mapper接口能对数据库进行访问?
2020-03-03 22:21:59为什么使用mapper接口能对数据库进行访问? (理论回答/画图(流程图、时序图、类图等)) debug开始 获取sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); 创建SqlSession的步骤 1、首先从... -
抽象和接口为什么不能实例化
2019-09-25 10:12:53(2)什么是初始化对象:就是我们在创建一个东西的时候需要给他一个最初的状态,他创建出来长什么样子 因为我们的抽象类中可以定义基本属性,这些基本属性需要通过构造函数对其进行初始化, 例如:我们定义一个狗的... -
spring -3 创建复杂对象及控制对象的创建次数
2021-02-04 13:25:28spring为什么要控制对象的创建次数呢? 如何控制: 什么样的对象只创建一次呢? 什么是复杂对象? 简单对象:直接通过new的方式可以直接创建的。Person per = new Person(); 复杂对象:不能直接通过new构造方法... -
ArrayList与List的关系?什么的面向对象接口编程?
2018-03-09 09:56:18List接口不能实例化对象,但我们可以为List接口创建一个指向自己的对象引用,而ArrayList就是这个充当指向List接口的对象引用。 面向对象编程三大特征之多态。 多态:父类的引用指向子类的对象。... -
为什么start方法会调用run方法?(为什么不能直接run来实现创建线程?)
2019-12-06 19:29:14我们知道再创建线程的时候是使用Thread类中的start方法,那么为什么不直接用Thread类中的run方法呢? 来直接上源码: Thread中的run方法如下。 那么target是什么呢? 我们可以看到是一个Runable对象。那么Thread... -
为什么接口中属性要用 public static final 修饰?
2019-07-22 09:45:59为什么接口中变量要用 public static final 修饰? 用 public 的原因:对外提供服务,让接口的实现类可以使用常量 用 static 的原因:表示接口是属于类的,因为接口不可以创建对象,故不属于对象,所以要用static来... -
JavaScript中如何创建对象以及继承的实现
2019-05-09 10:02:21我为什么把创建对象和继承放在一起说呢?那是因为对象的创建是理解继承的前提,继承,那当然是对象的继承。 一、创建对象 虽然Object构造函数和对象字面量都可以用来创建单个对象,但是它们都有一个明显的缺点:... -
更新尺寸调用什么方法_为什么start方法会调用run方法?(为什么不能直接run来实现创建线程?)...
2021-01-09 04:46:30我们知道再创建线程的时候是使用Thread类中的start方法,那么为什么不直接用Thread类中的run方法呢?来直接上源码: Thread中的run方法如下。那么target是什么呢?我们可以看到是一个Runable对象。那么Thread类中的... -
创建普通内部类对象与创建嵌套类对象的不同
2015-12-09 16:05:17为什么需要使用内部类? 使用内部类的原因:每个内部类都能独立的继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)的实现,对内部类都没有影响。实际上内部类有效的实现了“多重继承”,就是... -
为什么SQL创建oracle服务器链接成功,但是不能操作oracle数据库?
2015-11-02 06:07:25报如下错误: 链接服务器"ORAC"的 OLE DB 访问接口 "MSDAORA" 返回了消息 "ORA-12154: TNS: 无法解析...消息 7303,级别 16,状态 1,第 1 行无法初始化链接服务器 "ORAC" 的 OLE DB 访问接口 "MSDAORA" 的数据源对象。 -
使用ArrayList类为什么用List接口声明?
2019-09-28 18:49:45List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了...此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了Arr... -
java为什么要定义接口等相关解释
2016-07-21 10:11:001、接口的作用是实现多重继承 因为只能继承一个类(规定的)...而interface关键词则创建了一种完全抽象的,根本不提供实现的类,它不仅是一种是抽象类的极端表现的形式,而且是一种能让你将一个对象上传到多个基类的... -
为什么构造函数不能为虚函数
2014-03-11 15:31:081.含义上 虚函数含义: 虚函数采用一种叫虚调用的方式,虚调用是一种在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数...而构造函数实在创建对象的时候自动调用的,不可 -
匿名内部类可不可以继承或实现接口。为什么?
2020-11-02 17:34:32为什么? 答:匿名内部类是没有名字的内部类,不能继承其它类,但一个内部类可以作 为一个接口,由另一个内部类实现. 1、由于匿名内部类没有名字,所以它没有构造函数。因为没有构造函数, 所以它必须完全借用父类的构造... -
实体类为什么要实现序列化接口?
2018-05-03 14:06:03客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累... -
接口
2020-02-26 17:46:55接口从语法角度来说像是一种特殊的抽象类,两者都可以包含抽象方法且不能创建对象。 接口是一种标准,通常用来约束其子类(实现类)应具备的功能。 为什么需要接口? 可以降低程序间耦合,更自然的使用多态。 可以... -
接口和抽象类有什么区别?
2016-01-22 20:24:52含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstractclass,abstractclass类中的方法不必是抽象的。abstractclass类中定义抽象方法必须在具体(Concrete)... -
Python 类与对象编程详解五(抽象类,接口类)
2020-04-16 21:00:49在客户的应用程序中,抽象类是不能正常实例化的,它的子类叫做具体类,这表明它们才是真正用来在客户应用程序中创建对象的类。 为什么要有抽象类 如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆... -
Entity实体类为什么要实现Serializable接口才能被序列化
2017-03-11 19:43:12客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累... -
什么时候用抽象类什么时候用接口
2012-04-12 11:16:34另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。 如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类... -
构造函数为什么不能为虚函数
2019-10-08 00:38:19但是如果要创建一个对象,则必须要知道对象的准确类型,因此构造函数不能为虚。 虚函数既然那么有用,我们是否可以把每个函数都声明为虚函数? 不行,这是因为虚函数是要有代价的:由于每个虚函数的对象都...
-
2010-2011年品牌微博营销执行方案.ppt
-
【硬核】一线Python程序员实战经验分享(1)
-
STL 容器的常用操作(未完成)
-
QT学习第一次作业
-
css样式“list-style:none”是什么意思?
-
网络营销知识仓库.txt
-
linux ubuntu18.04 英伟达驱动 实测能装上 识别1080ti 1070ti显卡 NVIDIA-Linux-x86_64-460.39.run
-
MySQL 数据库权限管理(用户高级管理和精确访问控制)
-
JVM
-
2021-02-28
-
PowerBI重要外部工具详解
-
前端面试应届毕业生(hr问的)
-
基于Qt的LibVLC开发教程
-
B站弹幕爬取并制成词云
-
MySQL Router 实现高可用、负载均衡、读写分离
-
动车组轴温检测系统仿真设计.zip
-
大数据的基本概况.jpg
-
【考研初试】安徽建筑大学702公共管理学考研真题库资料
-
jquery怎么判断radio是否选中
-
ROSE-HA-V8.9+Win2008+SQL2008双机配置详细指南(图文).pdf