有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java未设置变量和方法

我有一个抽象类,它被扩展以提供我需要的标准方法和变量。 然而,这一次,我必须扩展同一个类,但是一些变量和一些方法不适合我。所以我想知道是否有可能关闭这些变量/方法。我指定我必须扩展这个类,我不能创建另一个。 例如,我有一个抽象类:

public abstract class A {
    protected int a, b, c;

    public abstract void A();
    public abstract void B();
    public abstract void C();
}

public class B extends A {
    public B() {
        a = 5;
        b = 7;

        A();
        B();
    }

    public void A() {
        System.out.println("A: " + a);
    }

    public void B() {
        System.out.println("B: " + b);
    }

    //Unset the variable 'c' and the method 'C()' because they are useless
}

其实我不知道是否值得去做,我依靠你的知识


共 (3) 个答案

  1. # 1 楼答案

    没有“取消设置”超类的变量或方法的内置机制

    标准解决方案是创建两个基类

    public abstract class A {
        protected int a, b;
    
        public abstract void A();
        public abstract void B();
    }
    
    public abstract class AC extends A {
        protected int c;
    
        public abstract void C();
    }
    

    一个(糟糕的)解决方法,只适用于方法,可以实现类似下面的代码,以禁止使用C()

    @Override
    public void C() {
      throw new UnsupportedOperationException("This method is not allowed for this class");
    }
    

    长话短说,javac将接受使用C(),但RuntimeException将在运行时发布。如果未捕获,此异常将产生崩溃,但由于RuntimeException的性质,编译器不需要try语句
    这只是一段难看的代码

    Nick L.在另一个回应中提出了一个更干净的解决方案,将C()设置为私有

  2. # 2 楼答案

    如前所述,这是一个糟糕的设计。如果派生类中不需要某些方法/字段,那么应该将它们放在另一个抽象类中,并派生上一个抽象类

    作为一种解决方法,我认为如果希望函数不抽象,可以将B类中要公开访问的函数设置为私有函数:

    public class B extends A {
    
        //c property is private.
    
        public B() {
            a = 5;
            b = 7;
    
            A();
            B();
        }
    
        public void A() {
            System.out.println("A: " + a);
        }
    
        public void B() {
            System.out.println("B: " + b);
        }
    
        //This is set as publicly inaccessible, although implementation is provided.
        private void C() {}
    }
    
  3. # 3 楼答案

    你唯一能做的就是把method c变成abstract。所以不需要实施。如果你在以后的子类中需要它,你可以使用它

    public abstract void C();