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;
}
}
Реализация класса перечисления
- Пользовательский класс реализует перечисление
- Перечисления реализуются с помощью ключевого слова enum.
Пользовательский класс реализует перечисление, com.enumeration.Enumeration02.java
- Нет необходимости предоставлять метод set, потому что значения объекта enum обычно доступны только для чтения
- Используйте окончательное + статическое совместное оформление для объектов/атрибутов перечисления для достижения оптимизации нижнего уровня.
- В именах объектов перечисления обычно используются все прописные буквы и соглашения об именах констант.
- Объект перечисления также может иметь несколько свойств по мере необходимости.
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 + '\'' +
'}';
}
}
Пользовательский класс реализует перечисление, особенности:
- конструкторская приватизация
- Создайте набор объектов внутри класса
- Отобразите объект снаружи и добавьте к объекту публичное окончательное статическое оформление.
- Метод 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;
}
}
Примечания к перечислениям
- Когда мы используем ключевое слово enum для разработки класса перечисления, он по умолчанию наследует класс Enum и становится конечным классом.
- public static final Season SPRING = new Season("весна", "тепло"), упрощенно до SPRING("весна", "тепло")
- Если объект перечисления создается с помощью конструктора без аргументов, как фактический список параметров, так и круглые скобки могут быть опущены.
- При наличии нескольких объектов перечисления используйте запятые для их разделения, а последняя точка с запятой заканчивается
- Объект перечисления должен быть помещен в первую строку класса перечисления.
Описание общих методов 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
- Объявить класс перечисления Week, включая ПОНЕДЕЛЬНИК, ВТОРНИК, СРЕДУ, ЧЕТВЕРГ, ПЯТНИЦУ, СУББОТУ, ВОСКРЕСЕНЬЕ
- Используйте значения для возврата всех массивов перечисления и перебора вывода
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 реализует интерфейс
-
После использования ключевого слова enum вы больше не сможете наследовать другие классы, потому что enum неявно наследует Enum, а java — это единый механизм наследования
-
Классы перечисления, как и обычные классы, могут реализовывать интерфейсы следующим образом.
enum 类名 implements 接口1,接口2{}
аннотация
- Аннотации, также известные как метаданные, используются для изменения и интерпретации таких данных, как пакеты, классы, методы, атрибуты, конструкторы и локальные переменные.
- Как и аннотации, аннотации не влияют на логику программы, но аннотации могут быть скомпилированы или запущены, что эквивалентно дополнительной информации, встроенной в код.
- В javaSE назначение аннотаций относительно простое, например, пометка устаревших функций, игнорирование предупреждений и т. д.
- В javaEE аннотации играют более важную роль, например, они используются для настройки любого аспекта приложения, заменяя громоздкий код и конфигурацию XML, оставшиеся от старой версии javaEE.
При использовании аннотации добавьте перед ней символ @ и используйте аннотацию в качестве модификатора.
Три основные аннотации, com.anno.Annotation01.java
- @Override: ограничение метода означает переопределение метода родительского класса, эта аннотация может использоваться только для методов.
- @Deprecated: используется для обозначения того, что элемент программы устарел.
- @SuppressWarnings: подавлять предупреждения компилятора
public class Annotation01 {
}
class Father {
public void fly() {
}
}
class Son extends Father {
@Override
//表示子类的fly是重写了父类的方法\
//如果写了@Override,编译器会检查该方法是否真的重写了父类的方法
// 如果的确重写了,则编译通过,如果没有构成重写,则编译错误
public void fly() {
super.fly();
}
}
Переопределить
- @Override означает указать метод переопределения родительского класса, если у родительского класса нет этого метода, будет сообщено об ошибке
- Если аннотация @Override не написана, но в родительском классе есть этот метод, он все равно представляет собой переопределение.
- @Override может изменять только методы, но не другие классы, пакеты, атрибуты и т. д.
- Посмотреть исходный код аннотации @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");
}
}
- @Deprecated изменяет элемент, чтобы указать, что он устарел.
- Можно использовать декорированные элементы, но не рекомендуется
- Может изменять методы, классы, поля, пакеты, параметры и т. д.
- Может использоваться в качестве перехода обновления версии и совместимости
@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));
}
}
- @SuppressWarnings используется для подавления предупреждающих сообщений.
@SuppressWarnings({"все"})
- unchecked: игнорировать непроверенные предупреждения
- rawtypes: игнорировать предупреждения, в которых не указаны дженерики
- unused: игнорировать предупреждения о том, что переменная не используется
- @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 необходимо указать значение для переменной-члена значения.
Сохранение трех значений
- @Retention(RetentionPolicy.SOURCE): после того, как компилятор использует его, аннотация этой политики напрямую отбрасывается.
- @Retention(RetentionPolicy.CLASS): компилятор запишет аннотацию в файл класса, и JVM не сохранит аннотацию при запуске java-программы. Это значение по умолчанию
- @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
- Объявить закрытый статический атрибут currentNum[int type] в классе Frock с начальным значением 100000, который используется в качестве начального значения серийного номера одежды.
- Объявите общедоступный статический метод getNextNum как метод для генерации уникального серийного номера куртки и увеличивайте currentNum на 100 каждый раз, когда он вызывается, и используйте его в качестве возвращаемого значения.
- В основном методе класса TestFrock дважды вызовите метод getNextNum, чтобы получить серийный номер и распечатать его.
- Объявите атрибут serialNumber (серийный номер) в классе Frock и предоставьте соответствующий метод получения.
- В конструкторе класса Frock получите уникальный серийный номер для объекта Frock, вызвав метод getNextNum, и назначьте его свойству serialNumber.
- В основном методе класса 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
- В интерфейсе калькулятора есть метод работы, функция — расчет, есть класс мобильного телефона Cellphone, определите метод testWork для проверки функции расчета и вызовите метод работы интерфейса расчета.
- Требуется вызвать метод 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
- Создайте класс перечисления Color
- Есть пять пронумерованных значений/объектов КРАСНЫЙ, СИНИЙ, ЧЕРНЫЙ, ЖЕЛТЫЙ и ЗЕЛЕНЫЙ;
- Цвет имеет три атрибута redValue, greenValue, blueValue,
- Создайте конструктор, параметры включают эти три атрибута,
- Каждое значение перечисления должно присваивать значения этим трем атрибутам, и соответствующие значения трех атрибутов
- красный: 255,0,0 синий:0,0,255 черный:0,0.,0 желтый:255,255,0 зеленый:0,255,0
- Определите интерфейс, который содержит метод show, который требует Color для реализации интерфейса.
- Значение трех атрибутов отображается в методе show.
- Совпадение с объектом перечисления в операторе 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);
}
}