Ставьте лайк и читайте еще раз, Java продвинута более чем наполовину
В интервью крупной фабрике интервьюер спросил Сяонаня (псевдоним): Когда вы предпочитаете использовать интерфейсы, а когда — абстрактные классы при написании кода?
Так ответил зарубежный блоггер-программист с 24 тысячами подписчиков. Что вы думаете?
Выбор между интерфейсами Java и абстрактными классами зависит от ваших конкретных требований. Если вам нужно определить контракт, которому должны следовать несколько несвязанных классов, используйте интерфейс. Однако если вы хотите создать повторно используемый базовый класс с общими деталями реализации, выберите абстрактный класс. В некоторых случаях вы даже можете использовать оба одновременно, используя абстрактные классы для реализации интерфейсов для обеспечения соблюдения контрактов и предоставления общей основы для связанных классов. Не забудьте рассмотреть плюсы и минусы каждого варианта, чтобы сделать лучший выбор для вашего программного обеспечения.
Привет всем, я брат Нэн.
Будучи лидером в изучении и продвижении Java, я считаю, что вам будет полезно пройти собеседование и получить предложение о работе в той компании, которую вы хотите.
Теперь есть интегрированная среда разработки IDEA.,Он может напоминать всем в режиме реального времени, где находится ошибка компиляции.,Но если вы хотите, чтобы все использовали его.txt
А как насчет программ записи файлов?。Брат Нэн问:Что сейчас не так с этим кодом??
class Base {
public Base(String s) {
System.out.print("B");
}
}
public class Derived extends Base {
public Derived (String s) {
System.out.print("D");
}
public static void main(String[] args) {
new Derived("C");
}
}
Если родительский класс и подкласс имеют обаПараметрический конструктор,Конструктор подкласса должен явно вызывать конструктор родительского класса.,В противном случае это будетОшибка компиляции。Итак, нормальное письмо должно быть таким。
public Derived (String s) {
super(s);
System.out.print("D");
}
Кроме того, всем нужно обратить внимание на одну вещь: вызов конструктора родительского класса должен находиться в первой строке конструктора подкласса, а вызов конструктора родительского класса может появляться только в конструкторе подкласса, в противном случае будет сообщено об ошибке компиляции.
В следующем коде есть две ошибки компиляции. Совет: ошибка в дочернем классе. Можно ли ее быстро найти?
class Parent {
public static String staticVar = "Static Variable from Parent";
private static String privateStaticVar = "Private Static Variable from Parent";
public static void staticMethod() {
System.out.println(staticVar);
}
private static void privateStaticMethod() {
System.out.println(privateStaticVar);
}
}
class Child extends Parent {
public void staticMethod() {
System.out.println("Static method in Child");
}
public void display() {
System.out.println(staticVar);
System.out.println(privateStaticVar);
privateStaticMethod();
staticMethod();
}
(1) Частные переменные и частные методы родительского класса.,Есть подкатегориинаследоватьиз,Но не могу получить доступ。такChild.display()
里из以下调用是Ошибка компиляциииз。
System.out.println(privateStaticVar);
privateStaticMethod();
(2) Подклассы можно контролировать.,同час也可以访问父类изstaticпеременная、метод。但父类изstatic
метод大家需要注意,Подклассы не допускаютсяпрямое освещениеиз,Таким образом, следующий код будет ошибкой компиляции.
public void staticMethod() {
System.out.println("Static method in Child");
}
Правильный подход — добавить к методу модификатор static.,代表这是子类из一个新метод。Такой способ письма называетсяметод скрыт,Когда существует статический метод с одинаковым именем и параметрами как в подклассе, так и в родительском классе.,Методы подкласса скроют методы родительского класса.
public static void staticMethod() {
System.out.println("Static method in Child");
}
Кроме того, если метод родительского класса изменен на Final, подкласс не сможет его переопределить.
Следуя примеру кода выше,父类изметод同样использоватьstatic
Изменить,子类изprivateStaticMethod
метод算不算覆盖父类изметод呢?Есть ли ошибка компиляции??
class Parent {
public static String staticVar = "Static Variable from Parent";
private static String privateStaticVar = "Private Static Variable from Parent";
private static void privateStaticMethod() {
System.out.println(privateStaticVar);
}
}
class Child extends Parent {
public void privateStaticMethod() {
System.out.println(staticVar);
}
}
Ответ в том, что он компилируется нормально.
Для методов, недоступных в родительском классе, запись методов с тем же именем и параметрами в подклассе не считается перезаписью. Доступ к методам родительского класса недоступен, поэтому перезапись невозможна. . .
Существует три различия между интерфейсами и абстрактными классами: модификация классов, модификация методов и модификация переменных. Давайте посмотрим вниз.
(1) Класс
интерфейсиспользоватьinterface
Изменить,иабстрактный классиспользоватьabstract
Изменить。когда они действуют каквнешний классчас,Можно использовать только общедоступные модификации и модификации по умолчанию.,Частную модификацию использовать нельзя.
(2) Метод
Общие методы интерфейсаможет быть толькоpublic abstract
、default
、static
Изменить。
метод абстрактного интерфейсаможет бытьвсе Изменить符Изменить,Кроме финала.
Подводить итоги,У них обоих тоже есть что-то общее,就是都不能использоватьfinalИзменить。
(3) Переменные
Общие переменные интерфейсаможет быть толькоpublic static final
Изменить。
переменная абстрактного интерфейсаможет бытьвсеИзменить符Изменить。
Это очень предвзятое знание.,Следующий код имеет три имени с именамиgetType
из重载метод,Их типы возвращаемых значений одинаковы, а имена методов одинаковы.,Отличаются только типы входных параметров.
Брат Нэн спросил: Каков результат выполнения программы?
public class Test {
public static void main(String[] args) {
for(Collection<?> collection: collections) {
System.out.println(getType(collection));
}
}
public static final Collection<?>[] collections = {new HashSet<String>(), new ArrayList<String>()};
public static String getType(Collection<?> collection) {
return "Super:collection";
}
public static String getType(List<?> list) {
return "Super:list";
}
public String getType(ArrayList<?> list) {
return "Super:arrayList";
}
}
Брат Нэн给大家这么一行代码:Collection<?> collection = new ArrayList<Integer>()
,левыйизCollection<?>
На самом деле этостатический тип,右边изnew ArrayList<Integer>()
На самом деле это动态类型。
иКомпилятор обрабатывает перегруженные методы.час,是根据参数изстатический типкак основание для приговора,и不是根据动态类型。collections
数组里面извсе实例изстатический тип ВсеCollection<?>
,getType
метод也Все执行上文из第一个重载метод。
# Результаты выполнения программатора
Super:collection
Super:collection
Ты выучил (фэй)?
Вы видели красное море в наборе в 22-ю Явскую школу на сайте? Какова ситуация на рынке на 24-й сессии этого года?
Эта статья включена в мое «Расширенное руководство по изучению Java» с открытым исходным кодом, которое охватывает основные знания и ключевые моменты интервью, которые не поймут даже Javars, работающие в крупных компаниях. Я верю, что это поможет вам не запутаться на пути к развитию Java. Брат Нэн надеется получить ваши отзывы. ⭐ Star ⭐Поддержите меня, чтобы я стал лучше。GitHubадрес:https://github.com/hdgaadd/JavaProGuide。
добро пожаловатьсосредоточиться на Брат Нэниз公众号:Расширенный компас Java。公众号里有Брат Нэн珍藏整理из大量优秀pdfкниги!
Я Брат Нэн, Нэн — это Нэн. Я нашла ваши интересные комментарии на Get➕Like➕Follow.
Творить непросто, поэтому вы можете ставить лайки, собирать и подписываться, чтобы поддержать его. Ваша поддержка — самая большая мотивация для моего творчества.❤️