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——枚举类练习、包装类、抽象类、接口相关推荐

  1. java学习笔记7--抽象类与抽象方法

    接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...

  2. Java学习总结3——枚举类和反射机制

    Java枚举类和反射机制 一.Java枚举类(Enum): 在某些情况下,一个类的对象是有限且固定的,对于这种对象的实例有限且固定的类,在 Java 中被称为枚举类(Enum):枚举类是为了提高代码可 ...

  3. java学习笔记day09 final、多态、抽象类、接口

    java学习笔记day09 思维导图 final . 多态 . 抽象类 . 接口 (都很重要) 一.final 二.多态 多态中的成员访问特点⭐ [P237] 多态的好处 [P239] 多态的弊端 向 ...

  4. Java学习笔记Day06 工具类及常用算法

    第六章 工具类及常用算法 文章目录 第六章 工具类及常用算法 Java语言基础类 Java基础类库 Object类 概述 toString方法 方法摘要 覆盖重写 equals方法 方法摘要 默认地址 ...

  5. Java学习笔记day26-xml枚举注解

    XML ​ XML是一种可扩展的标记语言:标签语言是通过标签来描述数据的一门语言:可扩展是指标签的名字是可以自定义的. 作用: 用于存储数据和传输数据 作为软件的配置文件 XML标签规则 XML语法规 ...

  6. 21天学通Java学习笔记-Day11(常用类)

    java 常用类(重点): String 类: String 类代表字符串.创建以后不能更变. public class tests { public static void main(String[ ...

  7. java1002java,疯狂java学习笔记1002---抽象类及接口

    抽象类: 1.抽象方法是只有方法签名,没有方法实现的方法. 2.抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法. 3.*抽象方法不能有 ...

  8. 【Java学习笔记一】类和对象

    面向对象程序设计的一个一个重要特点是:封装性. 这里的封装性有两方面含义:一是将有关的数据和操作代码封装在一个对象中形成一个基本单位,各个对象之间相互独立互不干扰,二是将对象中某些部分对外隐蔽,即隐蔽 ...

  9. Java学习笔记6.3.4 文件操作 - Path接口和Files工具类

    文章目录 零.本讲学习目标 一.NIO概述 (一)NIO定义 (二)NIO相关包 (三)NIO三大核心 二.NIO.2概述 (一)NIO.2定义与特点 (二)NIO.2提供的接口与工具类 三.Path ...

最新文章

  1. 有趣|“手工耿”史诗级大作:可以横着走的概念车!罗永浩点赞,网友喊话雷军投资...
  2. Hadoop- Hadoop运维小计
  3. python编程培训多少钱-python培训一般多少钱?[python培训]
  4. linux固定分辨率,如何锁定分辨率
  5. background-size
  6. ZOJ 1151——Word Reversal
  7. WordPress架构简单剖析
  8. padavan安装php,求助!帮忙解决newifi3路由器安装hiboy老毛子系统后开启onmp后打开phpmyadin出错!...
  9. 英文简历中的自我评价
  10. CentOS7下RabbitMq安装和开机自启动配置
  11. string的基本用法
  12. netlogon启动后停止_优雅停止 SpringBoot 服务,拒绝 kill 9 暴力停止!
  13. python添加模块方法_Python 添加模块
  14. 蜻蜓和蝉c语言,趣味数学:蜻蜓、蜘蛛、蝉它们的翅膀和腿
  15. 使用Qemu模拟arm开发板
  16. SAP Down Payment的设置和使用
  17. 大数据特点5V 商业智能实现的三个层次
  18. RPC框架原理与实现
  19. Centos7.6下构建虚拟主机实验(基于域名、端口及IP地址)
  20. python中in的用法

热门文章

  1. 通过jinja2模板生成json文件内容的一个例子
  2. Rapidjson的简单使用
  3. Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年一月,时区转换
  4. C#--编写旅行社程序
  5. html自定义单选按钮,美化表单——自定义单选按钮和复选按钮
  6. 一人匀速行驶,每几分钟后面来一辆,每一分钟前面来一辆
  7. Unity 2d 有关陷阱的制作
  8. 如何让异地电脑之间访问共享文件夹
  9. 重学数据结构与算法系列:链表及其应用
  10. php serialize讲解与json性能测试