Thinking in java 4学习(二)final,protected关键字

protected关键字:

对于类用户而言这是private的,但对于任何继承于此类的导出类或其他任何位于同一个包内的类来说,他是可以访问的。

final关键字:

(1)final数据

1、final 数据 要么在定义时就初始化 ,要么在每个构造器中初始化,否则编译不过。

2、final修饰基本类型使数值恒定不变;final修饰的对象引用使引用恒定不变,但对象自身是可以被修改的。

(2)final方法

使用final方法原本有两个原因(一)把方法锁定,防止任何继承类修改它(二)出于效率。但现在只需要考虑第一个原因

final vs private

类中所有的private方法都隐式地指定为final的(因为无法取用private方法,也就无法覆盖它)

(3)final类

final类不可以被继承

public class Value {

    int i;
    public Value(int i){
        this.i = i;
    }
}
import java.util.Random;

public class FinalData {

    private static Random rand = new Random(47);
    private String id;

    public FinalData(String id) {
        this.id = id;
    }

    private final int valueOne = 9;
    private static final int VALUE_TWO = 99;
    public static final int VALUE_THREE = 39;
    private final int i4 = rand.nextInt(20);
    static final int INT_5 = rand.nextInt(20);
    private Value v1 = new Value(11);
    private final Value v2 = new Value(22);
    private static final Value VAL_3 = new Value(33);
    private final int[] a = { 1, 2, 3, 4, 5, 6 };

    public String toString() {
        return id + ":" + "i4 = " + i4 + ". INT_5 = " + INT_5;
    }

    public static void main(String[] args) {
        FinalData fd1 = new FinalData("fd1");
        // !fd1.valueOne++; //Error :The final field FinalData.valueOne cannot
        // be assigned
        fd1.v2.i++;
        fd1.v1 = new Value(9);
        for (int i = 0; i < fd1.a.length; i++) {
            fd1.a[i]++;
        }
        // !fd1.v2 = new Value(0); //Error :The final field FinalData.valueOne
        // cannot be assigned
        // !fd1.VAL_3 = new Value(1);//Error :The final field FinalData.VAL_3
        // cannot be assigned - The static field FinalData.VAL_3 should be
        // accessed in static way
        // !fd1.a = new int[3]; ////Error :The final field FinalData.valueOne
        // cannot be assigned
        System.out.println(fd1);
        System.out.println("Creating new FinalData");
        FinalData fd2 = new FinalData("fd2");
        System.out.println(fd1);
        System.out.println(fd2);
    }

}

输入结果:

fd1:i4 = 15. INT_5 = 18
Creating new FinalData
fd1:i4 = 15. INT_5 = 18
fd2:i4 = 13. INT_5 = 18

这里有个疑问:i4和INT_5都是随机数,为何无论运行多少次main方法结果都是一样的?

详见第七章:复用类

时间: 2024-07-30 05:13:39

Thinking in java 4学习(二)final,protected关键字的相关文章

java入门学习(二)

一.类和对象 1.开篇瞎BB 物以类聚. 世间万物皆对象,对象是能接触到的实体.类是一组有相同属性和方法的对象的集合,或者说它们的特征提取,类是一种抽象的概念.类由属性和方法组成,属性是它的各种静态的特征,方法是它能干啥.<易>有云,“物以类聚,人以群分”. 打个比喻,有一群人都在追一个很可爱的姑娘.这群人可以抽象出一个类,他们有相同的属性,比如都喜欢这姑娘,都是男孩子.他们有一些相同的方法,什么送花儿呀,请吃饭呀,请看电影呀,陪姑娘聊天呀.所以呀,他们是一个类.而单独的一个人就是一个对象,这

java核心学习(二十一) 多线程---创建启动线程的三种方式

本节开始java多线程编程的学习,对于操作系统.进程.线程的基本概念不再赘述,只是了解java对于多线程编程的支持有哪些. 一.继承Thread类来创建线程 java语言中使用Thread类来代表线程,代表线程的类可以通过继承Thread类并重写run()方法来实现多线程开发,调用线程类实例的start方法来启动该线程.下面来试一试 package ThreadTest; public class FirstThread extends Thread{ private int i; public

java web 学习二(Tomcat服务器学习和使用1)

一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml配置文件中的Connector节点进行的端口修改 例如:将Tomcat服务器的启动端口由默认的8080改成8081端口 Tomcat服务器启动端口默认配置 1 <Connector port="8080" protocol="HTTP/1.1" 2 connect

Java基础学习(二)&mdash;数组

一.数组的概念      定义: 数组是存储同一种数据类型的多个元素的集合.      数组既可以存储基本数据类型,也可以存储引用数据类型.      格式:           格式1: 数据类型[] 数组名;           格式2: 数据类型 数组名[];      这样定义完了,但是数组中是没有元素的,我们必须对数组进行初始化.   二.数组的初始化      Java数组必须先初始化,然后才能使用.所谓的初始化就是为数组的元素分配内存空间,并为每个数组元素赋值.      动态初始

java理论基础学习二

JAVA开发工具 文本编辑器 UltraEdit EditPlus notepad++ 集成开发环境 IDE Integrated Development Enviroment JBuilder  http://www.borland.com基本淘汰 Eclipse http://www.eclipse.org 重点 NetBeans http://java.sun.com java区分大小写 main方法的固定格式 public static void main(String[] args)

Java基础学习之final和多态及类型转换

final关键字: final关键字是最终的意思,可以修饰类,成员变量,成员方法. ?    修饰类,类不能被继承 ?    修饰变量,变量就变成了常量,只能被赋值一次. ?    修饰方法,方法不能被重写 final关键字面试题 ?    final修饰局部变量 在方法内部,该变量不可以被改变,只可以赋值一次. 在方法声明上,分别演示基本类型和引用类型作为参数的情况 基本类型,是值不能被改变 引用类型,是地址值不能被改变.对象在堆内存的值是可以改变的. ?    final修饰变量的初始化时机

Java反射学习二

利用反射进行对象拷贝的例子 如下例程ReflectTester类进一步演示了Reflection API的基本使用方法. ReflectTester类有一个copy(Object object)方法,这个方法能够创建一个和参数object同样类型的对象,然后把object对象中的所有属性拷贝到新建的对象中,并将它返回. 这个例子只能复制简单的类,假定类的每个属性都有public类型的getXXX()和setXXX()方法. import java.lang.reflect.Constructor

JAVA基础学习之final关键字、遍历集合、日期类对象的使用、Math类对象的使用、Runtime类对象的使用、时间对象Date(两个日期相减)

1.final关键字和.net中的const关键字一样,是常量的修饰符,但是final还可以修饰类.方法.写法规范:常量所有字母都大写,多个单词中间用 "_"连接. 2.遍历集合ArrayList<Integer> list = new ArrayList<Integer>();list.add(1);list.add(3);list.add(5);list.add(7);// 遍历List方法1,使用普通for循环:for (int i = 0; i <

Java入门学习二

Java中的赋值运算符 赋值运算符是指为变量或常量指定数值的符号.如可以使用 "=" 将右边的表达式结果赋给左边的操作数. Java 支持的常用赋值运算符,如下表所示: Java中的比较运算符 比较运算符用于判断两个数据的大小,例如:大于.等于.不等于.比较的结果是一个布尔值( true 或 false ). Java 中常用的比较运算符如下表所示: 注意: 1.  > . < . >= . <= 只支持左右两边操作数是数值类型 2.  == . != 两边的操

Java从零开始学二(标识符和关键字)

标识符.关键字.注释 一.标识符 Java中的包.类.方法.参数和变量的名字由任意顺序的大小字母.数字.下划线(_).和美元符号($)组成, 标识符:不能以数字开头.也不能是JAVA中的保留关键字 如:yourname.yourname_dxh.li_yourname.$yourname都是合法的标识符 class.67.9,Hello World是不合法的,class是关键字,67.9以数字开头,Hello World中间有空格 二.关键字      Java中的关键字 abstract bo