构造器

谜题40:不情愿的构造器

≯℡__Kan透↙ 提交于 2020-04-08 13:57:47
尽管在一个方法声明中看到一个throws子句是很常见的,但是在构造器的声明中看到一个throws子句就很少见了。下面的程序就有这样的一个声明。那么,它将打印出什么呢? public class Reluctant { private Reluctant internalInstance = new Reluctant(); public Reluctant() throws Exception { throw new Exception("I‘m not coming out"); } public static void main(String[] args) { try { Reluctant b = new Reluctant(); System.out.println("Surprise!"); } catch (Exception ex) { System.out.println("I told you so"); } } } main方法调用了Reluctant构造器,它将抛出一个异常。你可能期望catch子句能够捕获这个异常,并且打印I told you so。凑近仔细看看这个程序就会发现,Reluctant实例还包含第二个内部实例,它的构造器也会抛出一个异常。无论抛出哪一个异常,看起来main中的catch子句都应该捕获它,因此预测该程序将打印I told

Spring是什么、spring容器、Spring三大核心思想DI(依赖注入)、IOC(控制反转)、AOP(面向切面编程)

走远了吗. 提交于 2020-04-08 06:59:19
1.Spring (1)Spring是什么? 是一个轻量级的、用来简化企业级应用开发的开发框架。 注: a.简化开发: Spring对常用的api做了简化,比如,使用Spring jdbc来访问数据库,就不用再考虑如何获取连接、关闭连接、处理异常等等。 b.解耦: Spring容器(Spring框架的一个模块)帮我们管理 对象(包括对象的创建及对象之间的依赖关系), 这样一来,对象之间的耦合度会大大降低,提供高了 系统的维护性。 c.集成其它框架: Spring可以将其它一些常用的框架集成进来,比如 可以将Quartz,MyBatis等集成进来。 (2)Spring容器 1)Spring容器是什么? Spring框架的一个核心模块,用于管理对象。 注: 管理对象指的是,spring容器会用我们创建对象, 并且建立对象之间的依赖关系。 2)如何启动Spring容器? step1.导包。 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.8.RELEASE</version> </dependency> step2.添加配置文件(applicationContext.xml)。 将配置文件添加到main/resources下。

JavaSE——反射机制

纵然是瞬间 提交于 2020-04-06 13:53:13
1、反射是什么? 2、通过反射获取类的Class对象 3、什么时候会发生类的初始化 4、类加载器 5、反射的一些方法 6、通过反射获取类的运行时结构 1、反射是什么? 动态语言在程序运行时可改变其结构,反射是java被视为动态语言的关键。 2、通过反射获取类的Class对象 2.1、 Class c1 = Class.forName ("包名+类名") ; 2.2、 Class c2 =对象.getClass(); . 2.3、 Class c3 =类名.class; 注意: 1.一个类在内存中只有一个Class对象 2.一个类被加载后,类的整个结构都会封装在Class对象中。 3、什么时候会发生类的初始化 3.1、类的主动引用(一定会发生类的初始化) 当虚拟机启动,先初始化main方法所在的类 new一个类的对象时 调用类的静态成员(除了final常量)和静态方法 通过反射调用时(使用java.lang.reflect包的方 法对类进行反射调用) 当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类 3.2、类的被动引用(不会发生类的初始化) 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化 通过数组定义类引用,不会触发此类的初始化 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了) 4

反射(获取构造器、方法)

半腔热情 提交于 2020-04-05 23:28:54
反射 反射: 1.获取class对象 方式1: Class clazz=Class.forName("全限定名") 方式2: Class clazz=类名.class; 方式3: Class clazz=对象.getClass; 2.可以获取对应类的构造方法(了解) Constructor con = clazz.getConstructor(Class .. paramClass); Person p = (Person) con.newInstance(参数);    persion.java package com.reflect; public class Persion { private Integer id; private String username; private String password; public Persion() { System.out.println("无参构造器"); } public Persion(Integer id, String username, String password) { this.id = id; this.username = username; this.password = password; System.out.println("带参构造器"); } public Integer getId() {

《java编程思想》多态与接口

我们两清 提交于 2020-04-05 18:56:10
向上转型   定义:把某个对象的引用视为对其基类类型的引用的做法被称为向上转型 方法调用绑定   将一个方法调用同一个方法主体关联起来被称作绑定。   前期绑定:程序执行前进行的绑定叫做前期绑定,前期绑定也是java中默认的绑定方式   后期绑定(动态绑定或运行时绑定):在运行时根据对象的类型进行绑定。在java中除了static方法和final方法之外,其他所有的方法都是后期绑定,也就是说,通常情况下,我们不用判断是否应该进行后期绑定,它会自动发生。 构造器和多态   构造器调用顺序:   (1) 调用基类构造器,此步骤会不断反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,一直到最低层的导出类   (2) 按声明顺序调用成员的初始化方法。   (3) 调用导出类构造器的主体       父类(静态变量、静态初始化块)>子类(静态变量、静态初始化块)>   父类(变量、初始化块)>父类构造器>子类(变量、初始化块)>子类构造器。(变量和初始化块按定义顺序初始化)     构造器内部的多态方法的行为   构造器调用的层次结构带来一个有趣的两难问题,如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法,会发生什么情况呢?众所周知,在一般的方法内部,动态绑定的调用是在运行时才决定的,因为对象无法知道它是属于方法所在的类,还是属于那个类的导出类

Java构造器(构造方法/constructor)

旧巷老猫 提交于 2020-04-05 17:06:59
  我们先来看一下什么是构造器: 1、构造器也叫构造方法或构造函数,分为有参构造器和无参构造器; 2、 构造器也是一种方法 ,只不过是一种特殊的方法,它会在对象创建的时候被调用; 3、 构造器最大的作用就是在创建对象的时候进行对象的初始化 ,有参构造器可以实现对象传参(后面会比较着来看有参构造器方便在哪儿了); 4、一个类可以有零个(如果没有自己定义编译器会帮你提供无参构造器)或多个构造器(【重载】不知道重载定义的小伙伴可以先记下概念); 5、构造器不能被子类继承,Java中子类会自动调用父类的构造器(同样,不了解的可以先记下概念或者跳过)   前面既然说了构造器是一种特殊的方法,我们就来看一下构造方法和普通方法的区别: 1、命名:构造器的方法名必须和类名相同,一般方法的方法名在命名规范的情况下可以随便定义。 2、修饰符:构造器不能被static、final、synchronized、abstract和native修饰 3、返回值:构造器没有返回值(但是不需要写void),一般方法要有返回值或者无返回值(void)   来看一下无参构造器的代码,同时看一下无参构造器的情况下(不定义构造器同理)是如何给属性赋值的: 1 package test; 2 3 public class Student01 { 4 //定义属性 5 public String name; 6 public

《Effect Java》 归纳总结

感情迁移 提交于 2020-04-03 22:06:44
目录: 一、创建和销毁对象 (1 ~ 7) 二、对于所有对象都通用的方法 (8 ~ 12) 三、类和接口 (13 ~ 22) 四、泛型 (23 ~ 29) 五、枚举和注解 (30 ~ 37) 六、方法 (38 ~ 44) 七、通用程序设计 (45 ~ 56) 八、异常 (57 ~ 65) 九、并发 (66 ~ 73) 十、序列化 (74 ~ 78) 正文: 第一章: 创建和销毁对象 1、考虑用静态工厂方法代替构造器 优: ① 有名称 ② 不必在每次调用它们的时候都创建一个对象 ③ 可以放回原返回类型的任何子类型的对象 ④ 在创建参数化类型实例的时候,代码更简洁 缺: ① 类如果不含公有的或受保护的构造器,就不能被子类化 ② 与其他一般的静态方法无多大区别 2、 遇到多个构造器参数时要考虑用构造器 3、用私有构造器或者枚举类型强化 Singleton 属性 4、通过私有构造器强化不可实例化的能力 5、避免创建不必要的对象 6、消除过期的对象引用 7、避免使用终结方法 第二章: 对于所有对象都通用的方法 8、覆盖 equals 时请遵守通用约定 ① 类的每个实例本质上是唯一的 ② 不关心类是否提供了“逻辑相等”的测试功能 ③ 超类已经覆盖了 equals, 从超类继承过来的行为对于子类也是合适的 ④ 类是私有的或包级私有的,可以确定它的 equals 方法永远不会被调用   

Java编程思想学习杂记(1-4章)

帅比萌擦擦* 提交于 2020-03-30 19:42:49
程序流程控制 移位运算符 移位运算符面向的运算对象是二进制的位,可单独用它们处理整数类型。左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),它使用“零扩展”:无论正负,都在高位插入0。若对char, byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只用右侧的5个低位才会用到。这样可防止我们在一个int数里移动一个不切实际的位数。若对一个long值进行移位,最后得到的结果也是long型。此时只会用到右侧6个低位,防止移动超过long值现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题,若对byte和short值进行又移位运算,得到的可能不是正确的结果。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。 移位可与等号(<<=或>>=或>>>=)组合使用。此时,运算符左边的值会移动由右边的值指定的位数,再将得到的结果赋值回左边的值。 public class Test { public static void main(String[] args) { int i = 8; i >>= 2; System.out

SSM框架中IoC、DI与AOP的理解

断了今生、忘了曾经 提交于 2020-03-30 13:06:38
  框架封装了普通项目中程序员需要重复书写的代码和调用过程,就比如说在传统的jsp项目中,我们的controller接收到前端的请求然后程序员就需要去开发Dao层,里面还涉及数据库的连接和存储过程的代码,大部分都是冗余的代码,而有了SSM框架后极大的简化了程序猿在controller以下层的开发,只需要一个service层和mapper层就行了,mapper层用来连接mapper.xml文件的,而直接用mapper.xml做sql语句的开发就行了,而数据库连接的和存储的过程都直接由Mybatis负责了,你只需要负责传递形参和接收返回数据就行了,这样就完成了一次完整的数据库交互! 1.1、IoC是什么   Ioc— Inversion of Control ,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转,哪些方面反转了”,那我们来深入分析一下: ● 谁控制谁,控制什么: 传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么

Spring DI的配置使用

心不动则不痛 提交于 2020-03-30 08:07:06
1.1.1 依赖和依赖注入 Spring IOC容器的依赖有两层含义:Bean依赖容器和容器注入Bean的依赖资源: a、Bean依赖容器:也就是说Bean要依赖于容器,这里的依赖是指容器负责创建Bean并管理Bean的生命周期,正是由于由容器来控制创建Bean并注入依赖,也就是控制权被反转了,这也正是IOC名字的由来,此处的有依赖是指Bean和容器之间的依赖关系。 b、容器注入Bean的依赖资源:容器负责注入Bean的依赖资源,依赖资源可以是Bean、外部文件、常量数据等,在Java中都反映为对象,并且由容器负责组装Bean之间的依赖关系,此处的依赖是指Bean之间的依赖关系,可以认为是传统类与类之间的“关联”、“聚合”、“组合”关系。 为什么要应用依赖注入,应用依赖注入能给我们带来哪些好处呢? 动态替换Bean依赖对象,程序更灵活 :替换Bean依赖对象,无需修改源文件:应用依赖注入后,由于可以采用配置文件方式实现,从而能随时动态的替换Bean的依赖对象,无需修改java源文件; 更好实践面向接口编程,代码更清晰 :在Bean中只需指定依赖对象的接口,接口定义依赖对象完成的功能,通过容器注入依赖实现; 更好实践优先使用对象组合,而不是类继承 :因为IOC容器采用注入依赖,也就是组合对象,从而更好的实践对象组合。 采用对象组合,Bean的功能可能由几个依赖Bean的功能组合而成