第一阶段
良好的编码规范
重构
day01
如何学编程
-
明确需求
-
分步骤实现以上需求
Java的三大平台
Java SE: Java标准平台,允许开发软件运行在电脑桌面上(用户需要下载,安装)
Java EE: Java企业平台,针对Web方向
Java ME: Java微型平台
多态的条件(继承)
- 继承
- 覆盖(重写)
- 父类引用指向子类对象
多态的好处
提高了程序的可拓展性和可维护性,屏蔽了不同实现类之间的实现差异,从而可以做到通用编程。
接口和抽象类的区别
相同点:
- 都可以定义抽象方法
- 都不能创建对象
- 子类继承抽象父类必须实现抽象父类中的所有抽象方法;实现类实现接口必须实现接口中所有的抽象方法
不同点:
- 接口中必须都是抽象方法和常量,抽象类中可以定义普通方法
- 接口可以多继承,抽象类只能单继承
- 抽象类用于约定子类应该具备的功能;接口用于约定实现类应该具备的功能
day04
this关键字
① 只能在构造方法中使用this调用其他的构造方法,不能在成员方法中使用它来调用构造方法
② 在构造方法中,使用this调用构造方法的语句必须是该方法的第一条执行语句,且只能出现一次
③ 不能在一个类的两个构造方法中使用this互相调用
this三种用法
①调用成员变量(了解即可)
②调用其他成员方法(非static)
③调用本类其他构造方法
super关键字
① 通过super调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。
② 如果子类构造方法没有显式调用父类构造方法时,那么jvm会默认调用父类的无参构造方法super()
super三种用法
①访问父类非私有字段(了解)
②访问父类非私有方法
③访问父类构造方法
static关键字
① 在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象
②在类中,被static修饰的成员变量和成员方法不属于对象,而是属于类的,被类的所有实例或对象所共享
③ 当类被加载时,静态代码块会执行,并且在类第一次使用时才会被加载,只会加载一次
静态方法特性
【1】静态方法中可以访问静态变量和类的其他静态方法,但不能访问非静态的
(类的字节码文件首先被加载到方法区/静态区,并为静态变量初始化并分配内存空间,而类的实例对象可能还没有创建和初始化,内存当中是【先】有的静态内容,【后】有的非静态内容。)
【2】实例方法中可以访问静态成员(静态变量和静态方法)
(静态成员在类加载的时候就已经被加载并分配好内存空间了,在实例对象创建前就已经被加载了)
【3】静态方法当中不能用this
(this代表当前对象,通过谁调用的方法,谁就是当前对象)
final关键字
① final修饰的类不能被继承
② final修饰的方法不能被子类重写
③ final修饰的变量(成员变量和局部变量)是常量,只能赋值一次
jvm扫描字节码文件
1》读取字段,计算未来new对象时所需要的堆空间
2》读取方法,标记方法签名,方便未来调用
3》扫描静态变量并分配内存空间
内部类
-
静态内部类:使用static修饰的内部类,那么访问内部类直接使用外部类名来访问
-
实例(成员)内部类:没有使用static修饰的内部类,访问内部类使用外部类的对象来访问
-
局部(方法)内部类:定义在方法中的内部类,一般不用
-
匿名内部类:特殊的局部内部类,适合于仅使用一次的类
[1] 当一个类只使用一次时,可以声明成匿名内部类
[2] 匿名内部类必须有实现存在
枚举概述
- 专门用于定义可罗列的常量值
- 是一种特殊的类,其中的枚举项(常量值)都是public static final 类名 的类型
- 可以声明变量,且变量的取值必须是枚举中定义的公共静态常量值
day05
工具类实现方式
- 静态方法(私有化构造器,方法使用static修饰)
- 单例
单例模式
目的:保证在整个应用中某一个类有且只有一个实例(一个类在堆内存只存在一个对象)
饿汉模式(线程安全)
- 创建该类的一个对象(用private static final修饰)
- 阻止外界实例化
- 提供单例的公共访问方法
(确定这个单例未来一定会用,用饿汉模式:立即创建)
懒汉模式(线程不安全)
- 创建该类的一个对象并赋为空(用private static修饰)
- 阻止外界实例化
- 提供单例的公共访问方法
(不确定这个单例用不用,用懒汉模式:延迟创建)
包装类概述
把一个基本数据类型封装到一个包装类中,类中向外提供了方法来操作这个基本数据类型
为什么需要包装类
在Java中,很多类的方法都需要接收引用类型的对象,此时无法将一个基本数据类型的值传入,通过包装类可以将基本数据类型的值包装为引用数据类型的对象,对象可以做更多的功能。
Integer常用方法
valueOf(int/String):将转换为
toString():返回一个表示该 值的
intValue():将转换为
parseInt(String):将转换为
*注:*Integer是int和String之间进行转换的桥梁
自动装箱
基本数据类型 —-直接赋值—-> 包装类对象
自动拆箱
包装类对象 —- 直接赋值 —-> 基本数据类型
包装类缓存设计
例:Integer包装类
Integer 在初始化的时候已经初始化好了256个Integer对象,并放到一个数组缓冲区中,如果范围在-128 到127,Integer 对象是在IntegerCache . cache 产生,会复用已有对象,直接从缓存中取, 这个区间内的 Integer 值可以直接使用==进行判断,如果超过了缓存的范围,都会在堆上产生新的对象,并不会复用已有对象,而是直接new一个新对象,所以超出范围再进行比较时结果为false,推荐使用 equals 方法进行判断。
BigDecimal
- 只要使用BigDecimal,一定使用含字符串的构造 。
day06
不可变字符串String
String在内存中是以字符数组的形式存在,String对字符数组进行了封装,并提供了只读的形式来操作这个字符数组。
String—-不可变字符串:当String对象创建完毕之后,它们的值在创建后就不能更改,一旦改变就变成了一个新的对象,因不可变,所以可以共享。程序当中直接写上的双引 字符串,就分配在方法区的常量池中。
程序当中所有的双引 字符串,都是String类的对象。
字符串比较(== ,equals)
- ==用于比较两个字符串对象的内存地址是否相同
- equals方法用于比较两个字符串中的字符值是否相等
**注:**如果比较双方一个常量一个变量,推荐把常量字符串写在前面。
重写equals方法
判断字符串非空
可变字符串
StringBuilder/StringBuffer: 当对象创建完毕之后,内容可以发生改变并且对象仍保持不变
(StringBuilder 和 StringBuffer 的区别 )
*相同点:*都是字符串可变缓冲区,api提供了相同的增删改查操作
*不同点:*StringBuffer(jdk1.0)线程安全但效率低;StringBuilder(jdk1.5)线程不安全但效率高
***注:***通常情况下,如果创建一个内容可变的字符串对象,应优先考虑StringBuilder类
StringBuffer(StringBuilder)和String的区别
① String类定义的字符串是常量,一旦创建后,内容和长度都是无法改变的;StringBuffer(StringBuilder)表示字符容器,其内容和长度可以随时修改。
②String类重写了Object的equals()方法,而StringBuffer(StringBuilder)没有重写。
③String类可以用操作符+进行连接,而StringBuffer(StringBuilder)对象之间不能。
自动扩容机制
初始化默认容量是16的可变字符串,如果超过了默认容量,则会自动进行扩容,每次扩容规则是(当前最大容量 + 1)* 2;
day07
Date
表示特定的瞬间,精确到毫秒
:可以自动设置当前系统时间的毫秒时刻
:指定long类型的构造参数,可以自定义毫秒时刻
:把日期对象转换为对应的时间毫秒值
SimpleDateFormat
:用给定的模式(格式)来指定格式化或解析的标准
- 格式化(format):按照指定的格式,将Date类型格式化为String类型
- 解析(parse):按照指定的格式,将String类型解析为Date类型
Calendar
Calendar类用于完成日期和时间字段的操作,Calendar本身是一个抽象类,不可以被实例化,通过调用其静态方法getInstance获取对象(此对象是单例的)
Date与Calendar之间相互转换:
方法会返回一个表示Calendar时间值的Date对象
方法接收一个Date对象,返回一个Calendar对象
小贴士:
西方星期的开始为周日,中国为周一。
在Calendar类中,月份的表示是从0-11分别代表1-12月。
日期是有大小关系的,时间靠后,时间越大。
System
:返回与1970年01月01日00:00点之间的毫秒差值
:将数组中指定的数据拷贝到另一个数组中
数组拷贝
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!