Почему защищенные члены разрешены в финальных классах Java?

Почему защищенные члены разрешены в финальных классах?

Разве это не ошибка времени компиляции?

Изменить: как указали люди, вы можете получить тот же доступ к пакетам, используя вместо этого модификатор по умолчанию. Он должен вести себя точно так же, потому что protected является стандартным + подклассами, а последний модификатор явно запрещает подклассирование, поэтому я думаю, что ответ - это больше, чем просто предоставление такого же доступа к пакетам.

Ответы

Ответ 1

Модификатор protected необходим для методов, которые переопределяют методы protected из базового класса, не подвергая эти члены <<22 > .

В общем, вы могли бы ввести много ненужных правил, чтобы запрещать неправдоподобные комбинации (например, protected static), но это не помогло бы. Вы не можете запрещать глупость.

Ответ 2

Поскольку защищенные члены могут быть доступны другими классами в одном пакете, а также подклассы.

Ответ 3

Защищенный модификатор также обеспечивает доступ в пределах одного и того же пакета, а не только к подклассам. Таким образом, это не совсем бессмысленно в конечном классе.

Ответ 4

Аргумент, указанный здесь, о том, что члены protected могут быть доступны классами одного и того же пакета, действителен, но в этом случае protected становится равным видимости по умолчанию (package-private), и остается вопрос - почему оба разрешены.

Я бы предположил две вещи:

  • Не нужно запрещать его
  • класс может быть сделан final временно, пока не будет принято конструктивное решение. Не нужно идти и изменять все модификаторы видимости каждый раз, когда он добавляет или удаляет final

Ответ 5

Вы можете утверждать, что, но в этом нет никакого реального вреда. Не конечный класс может также иметь защищенный член, но не подкласс, он никого не беспокоит.

Ответ 6

package p;

import java.sql.Connection;

public final class ProtectedTest {
    String currentUser;
    Connection con = null;

    protected Object ProtectedMethod(){
        return new Object();
    }
    public ProtectedTest(){
    }
    public ProtectedTest(String currentUser){
        this.currentUser = currentUser;
    }
}

package p;

public class CallProtectedTest {
    public void CallProtectedTestMethod() {
        System.out.println("CallProtectedTestMethod called :::::::::::::::::");
        ProtectedTest p = new ProtectedTest();
        Object obj = p.ProtectedMethod();
        System.out.println("obj >>>>>>>>>>>>>>>>>>>>>>>"+obj);
    }
}

package p1;

import p.CallProtectedTest;

public class CallProtectedTestFromp2 {
    public void CallProtectedTestFromp2Method(){
        CallProtectedTest cpt = new CallProtectedTest();
        cpt.CallProtectedTestMethod();
    }

    public static void main(String[] args) {
        CallProtectedTestFromp2 cptf2 = new CallProtectedTestFromp2();
        cptf2.CallProtectedTestFromp2Method();
    }
}