内容纲要
424讲枚举、注解、作业
自定义枚举
步骤:
1.讲构造器私有化,目的防止 直接 new
2.去掉 setXxx 方法,防止属性被修改
3.在Season 内部,直接创建固定的对象
4.优化,可以加入final 修饰符
enum 关键字实现枚举
语法:
- 使用关键字 enum 替代 class
- public static final Season Spring = new Season("春天","温暖") 直接使用
Spring("春天","温暖") 解读:常量名( 实参列表 )
- 如果有多个常量 ( 对象 ),使用 , 号间隔即可
- 如果使用enum 类来实现枚举,要求将定义常量对象写在(属性)前面
枚举类细节
- 如果我们使用的无参构造器创建枚举对象,则实参列表和小括号都可以省略
- Gender2 boy = Gender2.BOY; 中Gender2.BOY 是枚举类中的BOY方法。。。。。
- 使用关键字enum 时,会隐式继承Enum 类。
Enum 枚举类 常用的方法
compareTo 方法是前面的编号-后面比较的编号的值。。
- 注意 values( ) 方法在Enum类中是看不到的,只有反编译能看到(如前面的javap的图)
package com.Liao_.enumeration;
public class EnumExercise {
public static void main(String[] args) {
Week[] weekArr = Week.values();
for(Week arr : weekArr){
System.out.println(arr.toString());
}
}
}
enum Week {
Monday("星期一"),Tuesday("星期二"),Wednesday("星期三"),
Thursday("星期四"),Friday("星期五"),Saturday("星期六"),Sunday("星期天");
private String week;
private Week(String week){
this.week = week;
}
@Override
public String toString(){
return week;
}
}
- 使用了enum 关键字后,他就不能再继承其它类了,因为enum 会隐式继承 Enum,而Java 是单继承机制。
- 枚举类和普通类一样,可以实现接口,如: enum 类名 implements 接口1,接口2 { }
注解
@Override 注解
- @Override 使用
@Deprecated 注解
-
- @Deprecated 修饰某个元素,表示该元素已经过时了
-
- 即不推荐使用,但是仍然可以使用
- @Deprecated 注解原码
@Deprecated 的作用可以做到版本升级的兼容过渡使用
@SuppressWarnings 注解
- 使用前
- 使用后。。。当然@SuppressWarnings({"ALL"}) 能抑制全部警告信息。
- 关于@SuppressWarnings 作用范围是和放置的位置相关。
通常我们可以放在方法或者语句上,,放在类上更省事
JDK的元 Annotation(元注解, 了解)
@Retention 注解
- 例如
@Target 注解
- 用于修饰 注解能修饰哪些元素
@Documented 注解
可以在生成文档的时候保留其注解
@Inherited 注解
作业
- 注意一下。静态成员变量只随着类的加载而执行1次。静态变量属于类,JAVA8以 后认为静态成员变量存放在堆中
package com.Liao_.Homework02;
public class Frock {
private static int currentNum = 100000;//作为衣服出厂的序列号起始值
private int serialNumber;
public int getSerialNumber(){
return serialNumber;
}
public Frock(){
serialNumber = getNextNum();
}
public static int getNextNum(){ //获取唯一序列号 //我调你的静态方法不会惊动构造器
currentNum += 100;
return currentNum;
}
}
package com.Liao_.Homework02;
public class TestFrock {
public static void main(String[] args) {
System.out.println(Frock.getNextNum());
System.out.println(Frock.getNextNum());
Frock frock1 = new Frock();
System.out.println(frock1.getSerialNumber());
Frock frock2 = new Frock();
System.out.println(frock2.getSerialNumber());
Frock frock3 = new Frock();
System.out.println(frock3.getSerialNumber());
}
}
package com.Liao_.Homework03;
public abstract class Animal {
public abstract void shout();
}
class Cat extends Animal{
@Override
public void shout(){
System.out.println("猫会喵喵");
}
}
class Dog extends Animal{
@Override
public void shout() {
System.out.println("狗会汪汪");
}
}
class test {
public static void main(String[] args) {
Animal cat = new Cat();
cat.shout();
Animal dog = new Dog();
cat.shout();
}
}
package com.Liao_.Homework04;
interface Calculate {
// 1.计算器接口有work方法,功能是运算,
double work(double n1,double n2);
}
package com.Liao_.Homework04;
public class CCellphone {
/*
* 1.计算器接口有work方法,功能是运算,有一个手机类Cellphone,
* 定义方法testWork测试计算功能,调用计算接口的work方法,
* 2.要求调用CellPhone对象 的testWork方法,使用上匿名内部类
* */
public double testWork(Calculate calculate,double n1,double n2){
//这里不关心work方法如何实现,其将在匿名内部类中重写。
return calculate.work(n1,n2);
}
}
class Test{
public static void main(String[] args) {
CCellphone cellphone = new CCellphone();
//通过匿名内部类重写接口的方法,直接调用testWork方法实现n1 + n2;
System.out.println(cellphone.testWork(new Calculate(){
@Override
public double work(double n1,double n2){
return n1 + n2;
}
},100,200));
//通过匿名内部类重写接口的方法,直接调用testWork方法实现n1 * n2;
System.out.println(cellphone.testWork(new Calculate() {
@Override
public double work(double n1, double n2) {
return n1 * n2;
}
},10,30));
}
}
package com.Liao_.Homework05;
public class Homework05 {
public static void main(String[] args) {
A a = new A();
a.test();
}
}
class A {
private String name = "aaa";
public void test(){
class B {
private final String name = "BBB";
public void show(){
System.out.println("局部内部类B中的show()方法" + name);
}
}
B b = new B();
b.show();
}
}
package com.Liao_.Homework06;
import java.util.Scanner;
interface Vehicle {
void work();
}
//实现work接口
class Horse implements Vehicle{
@Override
public void work() {
System.out.println("交通工具骑马被调用");
}
}
//实现work接口
class Boat implements Vehicle{
@Override
public void work(){
System.out.println("交通工具坐船被调用");
}
}
//分别获取交通工具Horse和Boat
class Industry {
public void getHorse(){
new Horse().work();
}
public void getBoat(){
new Boat().work();
}
}
//有name和Vehicles属性,在构造器中为两个属性赋值
//实例化Person对象 "唐僧" ,要求一般情况下用Horse作为交通工具,
//遇到大河时用Boat作为交通工具
class Person {
private String name;
private String vehicles;
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
String str = myScanner.next();
Industry industry = new Industry();
if(str.equals("river")){
industry.getBoat();
return;
}
industry.getHorse();
}
}
//上面代码没分析好
//下面听老韩讲了之后改进的
package com.Liao_.Homework06;
public class Homework06 {
public static void main(String[] args) {
Person tang = new Person("唐僧", Industry.getHorse());
tang.passRiver();
tang.common();
tang.fireMountain();
}
}
interface Vehicle {
void work();
}
//实现work接口
class Plane implements Vehicle{
@Override
public void work(){
System.out.println("过火焰山太热,用飞机");
}
}
//实现work接口
class Horse implements Vehicle {
@Override
public void work() {
System.out.println("交通工具骑马被调用");
}
}
//实现work接口
class Boat implements Vehicle {
@Override
public void work() {
System.out.println("交通工具坐船被调用");
}
}
//分别获取交通工具Horse和Boat
class Industry {
//保证马一直不换。可以使用单例模式饿汉模式。
private Industry(){}//构造器私有化
//私有化创建Horse对象(static修饰加载类的时候就创建)
private static Horse horse = new Horse();
public static Horse getHorse() { //返回创建了的对象
return horse;
}
public static Boat getBoat() {
return new Boat();
}
public static Plane getPlane(){
return new Plane();
}
}
//有name和Vehicles属性,在构造器中为两个属性赋值
//实例化Person对象 "唐僧" ,要求一般情况下用Horse作为交通工具,
//遇到大河时用Boat作为交通工具
class Person {
private String name;
public Vehicle vehicles;
public void setName(String name) {
this.name = name;
}
public Person(String name, Vehicle vehicles) {
setName(name);
this.vehicles = vehicles;
}
public void passRiver() {
//判断构造器传入的是否为Boat(),如果是就不再创建
if (!(vehicles instanceof Boat)) {
vehicles = Industry.getBoat();
}
vehicles.work();
}
public void common() {
if (!(vehicles instanceof Horse)) {
vehicles = Industry.getHorse();
}
vehicles.work();
}
public void fireMountain() {
if(!(vehicles instanceof Plane)){
vehicles = Industry.getPlane();
}
vehicles.work();
}
}
package com.Liao_.Homework07;
class test99 {
public static void main(String[] args) {
Car car = new Car(44);
car.f1();
}
}
public class Car {
double temperature;
public Car(double temperature) {
this.temperature = temperature;
}
public void f1() {
class Air {
//吹风功能的方法
public void flow() {
//如果车内温度高于40°就吹冷空气,
//如果车内温度低于0°吹暖风。
//否则关掉空调。
if(temperature > 40){
System.out.println("冷空气");
} else if (temperature < 0) {
System.out.println("热风");
}else
System.out.println(" 关掉空调");
}
}
new Air().flow();
}
}
//上面我写的。。写成局部内部类了。。虽然也能用。
//下面老韩写的成员内部类,成员内部类,通过 getAir( ) 方法得到一个返回对象值。
package com.Liao_.Homework08;
class Test88 {
public static void main(String[] args) {
Color green = Color.GREEN;
Color.RED.show();
}
}
enum Color implements inter1{
RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);
private int redValue;
private int greenValue;
private int blueValue;
Color(int redValue, int greenValue, int blueValue) {
this.redValue = redValue;
this.greenValue = greenValue;
this.blueValue = blueValue;
}
@Override
public void show() {
System.out.println("属性值为" + redValue + "," + greenValue + "," + blueValue);
}
}
interface inter1 {
void show();
}