Java学习笔记day7——枚举类练习、包装类、抽象类、接口
1. 枚举类的常用方法
(1)String name():返回枚举常量对象名称
(2)int ordinal():返回常量对象的下标
(3)String toString():Enum父类又重写了Object类的toString,返回的也是常量对象的名称
当然,子类还可以重写
编译器会自动添加如下方法:
(1)static 枚举类型[] values():返回枚举类型的所有常量对象
(2)static 枚举类型 valueof(String name)
枚举练习:月份
(1)声明月份枚举类Month
声明一个属性,私有化,加final修饰
description(描述,例如:JANUARY的description为一月,FEBRUARY的description为二月,以此类推)
声明一个有参构造Month(String description),创建12个常量对象,常量对象的名称如下
JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
声明public static Month getByValue(int value):返回对应月份值的枚举对象,例如实参传入1,则返回JANUARY对象
声明public int length(boolean leapYear):返回这个月的总天数,如果当前对象是FEBRUARY,并且leapYear是true,则返回29,否则返回28
重写toString():返回对象信息,例如:1->JANUARY->一月份
(2)在测试类中,从键盘输入年份和月份值。获取对应的月份对象,并打印月份对象,并获取月份总天数
代码为:
public enum Month {JANUARY("一月"),FEBRUARY("二月"),MARCH("三月"),APRIL("四月"),MAY("五月"),JUNE("六月"),JULY("七月"),AUGUST("八月"),SEPTEMBER("九月"),OCTOBER("十月"),NOVEMBER("十一月"),DECEMBER("十二月");private final String description;Month(String description) {this.description = description;}public static Month getByValue(int value){Month[] months = Month.values();return months[value-1];}public int length(boolean leapYear){switch(this){case FEBRUARY:return leapYear?29:28;case APRIL:case JUNE:case SEPTEMBER:case NOVEMBER:return 30;default:return 31;}}@Overridepublic String toString() {return (ordinal()+1)+"->" +name()+"->" + description ;}
}
测试类:
import java.util.Scanner;public class TestMonth {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("请输入年份");int year = input.nextInt();System.out.println("请输入月份");int monthValue = input.nextInt();Month month = Month.getByValue(monthValue);System.out.println(month);boolean leapYear = year %4 ==0&&year%400!=0||year%400 == 0;System.out.println("总天数"+month.length(leapYear));}}
【包装类知识点】
1. 包装类是什么
Java保留了C语言的8中基本数据类型和void,这些不属于面向对象
2. 为什么要保留
因为有丰富的运算符可以支持
而且有固定大小的内存空间
这些特定没必要重新再设计新的,直接沿用
但是Java出了这些以外又都是面向对象的,很多API方法、新特性都是针对“对象”设计的
比如:集合、泛型等,只支持对象,不支持基本数据类型
为了解决这样的问题,希望基本数据类型的数据也能用于集合,也能使用一些新特性,就提供了“包装类”
3. 基本数据类型与包装类之间如何转换?
基本数据类型数据==》包装类对象:装箱
包装类对象 ==》基本数据类型的数据:拆箱
JDK1.5之后支持自动装箱拆箱,但是自动的,只支持对应类型之间
4. 包装类的相关API
(1)获取某个数据类型的范围
包装类.MAX_VALUE和包装类.MIN_VALUE
(2)把十进制的整数转为其他进制
①二进制:
toBinaryString
②八进制
toOctalString
③十六进制
toHexString
(3)基本数据类型的值与字符串之前的转换方法
int Integer.parseInt(字符串)
double Double.parseDouble(字符串)
boolean Boolean.parseBoolean(字符串)
Integer.valueOf(字符串)
Double.valueOf(字符串)
(4)针对字符串,有转大小写的方法
Character.toUpperCase(字符)
Character.toLowerCase(字符)
(5)比较大小
Double.compare(两个小数)
Integer.compare(两个整数)
返回值都是int类型,要么返回正整数、负整数、0,分别表示大于、小于、等于的关系
5. 包装类的特点
(1)部分包装类有缓存对象
Byte:-128~127
Short: -128~127
Integer:-128~127
Long:-128~127
Float和Double不缓存
Character:0~127 最原始的ASCII码表范围字符串
Boolean:true,false
(2)为什么要有缓存对象
如果每一次自动装箱,都产生新对象的话
-128~127范围内的数字在程序中出现的概率非常高,那么就会导致包装类对象泛滥,内存就会很紧张
考虑到这点,就想着重复使用一些对象,这些对象被缓存起来,重复使用
缓存对象是针对自动装箱的,new出来的不是缓存对象
包装类.valueOf()也使用缓存对象
(2)包装类对象不可变
包装类对象一旦修改,就指向新对象
(3)包装类对象与基本数据类型等的转换特点
如果是包装类和基本数据类型之间(无论它们是否对应)都是先把包装类拆箱后,按照基本数据类型的比较规则进行比较。
如果都是包装类比较,那么要求必须是同一种类型之间比较
【抽象类知识点】
1. 什么是抽象类
之前写过一些父类,父类的某些代码无法给出具体的实现代码,如:
public double area(){return0.0;
}
这样的方法在语法上是正确的,但是逻辑上有问题,也没有意义
应该有子类重写,并给出更合理的具体实现
这种情况,我们就应该把这样的方法声明为抽象方法
2. 抽象方法
如果一个方法,没有方法体,它应该有子类来重写,再给出具体的实现时,这个方法就应该声明为抽象方法
3. 语法格式
【其他修饰符】 abstract 返回值类型 方法名)(【形参列表】);
抽象方法是没有方法体的,有abstract修饰
那么Java中规定,如果一个类中包含了抽象方法,那么这个类必须是抽象类
抽象类的语法格式:
【权限修饰符】 abstract class 类名{
}
4. 抽象类特点
(1)抽象类本身是不能创建对象
(2)抽象类型的变量,只能赋值为它的子类对象,即与子类对象构成“多态”引用
抽象方法是虚方法,子类必须重写
(3)子类要继承抽象类时,如果子类不是抽象类,那么子类就必须重写抽象父类的所有抽象方法
(4)抽象类可以没有抽象方法
Q:为什么没有抽象方法的类,要声明为抽象类?
A:为了不让你创建它的对象,希望你创建它子类的对象
(5)抽象类一定有构造器——子类的构造器首行,一定要调用父类的构造器
5. 抽象类和非抽象类有什么区别?
(1)抽象类有abstract修饰,可以包含抽象方法
非抽象类没有abstract修饰,也不能包含抽象方法
(2)抽象类不能直接new对象
非抽象类可以直接new对象
【修饰符问题】
外部类 | 成员变量 | 代码块 | 构造器 | 方法 | 局部变量 | 内部类 | |
public | √ | √ | √ | √ | √ | ||
protected | √ | √ | √ | √ | |||
缺省 | √ | √ | √ | √ | √ | ||
private | √ | √ | √ | √ | |||
static | √ | √ | √ | √ | |||
final | √ | √ | √ | √ | √ | ||
abstract | √ | √ | √ | ||||
native | √ |
【接口知识点】
1.接口的概念
是一种数据类型,和类是平级的
代表一种行为操作的标准
2. 作用
(1)解决类单继承问题
(2)接口可以表示事物之间has -a的关系
3. 格式
【修饰符】 interface 接口名{
}
4. 成员
(1)接口中不允许声明非公共的静态常量之外的成员变量
即声明:public static final为开头的变量(也可以直接省略),常量全部大写
(2)JDK1.8之前,接口中只允许有公共的抽象方法,不允许有其他方法
(3)JDK1.8之后,接口允许声明公共的静态方法
public static:其中public 允许省略,static不允许省略
(4)1.8之后,接口允许公共的默认方法
public default:其中public允许省略,default不允许省略
(5)为什么JDK1.8之前,只允许有公共的抽象方法?
因为接口代表行为准则,它只允许方法的“签名”。
方法=方法头+方法体
方法头又称为方法签名,【修饰符】 返回值类型 方法名(【形参列表】);
方法体:{语句}
方法签名中已经能够看出,如何使用这个方法,以及这个方法的功能(因为方法名是见名知意的一个标识符,代表方法功能)
至于方法体,不同的实现类,实现标准不同
(6)为什么1.8之后改了?
如果给之间的接口增加抽象方法,就会导致它的实现类全部都要升级,重写这个新的抽象方法。
①增加默认方法
为了避免这种情况,允许接口中出现默认方法,默认方法是有方法体的,可以写具体的实现,也可以是一个空{ }
实现类如果想要实现这个新的默认方法,可以选择重写,不想支持,就不重写
②增加静态方法
原来很多接口,针对它的工具类性质的方法,都是单独用另一个类实现的
一组一组的API越来越多,导致维护难度越来越大
可以针对这个接口的工具类性质的静态方法,干脆放到接口中就好,少一个.java文件
(7)JDK1.9之后,允许出现私有方法
避免冗余
5. 接口的使用
(1)如何使用接口的公共的静态常量
接口名.常量名
(2)如何使用接口的静态方法
接口名.静态方法
【注意】
①子类可以继承父类的静态方法,即子类名.父类的静态方法是可以的
但是,实现类不可以继承接口的静态方法
②子类不能重写父类的静态方法
实现类也不能重写接口的静态方法
(3)如何使用接口的抽象方法
只能通过实现类实现抽象方法,然后由实现类对象调用
(4)如何使用接口的默认方法?
也只能通过实现类
6. 接口的特点
(1)接口本身不能创建对象,只能创建接口的实现类对象
接口类型的变量可以与实现类的对象构成多态引用
(2)接口的成员
只能是:公共的静态常量、公共的抽象方法
1.8后:公共的静态方法、公共的默认方法
1.9之后:私有方法
(3)类可以实现接口,而且支持多实现
【修饰符】class 实现类名 implements 父接口们{
}
父接口们:每一个接口使用逗号分割
如果一个类同时继承父类又实现接口,要把继承写在前,实现写在后
(4)接口与接口之间也可以继承,而且是多继承
总结:类 ->类: extends 单继承
类->接口 implements 多实现
接口->接口 extends 多继承
接口 ->类:没有
(5)实现类实现接口时,必须实现接口的所有抽象方法,
如果实现类没有实现接口的抽象方法,那么实现类就要声明为抽象类
(6)实现类可以选择重写接口的默认方法,在实现类中重现默认方法时,要把default去掉
因为类里面没有默认方法一说
(7)接口的静态方法不能被实现类继承,也不能被实现类重写
7. 接口的冲突问题
(1)默认方法的冲突
① 当一个实现类同时实现两个接口或多个接口,此时存在相同签名的默认方法时,会出现冲突现象
如何解决?
a.保留其中一个接口的实现,放弃其他的
b. 全部放弃,自己重写
②当一个实现类,同时继承父类,又实现父接口时,此时接口中和父类中有相同的非静态方法时
a.默认亲爹原则
b.也可以自己选择
c.完全重写
(2)成员变量冲突
父类就super.x,接口就接口名.x
8. 经典接口①:java.lang.Comparable接口
它只有一个唯一的抽象方法:int compareTo(Object o)
作用:用于比较两个对象的“大小”关系
public class Student implements Comparable{private String name;private int score;public Student(String name, int score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}@Overridepublic int compareTo(Object o) {//当前的this(调用这个方法的对象)和o对应的实参对象Student student = (Student) o;//为什么要向下转型?因为要使用后o对象中的成绩等信息int result = this.score - student.score;if(result != 0){//成绩不相同return result;}//name是String类型,是对象,对象比较大小,默认就是用compareTo方法return this.name.compareTo(student.name);//这里因为String类型也实现了Comparable接口//所以String类型的变量也可以调用compareTo方法//String类中是按照字符的Unicode编码值比较大小}
}
9. 经典接口②:java.util.Comparator接口
他也有一个抽象方法:int compare(Object o1,Object o2)
作用:也是用于比较对象大小的
这个接口是对Comparable接口的补充
相同点:
①都是比较对象大小用的
②他们的返回值都是int
第一个对象比第二个大时,返回正整数
第一个对象比第二个对象小时,返回负整数
public class StudentAgeComparator implements Comparator{@overridepublic int compare(Object o1,Object o2){Student s1 = (Student)o1;Student s2 = (Student)o2;return s1.getAge()-s2.getAge();}
}
Java学习笔记day7——枚举类练习、包装类、抽象类、接口相关推荐
- java学习笔记7--抽象类与抽象方法
接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...
- Java学习总结3——枚举类和反射机制
Java枚举类和反射机制 一.Java枚举类(Enum): 在某些情况下,一个类的对象是有限且固定的,对于这种对象的实例有限且固定的类,在 Java 中被称为枚举类(Enum):枚举类是为了提高代码可 ...
- java学习笔记day09 final、多态、抽象类、接口
java学习笔记day09 思维导图 final . 多态 . 抽象类 . 接口 (都很重要) 一.final 二.多态 多态中的成员访问特点⭐ [P237] 多态的好处 [P239] 多态的弊端 向 ...
- Java学习笔记Day06 工具类及常用算法
第六章 工具类及常用算法 文章目录 第六章 工具类及常用算法 Java语言基础类 Java基础类库 Object类 概述 toString方法 方法摘要 覆盖重写 equals方法 方法摘要 默认地址 ...
- Java学习笔记day26-xml枚举注解
XML XML是一种可扩展的标记语言:标签语言是通过标签来描述数据的一门语言:可扩展是指标签的名字是可以自定义的. 作用: 用于存储数据和传输数据 作为软件的配置文件 XML标签规则 XML语法规 ...
- 21天学通Java学习笔记-Day11(常用类)
java 常用类(重点): String 类: String 类代表字符串.创建以后不能更变. public class tests { public static void main(String[ ...
- java1002java,疯狂java学习笔记1002---抽象类及接口
抽象类: 1.抽象方法是只有方法签名,没有方法实现的方法. 2.抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法. 3.*抽象方法不能有 ...
- 【Java学习笔记一】类和对象
面向对象程序设计的一个一个重要特点是:封装性. 这里的封装性有两方面含义:一是将有关的数据和操作代码封装在一个对象中形成一个基本单位,各个对象之间相互独立互不干扰,二是将对象中某些部分对外隐蔽,即隐蔽 ...
- Java学习笔记6.3.4 文件操作 - Path接口和Files工具类
文章目录 零.本讲学习目标 一.NIO概述 (一)NIO定义 (二)NIO相关包 (三)NIO三大核心 二.NIO.2概述 (一)NIO.2定义与特点 (二)NIO.2提供的接口与工具类 三.Path ...
最新文章
- 有趣|“手工耿”史诗级大作:可以横着走的概念车!罗永浩点赞,网友喊话雷军投资...
- Hadoop- Hadoop运维小计
- python编程培训多少钱-python培训一般多少钱?[python培训]
- linux固定分辨率,如何锁定分辨率
- background-size
- ZOJ 1151——Word Reversal
- WordPress架构简单剖析
- padavan安装php,求助!帮忙解决newifi3路由器安装hiboy老毛子系统后开启onmp后打开phpmyadin出错!...
- 英文简历中的自我评价
- CentOS7下RabbitMq安装和开机自启动配置
- string的基本用法
- netlogon启动后停止_优雅停止 SpringBoot 服务,拒绝 kill 9 暴力停止!
- python添加模块方法_Python 添加模块
- 蜻蜓和蝉c语言,趣味数学:蜻蜓、蜘蛛、蝉它们的翅膀和腿
- 使用Qemu模拟arm开发板
- SAP Down Payment的设置和使用
- 大数据特点5V 商业智能实现的三个层次
- RPC框架原理与实现
- Centos7.6下构建虚拟主机实验(基于域名、端口及IP地址)
- python中in的用法