scjp考试准备 - 8

题目,如下代码的执行结果:

import java.util.ArrayList;

class Pizza{
    ArrayList toppings;

    public final void addTopping(String topping){
        toppings.add(topping);
    }

    public void removeTopping(String topping){
        toppings.remove(topping);
    }
}

class PepperoniPizza extends Pizza{

    public void addTopping(String topping){
        System.out.println("Cannot add Toppings");
    }

    public void removeTopping(String topping){
        System.out.println("Cannot remove pepperoni");
    }
}

public class Test{

    public static void main(String[] args){
        Pizza pizza = new PepperoniPizza();
        pizza.addTopping("Mushrooms");
        pizza.removeTopping("Pepperoni");
    }

}

 

这道题考察的还是继承和重写相关的知识。不过这里涉及到了final关键字。

查了一下final关键字相关的知识点:

1. final修饰的成员变量必须显式指定初始值;

2. final修饰的类成员变量必须在声明变量时或静态初始化块中指定初始值;

3. final修饰的实例成员变量必须在声明变量时、或非静态初始化块或构造器中指定初始值;

4. final修饰的成员变量一旦被赋予初始值后就不可以被重新赋值;

5. final修饰的成员变量在被指定初始值前(被初始化前)不可以被访问;

6. 对于final修饰的局部变量。因为系统不会对局部变量进行初始化,局部变量必须被显式初始化。因此使用final修饰局部变量时,可以在定义时指定初始值,也可以不指定初始值。同样的,final修饰的局部变量一旦被指定初始值后也不可以被重新赋值。这里值得一提的是final修饰的形参,final修饰的形参所在的方法中,final修饰的形参不可以被赋值;

7. 对于final修饰的引用类型变量。引用类型变量保存的仅是一个引用地址,使用final仅能保证变量所保存的地址不发生变动,但是地址中所保存的对象却是可以变化的;

8. final方法不可以被重写。如果不希望子类重写父类的某个方法,可以使用final修饰这个方法;

9. final修饰的类不可以有子类。为了保证某个类不可以被继承,可以使用final修饰这个类。

 

如题中Pizza类中的addTopping方法就不可被重写。重写会报异常。

时间: 2024-11-08 01:47:45

scjp考试准备 - 8的相关文章

scjp考试准备 - 3

判断如下程序的最终输出值: import java.util.*; public class Quest{ public static void main(String[] args){ String[] colors = {"blue", "red", "green", "yellow", "orange"}; Arrays.sort(colors); int s2 = Arrays.binarySear

scjp考试准备 - 4

好吧这道题我丢脸了,竟然做错了. 如下程序的输出结果是: class Alligator{ public static void main(String[] args){ int[]x[] = {{1,2},{3,4,5},{6,7,8,9}}; int[][]y = x; System.out.print(y[2][1]); } }   最后输出7. 我是从1开始数的. scjp考试准备 - 4,布布扣,bubuko.com

scjp考试准备 - 5

如下代码,在所指示的位置插入代码能够正常编译: class Alpha{ public void bar(int... x){}; public void bar(int x){}; } public class Beta extends Alpha{ //insert code here } 有如下选项: A: private void bar(int x){} B: public void bar(int x){} C: public int bar(String x){return 1;}

scjp考试准备 - 2

判断如下代码的执行结果: public class Spock{ public static void main(String[] args){ Long tail = 2000L; Long distance = 1999L; Long story = 1000L; if( (tail>distance) ^ ((story*2)==tail ) ) System.out.print("1"); if((distance+1 !=tail) ^ ((story*2)==dist

scjp考试准备 - 1

判断如下代码最后的执行结果. public class Breaker{ static String o = ""; public static void main(String[] args){ z: o = o+2; for(int x=3; x<8; x++){ if(x==4) break; if(x==6) break z; o = o+x; } System.out.print(o); } } 这道题考察的重点是Java的循环控制.主要考察break语句及循环标签.

scjp考试准备 - 6

  题一,如下代码的执行结果: class Person{ String name = "No name"; public Person(String nm){name = nm;} } class Employee extends Person{ String empID = "0000"; public Employee(String id){empID = id;} } class EmployeeTest{ public static void main(S

scjp考试准备 - 10

题目为如下代码的执行结果: class Building{} public class Barn extends Building{ public static void main(String[] args){ Building build1 = new Building(); Barn barn1 = new Barn(); Barn barn2 = (Barn)build1; Object obj1 = (Object)build1; String str1 = (String)build

scjp考试准备 - 9

题目为如下代码的执行结果: abstract class Vehicle{ public int speed(){ return 0; } } class Car extends Vehicle{ public int speed(){ return 60; } } class RacerCar extends Car{ public int speed(){ return 150; } public void run(){ System.out.println("I'm running...&

scjp考试准备 - 11

题目如下: interface Foo{} class Alpha implements Foo{} class Beta extends Alpha{} public class Delta extends Beta{ public static void main(String[] args){ Beta x = new Beta(); //insert code here } } 将下面哪一行代码插入如上所示的位置中会导致java.lang.ClassCastException: A. A