构造方法

Java BigDecimal详解

血红的双手。 提交于 2020-02-05 03:06:25
1.引言   float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。 先看下面代码 public static void main(String[] args) { System.out.println(0.2 + 0.1); System.out.println(0.3 - 0.1); System.out.println(0.2 * 0.1); System.out.println(0.3 / 0.1); } 运行结果如下 你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。 其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math

Java学习46:自定义异常

扶醉桌前 提交于 2020-02-05 02:22:06
Java标准库定义的异常有: 当我们在代码中需要抛出异常时,尽量使用JDK已定义的异常类型。例如,参数检查不合法,应该抛出IllegalArgumentException: static void process1(int age) { if (age <= 0) { throw new IllegalArgumentException(); } } 在一个大型项目中,可以自定义新的异常类型,但是,保持一个合理的异常继承体系是非常重要的。 一个常见的做法是自定义一个BaseException作为“根异常”,然后,派生出各种业务类型的异常。 BaseException需要从一个适合的Exception派生,通常建议从RuntimeException派生: public class BaseException extends RuntimeException { } 其他业务类型的异常就可以从BaseException派生: public class UserNotFoundException extends BaseException { } public class LoginFailedException extends BaseException { } ... 自定义的BaseException应该提供多个构造方法: public class BaseException

Spring(四)核心容器 - BeanDefinition 解析

大城市里の小女人 提交于 2020-02-05 00:10:28
前言 在上篇文章中,我们讨论了 refresh 的前四个方法,主要是对 ApplicationContext 上下文启动做一些准备工作。原计划是对接下来的 invokeBeanFactoryPostProcessors 方法进行讨论,但该方法涉及 Spring 中一个非常重要的概念: BeanDefinition,所以,这里先对 BeanDefinition 进行讨论,这样也有利于完善 Spring 的知识体系。 注:本篇文章使用的 SpringBoot 版本为 2.0.3.RELEASE,其 Spring 版本为 5.0.7.RELEASE 正文 现如今,我们一般获取对象的方式有两种,一种是手动直接 new;另一种是交给 Spring 管理,Spring 将管理的对象称之为 Bean,容器会先实例化 Bean,然后自动注入,实例化的过程就需要依赖 BeanDefinition。 BeanDefinition 用于保存 Bean 的相关信息,包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等,它是实例化 Bean 的原材料,Spring 就是根据 BeanDefinition 中的信息实例化 Bean。 BeanDefinition的继承体系 BeanDefinition 是一个接口,它有多个实现类,这些实现类分别描述不同类型的 Bean。

7.13 作业 韩宗轩

ⅰ亾dé卋堺 提交于 2020-02-04 16:36:12
1:代码块是什么?代码块的分类和各自特点? 在Java中,使用{}括起来的代码被称为代码块。 2:静态代码块,构造代码块,构造方法的执行流程? 静态代码块:随着类加载而加载,且执行一次. 构造代码块:(初始化块) 每创建一次就执行一次,优先于构造方法执行. 构造方法:给对象的数据(属性)进行初始化. 3:继承概述 让类与类之间产生关系,子父类关系 4:继承的好处 * a:提高了代码的复用性 * b:提高了代码的维护性 * c:让类与类之间产生了关系,是多态的前提 5:Java中继承的特点 * a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)(多继承有安全隐患) * 有些语言是支持多继承,格式:extends 类1,类2,... * b:Java支持多层(重)继承(继承体系) 6:Java中继承的注意事项?以及我们什么时候使用继承? * a:子类只能继承父类所有非私有的成员(成员方法和成员变量) * b:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。 * c:不要为了部分功能而去继承 继承就是一种关系,如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。 7:继承中的成员访问特点 A:成员变量 在子类方法中访问一个变量 B:成员方法 在测试类中通过子类对象去访问一个方法 8

day10作业

微笑、不失礼 提交于 2020-02-04 16:33:19
1.Java中,用{}括起来的代码称为代码块。 代码块分为局部代码块,构造代码块,静态代码块,同步代码块 局部代码块:在方法中出现,限定生命周期,及早释放,提高内存利用率 构造代码块:在类中方法外出现,多个构造方法中相同的代码块放到一起,每次调用构造都执行,并且在构造方法前执行 静态代码块:在类中方法外出现,并加上static修饰符;用于给类进行初始化,在加载的时候就执行,并且只执行一次。一般用于加载驱动,位于主方法类中的静态代码块先于主方法执行。 2.静态代码块——构造代码块——构造方法 3.让类与类之间产生关系,子父类关系。 4.a.提高了代码的复用性 b.提高了代码的维护性 c.让类与类之间产生了关系,是多态的前提 5.a:java只支持单继承,不支持多继承 b:java支持多重继承 6.注意事项: a:子类只能继承父类所有非私有的成员(成员方法和成员变量) b:子类不能继承父类的构造方法,但是可以通过关键字super去访问父类的构造方法 c:不要为了部分功能而去继承 继承体现的是一种关系“is a”,如果有两个类A,B,只有他们符合A是B的一种或者B是A的一种,就可以考虑使用继承。 7.A:如果子类中没有这个成员变量就访问父类中的该成员变量,如果子类中有这个成员变量,就默认使用该成员变量。 B:子类中所有的构造方法都会访问父类中的空参构造。 8.在继承中

day08作业-韩明琰

懵懂的女人 提交于 2020-02-04 16:32:15
类和对象作业 填空题 1.类是组成Java程序的基本要素,类体有两部分构成:一部分是变量的定义,另一部分是_____方法______ 的定义。 2.执行Person p = new Person();语句后,将在___堆内存________中给Person对象分配空间,并在栈内存中给引用变量p分配空间,存放Person对象的引用。 3._____构造______是一种特殊方法,它的名字必须与它所在的类的名字完全相同,并且不书写返回值类型,在创建对象实例时系统自动调用。 4.局部变量的名字与成员变量的名字相同,若想在该方法内使用成员变量,必须使用关键字 _____this_______ 。 5.使用关键字 ____this_______ 来调用同类的其它构造方法,优点同样是以最大限度地代码的利用程度 ,减少程序的维护工作量。 6.用关键字 _____static_______ 修饰的成员变量是类变量,类变量是指不管类创建了多少对象,系统仅在第一次调用类的时候为类变量分配内存,所有对象共享该类的类变量。 7.使用static修饰的变量称为静态变量,静态变量可以有两种访问方式,分别是类名.静态变量名和___ ______对象名______________。 8.在一个类文件中的关键字package,import,class出现的可能顺序是___ _____package import

ArrayList源码分析(超全超长)

霸气de小男生 提交于 2020-02-04 04:28:34
ArrayList是Java非常重要的集合类,相信大家对它并不陌生。List和Map号称是Java最常用、使用最广泛的集合类,比如,我们从数据库获取多个数据的时候,都是返回List集合,我还没见过返回过Set集合;所以相比之下,Set集合使用的场景就非常少。不过这篇博客主要讲解ArrayList面试题及源码分析,未涉及到Set集合、Map集合。 在认识ArrayList之前,我们先回顾一下数组,因为Arrayist底层是基于变长数组实现的。 数组 数组是基于线性数据结构实现的,在Java中创建数组时,会在内存中划分出一块连续的内存空间,然后再根据数组长度划分成跟数组长度一样的一小块内存空间。 我们来画个图简单描述一下, 下面图中创建了字符串数组,定义它的长度为5,所以就会在内存中创建一大块连续的内存,然后再分成5小块内存(等分),并且该数组中的元素都有默认值:null。 基本所有的数组面试题,都会有一个说法:就是 数组的特点是,查询修改快,增加删除慢 。 我们还知道在数组中有索引这个概念, 当数组内存空间分配好了之后,会为每个元素分配一个索引,从0开始,直到数组长度-1 。索引非常重要,因为数组的增删改查都是基于索引实现的。 如果我们想查询的时候,直接根据索引来查询 string[0]; 如果我们想修改的时候,也是根据索引来修改 string[0] = “java”;

String类

自闭症网瘾萝莉.ら 提交于 2020-02-04 02:36:42
String 类 “ == ”与“ equals() ”的区别 “==” 是 java 提供的关系运算符,主要功能是进行数值相等判断的,如果用在了 String 对象上,表示的是内存地址数值的比较; “ equals ”是由 String 提供的一个方法,负责进行字符串内容的比较 在开发时,如果要判断输入的内容是否是某一字符串,应将字符串写在最前面 String 的两种实例化方式区别: 方式一:直接赋值 String str = “hello”; 方式二:构造方法 String str = new String(“hello”); 问:采用方式一 String stra = “hello”; String strb = “hello”; String strc = “world”; System.out.println(stra==strb) //true System.out.println(stra==strc) //false 共享设计模式: 在 JVM 的底层实际上会存在一个对象池(不一定只保存 String 对象),当代码之中使用了直接赋值的方式定义了一个 String 类对象时,会将此字符串对象所使用的匿名对象入池保存。而后如果后续还有其他 String 类对象也采用了直接赋值的方式,并且设置了同样内容的时候,那么将不会开辟新的堆内存空间

构造方法伪造成属性及修改属性值

偶尔善良 提交于 2020-02-03 18:48:12
构造方法伪造成属性、修改和删除属性值 在类的构造中,如果所要求得的结果是名词,但是结果的求值必须通过类的构造方法才能实现,那么可以通过在方法上添加装饰器把方法伪造成类的属性进行打印,这样就符合了名词的要求。 把方法伪造成类的属性: @property 伪造的属性名是构造方法的方法名,属性值是构造方法的返回值 ,使用@property后调用不需要加括号。 Note 注意:凡是类似于bmi这种需要计算并且名字又是名词属性的,都需要在构造方法上添加@property装饰器 ''' 计算bmi值,第一种方式:把bmi的作为构造方法,可以实现基本bmi求值 ''' class Person(object): def __init__(self, name, age, weight, hight): self.name = name self.age = age self.__weight = weight self.__hight = hight def bmi(self): return '%s的bmi值为%s' % (self.name, self.__weight / self.__hight ** 2) p1 = Person('李镇', 18, 120, 1.77) print(p1.bmi()) # 这中方式虽然可以实现求值,语法也没有问题,但是bmi是名词,方法确是动词

需要多个参数输入时-----------------考虑使用变种的Builder模式

放肆的年华 提交于 2020-02-02 19:47:27
业务需求: 创建一个不可变的Person对象,这个Person可以拥有以下几个属性:名字、性别、年龄、职业、车、鞋子、衣服、钱、房子。 要求: 其中名字和性别是必填项,而其他选填项可以根据情况自由输入。 具体实现: 1.为了保证对象的不可变,我们要将Person类中的每一个属性都声明为private final的。 2.在Person类中定义一个内部类Builder。 (1)这个Builder内部类中的属性要和Person中的相同,并且 必须有的属性( 名字和性别)要用final修饰,防止这些属性没有被赋值。 (2)其中必填项使用Builder的构造方法接收值,选填项使用返回值为Builder的方法接收值。 (3)最后定义了一个build方法,将Builder对象传入Person的私有构造方法,最终返回一个Person对象。 3.Person的私有构造方法的写法:不直接传入属性,而是传入一个Builder对象。 方法调用: 必填项使用Builder构造方法传入,非必须的属性可以根据需要任意设置。 转载于 Java 大白话讲解设计模式之 -- 建造者(Builder)模式 。 来源: https://www.cnblogs.com/dxtlearningblockchain/p/12253235.html