Хан Шунпин выучил Java за 30 дней с нуля [Глава 9 Классы перечисления и аннотации]

P425~P442

Требуется создание сезонных объектов, спроектированных и завершенных, com.enumeration.Enumeration01.java

public class Enumeration01 {
    public static void main(String[] args) {
        //因为对于季节而说,他的对象(具体值)是固定的,不会有更多
        Season spring = new Season("春天", "温暖");
        Season winter = new Season("冬天", "寒冷");
        Season summer = new Season("夏天", "炎热");
        Season autumn = new Season("秋天", "凉爽");
    }
}

class Season {
    private String name;
    private String desc;//描述

    public Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
}

Реализация класса перечисления

  1. Пользовательский класс реализует перечисление
  2. Перечисления реализуются с помощью ключевого слова enum.

Пользовательский класс реализует перечисление, com.enumeration.Enumeration02.java

  1. Нет необходимости предоставлять метод set, потому что значения объекта enum обычно доступны только для чтения
  2. Используйте окончательное + статическое совместное оформление для объектов/атрибутов перечисления для достижения оптимизации нижнего уровня.
  3. В именах объектов перечисления обычно используются все прописные буквы и соглашения об именах констант.
  4. Объект перечисления также может иметь несколько свойств по мере необходимости.
public class Enumeration02 {
    public static void main(String[] args) {
        //因为对于季节而说,他的对象(具体值)是固定的,不会有更多
        System.out.println(Season02.AUTUMN);
    }
}

//自定义枚举
class Season02{
    private String name;
    private String desc;//描述
    //1、将构造器私有化,防止直接被new
    //2、去掉set方法,防止属性被修改
    //3、在内部创建固定的值
    public static final Season02 SPRING = new Season02("春天", "温暖");
    public static final Season02 WINTER = new Season02("冬天", "寒冷");
    public static final Season02 SUMMER = new Season02("夏天", "炎热");
    public static final Season02 AUTUMN = new Season02("秋天", "凉爽");
    private Season02(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
    @Override
    public String toString() {
        return "Season02{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

Пользовательский класс реализует перечисление, особенности:

  1. конструкторская приватизация
  2. Создайте набор объектов внутри класса
  3. Отобразите объект снаружи и добавьте к объекту публичное окончательное статическое оформление.
  4. Метод get может быть предоставлен, но метод set не предоставляется.

Ключевое слово enum реализует перечисление, com.enumeration.Enumeration03.java.

public class Enumeration03 {
    public static void main(String[] args) {
        System.out.println(Season03.AUTUMN);
    }
}

//使用enum替代class
enum Season03 {
    //public static final Season03 WINTER = new Season03("冬天", "寒冷");
    //使用SPRING("春天","温暖")
    //常量名(实参列表)
    //如果有多个常量,使用逗号间隔
    //要求常量对象写在最前面
    SPRING("春天", "温暖"),
    WINTER("冬天", "寒冷"),
    SUMMER("夏天", "炎热"),
    AUTUMN("秋天", "凉爽");
    private String name;
    private String desc;//描述
    private Season03(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
}

Примечания к перечислениям

  1. Когда мы используем ключевое слово enum для разработки класса перечисления, он по умолчанию наследует класс Enum и становится конечным классом.
  2. public static final Season SPRING = new Season("весна", "тепло"), упрощенно до SPRING("весна", "тепло")
  3. Если объект перечисления создается с помощью конструктора без аргументов, как фактический список параметров, так и круглые скобки могут быть опущены.
  4. При наличии нескольких объектов перечисления используйте запятые для их разделения, а последняя точка с запятой заканчивается
  5. Объект перечисления должен быть помещен в первую строку класса перечисления.

Описание общих методов enum

Когда используется ключевое слово enum, класс Enum неявно наследуется, поэтому мы можем использовать связанные методы класса Enum.

public abstract class Enum<E extends Enum<E>> 
 implements Comparable<E>,SErializable{
}

общий метод

  • toString: возвращает имя текущего объекта, подклассы могут переопределить этот метод, чтобы вернуть информацию об атрибутах объекта.
  • имя: возвращает текущее имя объекта
  • порядковый номер: возвращает номер позиции текущего объекта, начиная с 0 по умолчанию
  • values: возвращает все константы в текущем классе перечисления
  • valueOf: преобразовать строку в объект перечисления, требуя, чтобы строка была существующим именем константы.
  • compareTo: сравнить две константы перечисления, сравнивая номер позиции

Упражнение, com.enumeration.EnumerationExercise.java

  1. Объявить класс перечисления Week, включая ПОНЕДЕЛЬНИК, ВТОРНИК, СРЕДУ, ЧЕТВЕРГ, ПЯТНИЦУ, СУББОТУ, ВОСКРЕСЕНЬЕ
  2. Используйте значения для возврата всех массивов перечисления и перебора вывода
public class EnumerationExercise {
    public static void main(String[] args) {
        for(Week day:Week.values()){
            System.out.println(day);
        }
    }
}

enum Week{
    MONDAY("星期一"),
    TUESDAY("星期二"),
    WEDNEDAY("星期三"),
    THURSDAY("星期四"),
    FRIDAY("星期五"),
    SATURDAY("星期六"),
    SUNDAY("星期天");
    private String name;

    Week(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return name;
    }
}

Enum реализует интерфейс

  1. После использования ключевого слова enum вы больше не сможете наследовать другие классы, потому что enum неявно наследует Enum, а java — это единый механизм наследования

  2. Классы перечисления, как и обычные классы, могут реализовывать интерфейсы следующим образом.

    enum 类名 implements 接口1,接口2{}

аннотация

  1. Аннотации, также известные как метаданные, используются для изменения и интерпретации таких данных, как пакеты, классы, методы, атрибуты, конструкторы и локальные переменные.
  2. Как и аннотации, аннотации не влияют на логику программы, но аннотации могут быть скомпилированы или запущены, что эквивалентно дополнительной информации, встроенной в код.
  3. В javaSE назначение аннотаций относительно простое, например, пометка устаревших функций, игнорирование предупреждений и т. д.
  4. В javaEE аннотации играют более важную роль, например, они используются для настройки любого аспекта приложения, заменяя громоздкий код и конфигурацию XML, оставшиеся от старой версии javaEE.

При использовании аннотации добавьте перед ней символ @ и используйте аннотацию в качестве модификатора.

Три основные аннотации, com.anno.Annotation01.java

  1. @Override: ограничение метода означает переопределение метода родительского класса, эта аннотация может использоваться только для методов.
  2. @Deprecated: используется для обозначения того, что элемент программы устарел.
  3. @SuppressWarnings: подавлять предупреждения компилятора
public class Annotation01 {
}
class Father {
    public void fly() {
    }
}
class Son extends Father {
    @Override
    //表示子类的fly是重写了父类的方法\
    //如果写了@Override,编译器会检查该方法是否真的重写了父类的方法
    // 如果的确重写了,则编译通过,如果没有构成重写,则编译错误
    public void fly() {
        super.fly();
    }
}

Переопределить

  1. @Override означает указать метод переопределения родительского класса, если у родительского класса нет этого метода, будет сообщено об ошибке
  2. Если аннотация @Override не написана, но в родительском классе есть этот метод, он все равно представляет собой переопределение.
  3. @Override может изменять только методы, но не другие классы, пакеты, атрибуты и т. д.
  4. Посмотреть исходный код аннотации @Override
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
1. @Target(ElementType.METHOD),说明只能修饰方法
2. @Target是修饰注解的注解,称为元注解
3. @interface,表示是一个注解类

Устарело, com.anno.Deprecated_.java

public class Deprecated_ {
    public static void main(String[] args) {
        Dep a = new Dep();
        a.hi();
    }
}
@Deprecated
class Dep{
    public int n1=10;
    @Deprecated
    public void hi(){
        System.out.println("hi");
    }
}
  1. @Deprecated изменяет элемент, чтобы указать, что он устарел.
  2. Можно использовать декорированные элементы, но не рекомендуется
  3. Может изменять методы, классы, поля, пакеты, параметры и т. д.
  4. Может использоваться в качестве перехода обновления версии и совместимости
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, 
                METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

Подавить предупреждения,com.anno.SuppressWarnings_.java

import java.util.ArrayList;
import java.util.List;
public class SuppressWarnings_ {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
//        @SuppressWarnings 用来抑制警告信息
        List list = new ArrayList();
        list.add("jack");
        list.add("tom");
        list.add("mary");
        int i;
        System.out.println(list.get(1));
    }
}
  1. @SuppressWarnings используется для подавления предупреждающих сообщений.

@SuppressWarnings({"все"})

  1. unchecked: игнорировать непроверенные предупреждения
  2. rawtypes: игнорировать предупреждения, в которых не указаны дженерики
  3. unused: игнорировать предупреждения о том, что переменная не используется
  4. @SuppressWarnings: Элементы программы, которые можно изменить, см. @Target
@Target({TYPE, FIELD, METHOD, PARAMETER, 
          CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();//可以存放一个字符串数组,需要忽略的警告
}

метааннотация

Типы метааннотаций

  • Retention (удержание), укажите область действия аннотации, SOURCE, CLASS, RUNTIME
  • Цель, указать, где можно использовать аннотации
  • Документировано, указывает, будет ли аннотация отражена в javadoc.
  • Унаследованные, подклассы будут наследовать аннотации родительского класса

Удержание

Его можно использовать только для изменения определения аннотации, чтобы указать, как долго аннотация может храниться. @Retention содержит переменную-член типа RetentionPolicy. При использовании @Rention необходимо указать значение для переменной-члена значения.

Сохранение трех значений

  1. @Retention(RetentionPolicy.SOURCE): после того, как компилятор использует его, аннотация этой политики напрямую отбрасывается.
  2. @Retention(RetentionPolicy.CLASS): компилятор запишет аннотацию в файл класса, и JVM не сохранит аннотацию при запуске java-программы. Это значение по умолчанию
  3. @Retention(RetentionPolicy.RUNTIME): компилятор запишет аннотацию в файл класса.При запуске java-программы JVM сохранит аннотацию, и программа может получить аннотацию посредством отражения
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}

Цель

Используется для изменения определения аннотации, используется для указания того, какие программные элементы можно использовать для изменения измененной аннотации, @Target содержит переменную-член с именем value

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

Задокументировано

Он используется для указания того, что класс Annotation, модифицированный мета-аннотацией, будет извлечен в документ с помощью инструмента javadoc, то есть аннотацию можно увидеть при создании документа.

Примечание. Для примечаний, определенных как документированные, для параметра Retention должно быть установлено значение RUNTIME.

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

Унаследовано

Измененная им аннотация будет иметь наследование.Если класс использует аннотацию, измененную @Inherited, его подклассы автоматически получат аннотацию

Операция

com.homwork.Homework0901.java

  1. Объявить закрытый статический атрибут currentNum[int type] в классе Frock с начальным значением 100000, который используется в качестве начального значения серийного номера одежды.
  2. Объявите общедоступный статический метод getNextNum как метод для генерации уникального серийного номера куртки и увеличивайте currentNum на 100 каждый раз, когда он вызывается, и используйте его в качестве возвращаемого значения.
  3. В основном методе класса TestFrock дважды вызовите метод getNextNum, чтобы получить серийный номер и распечатать его.
  4. Объявите атрибут serialNumber (серийный номер) в классе Frock и предоставьте соответствующий метод получения.
  5. В конструкторе класса Frock получите уникальный серийный номер для объекта Frock, вызвав метод getNextNum, и назначьте его свойству serialNumber.
  6. В основном методе класса TestFrock создайте соответственно три объекта Frock и напечатайте серийные номера трех объектов, чтобы проверить, увеличивается ли он на 100/
//1. 在Frock类声明私有的静态属性currentNum[int类型],初始值为100000,作为衣服出场的序列号起始值
//2. 声明公有的静态方法getNextNum,作为生成上衣唯一序列号的方法,每调用一次,将currentNum增加100,
// 并作为返回值
//3. 在TestFrock类的main方法中,分两次调用getNextNum方法,获取序列号并打印输出
//4. 在Frock类中声明serialNumber(序列号)属性,并提供对应的get方法
//5. 在Frock类的构造器中,通过调用getNextNum方法为Frock对象获取唯一序列号,赋给serialNumber属性
//6. 在TestFrock类的main方法中,分别创建三个Frock对象,并打印三个对象的序列号,验证是否为按100递增

public class Homework0901 {
    public static void main(String[] args) {
        System.out.println(Frock.getNextNum());
        System.out.println(Frock.getNextNum());
        System.out.println(new Frock().getSerialNumber());
        System.out.println(new Frock().getSerialNumber());
        System.out.println(new Frock().getSerialNumber());
    }
}


class Frock {
    private static int currentNum = 100000;
    private int serialNumber;
    public Frock() {
        this.serialNumber = this.getNextNum();
    }
    public static int getNextNum() {
        currentNum += 100;
        return currentNum;
    }
    public int getSerialNumber() {
        return serialNumber;
    }
}

com.homwork.Homework0902.java

  1. В интерфейсе калькулятора есть метод работы, функция — расчет, есть класс мобильного телефона Cellphone, определите метод testWork для проверки функции расчета и вызовите метод работы интерфейса расчета.
  2. Требуется вызвать метод testWork объекта Cellphone, используя анонимный внутренний класс/
//1. 计算器接口具有work方法,功能是运算,有一个手机类CellPhone,
// 定义方法testWork测试计算功能,调用计算接口的work方法
//2. 要求调用CellPhone对象的testWork方法,使用匿名内部类/
public class Homework0902 {
    public static void main(String[] args) {

        new CellPhone().testWork(new Caculate() {
            @Override
            public void work(double n1,double n2) {
                System.out.println(n1+n2);
            }
        },1,2);
    }
}

interface Caculate{
    public void work(double n1,double n2);
}

class CellPhone{
    public void testWork(Caculate caculate,double n1,double n2){
        caculate.work(n1,n2);
    }
}

com.homwork.Homework0903.java

  1. Создайте класс перечисления Color
  2. Есть пять пронумерованных значений/объектов КРАСНЫЙ, СИНИЙ, ЧЕРНЫЙ, ЖЕЛТЫЙ и ЗЕЛЕНЫЙ;
  3. Цвет имеет три атрибута redValue, greenValue, blueValue,
  4. Создайте конструктор, параметры включают эти три атрибута,
  5. Каждое значение перечисления должно присваивать значения этим трем атрибутам, и соответствующие значения трех атрибутов
  6. красный: 255,0,0 синий:0,0,255 черный:0,0.,0 желтый:255,255,0 зеленый:0,255,0
  7. Определите интерфейс, который содержит метод show, который требует Color для реализации интерфейса.
  8. Значение трех атрибутов отображается в методе show.
  9. Совпадение с объектом перечисления в операторе switch
//1. 创建一个Color枚举类
//2. 有RED,BLUE,BLACK,YELLOW,GREEN这个五个枚举值/对象;
//3. Color有三个属性redValue, greenValue, blueValue,
//4. 创建构造方法,参数包括这三个属性,
//5. 每个枚举值都要给这三个属性赋值,三个属性对应的值分别是
//6. red: 255,0,0 blue:0,0,255 black:0,0.,0 yellow:255,255,0 green:0,255,0
//7. 定义接口,里面有方法show,要求Color实现该接口
//8. show方法中显示三属性的值
//9. 将枚举对象在switch语句中匹配使用
    
public class Homework0903 {
    public static void main(String[] args) {
        Color red = Color.RED;
        red.show();
        switch (red) {
            case YELLOW:
                System.out.println("匹配到黄色");
                break;
            case RED:
                System.out.println("匹配到红色");
                break;
        }
    }
}


interface ShowColor {
    public void show();
}

enum Color implements ShowColor {
    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);
    }
}

Guess you like

Origin blog.csdn.net/weixin_65656674/article/details/126416814