精华内容
下载资源
问答
  • ![图片说明](https://img-ask.csdn.net/upload/201703/14/1489477795_107145.png) CharSequence是一个接口
  • 一 首先接口实例化对象这是毋庸置疑的 !!!! 原因: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只是引用,是一个指向具体实现类的引用。
    展开全文
  • 因为抽象类多用于在同类事物中有无法具体描述的方法的场景,所以不通过创建对象来实例化这个事物。 什么是抽象类: 如果一个类中包含抽象方法,那么这个类就是抽象类(abstract class)。 注意: 只要包含...

    抽象类为甚不能直接创建对象?

    1. 子类更具体,父类更抽象 直接创建父类对象对象本身没有意义
    2. 如果创建的是父类对象在调用方法的时候,调用的是父类中的方法。
    3. 因为父类引用指向子类对象时,调用的方法是子类重写的方法,那么在创建子类对象时需要先调用父类的构造方法。

    什么是抽象类:

    如果一个类中包含抽象方法,那么这个类就是抽象类(abstract class)。

     

    注意:

    • 只要包含一个抽象方法的类就必须声明成抽象类。
    • 抽象类可以声明方法的存在而不去实现它,被声明的抽象方法不能包含方法体。
    • 抽象类在使用过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。

     

    说到抽象类我们必然想到了接口,那么为甚要有接口?

    • 引入接口是因为java中不支持多继承,就是一个类只能有一个父类,所以可以采用多个接口来实现多重继承的目的,接口是一种特殊的抽象类。

    注意:

    • 没有声明任何方法也就是说实现这些接口的类不需要重写任何方法,也叫表示接口,他只充当一个标识的作用。

     

    接口与抽象类的相同点:

    • 都不能被实例化。
    • 接口的实现类或抽象类的子类都只有实现 了接口或抽象类中的方法后才能被实例化。

     

    接口与抽象类的不同点:

    • 接口只有定义。
    • 接口需要实现,但抽象类只能被继承。
    • 接口强调特定功能的实现,抽象类强调所属关系。
    • 接口中定义的成员变量默认为public static final,数据成员必须赋初值,所有成员方法都是public abstract的。抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法。抽象类中的抽象方法不能用private,static ,synchronized,native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号。
    展开全文
  • 在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框架的时候,他在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);

     

     

    展开全文
  • 客户端访问了某个开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累...
  • FilterInputStream这个流很奇怪,它本身是个很正常的类:public class FilterInputStream extends InputStream ,既不是接口也不是抽象类,可是使用的时候发现根本不能创建FilterInputStream 流对象 ,看它的源...
  • Spring工厂创建复杂对象的3种方式2.1 FactoryBean接口开发步骤简单对象与复杂对象的比较细节分析ConnectionFactoryBeanFactoryBean的实现原理[简易版]FactoryBean总结2.2 实例工厂ConnectionFactory2.3 静态工厂...
  • 为什么使用mapper接口能对数据库进行访问? (理论回答/画图(流程图、时序图、类图等)) debug开始 获取sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); 创建SqlSession的步骤 1、首先从...
  • (2)什么是初始化对象:就是我们在创建一个东西的时候需要给他一个最初的状态,他创建出来长什么样子 因为我们的抽象类中可以定义基本属性,这些基本属性需要通过构造函数对其进行初始化, 例如:我们定义一个狗的...
  • spring为什么要控制对象创建次数呢? 如何控制: 什么样的对象创建一次呢? 什么是复杂对象? 简单对象:直接通过new的方式可以直接创建的。Person per = new Person(); 复杂对象:不直接通过new构造方法...
  •  List接口实例化对象,但我们可以List接口创建一个指向自己的对象引用,而ArrayList就是这个充当指向List接口对象引用。 面向对象编程三大特征之多态。 多态:父类的引用指向子类的对象。...
  • 我们知道再创建线程的时候是使用Thread类中的start方法,那么为什么不直接用Thread类中的run方法呢? 来直接上源码: Thread中的run方法如下。 那么target是什么呢? 我们可以看到是一个Runable对象。那么Thread...
  • 为什么接口中变量要用 public static final 修饰? 用 public 的原因:对外提供服务,让接口的实现类可以使用常量 用 static 的原因:表示接口是属于类的,因为接口不可以创建对象,故不属于对象,所以要用static来...
  • 为什么创建对象和继承放在一起说呢?那是因为对象的创建是理解继承的前提,继承,那当然是对象的继承。 一、创建对象 虽然Object构造函数和对象字面量都可以用来创建单个对象,但是它们都有一个明显的缺点:...
  • 我们知道再创建线程的时候是使用Thread类中的start方法,那么为什么不直接用Thread类中的run方法呢?来直接上源码: Thread中的run方法如下。那么target是什么呢?我们可以看到是一个Runable对象。那么Thread类中的...
  • 为什么需要使用内部类? 使用内部类的原因:每个内部类都独立的继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)的实现,对内部类都没有影响。实际上内部类有效的实现了“多重继承”,就是...
  • 报如下错误: 链接服务器"ORAC"的 OLE DB 访问接口 "MSDAORA" 返回了消息 "ORA-12154: TNS: 无法解析...消息 7303,级别 16,状态 1,第 1 行无法初始化链接服务器 "ORAC" 的 OLE DB 访问接口 "MSDAORA" 的数据源对象
  • List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了...此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不再用了。而ArrayList list=new ArrayList();创建对象则保留了Arr...
  • 1、接口的作用是实现多重继承 因为只能继承一个类(规定的)...而interface关键词则创建了一种完全抽象的,根本不提供实现的类,它不仅是一种是抽象类的极端表现的形式,而且是一种让你将一个对象上传到多个基类的...
  • 1.含义上 虚函数含义: 虚函数采用一种叫虚调用的方式,虚调用是一种在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数...而构造函数实在创建对象的时候自动调用的,不可
  • 为什么? 答:匿名内部类是没有名字的内部类,不继承其它类,但一个内部类可以作 为一个接口,由另一个内部类实现. 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)...
  • 在客户的应用程序中,抽象类是不正常实例化的,它的子类叫做具体类,这表明它们才是真正用来在客户应用程序中创建对象的类。 为什么要有抽象类 如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆...
  • 客户端访问了某个开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累...
  • 另一方面,接口一旦创建就不更改。如果需要接口的新版本,必须创建一个全新的接口。   如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合不相关的类...
  • 但是如果要创建一个对象,则必须要知道对象的准确类型,因此构造函数不能为虚。  虚函数既然那么有用,我们是否可以把每个函数都声明虚函数?  不行,这是因为虚函数是要有代价的:由于每个虚函数的对象都...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 628
精华内容 251
关键字:

为什么接口能创建对象