final修饰的类,其属性和方法默认是被final修饰的吗?

在论坛上,看到一个问题,当然,各位聪明的客官想必已经知道问题是什么了,嘿嘿,没错就是文章的标题:final修饰的类,其属性和方法默认是被final修饰的吗?

老实说,刚开始看到这个问题的时候,有点懵...(现场捕获懵比一只:),嘻嘻),之前学习的语法什么的,隔了太久忘记了。。。既然忘记了,就写个程序进行测试下吧

嘻嘻,以下是测试的程序:(小程序中用到了反射机制,还没学习到的客官,可以先去了解下哈:) )

/**
 * DateAndTime: 2016-12-13下午10:38:08
 */
package question;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 测试final修饰的类,其属性和方法是不是final的?
 * ------使用String类进行测试------
 * ---------利用反射机制获取属性和方法的修饰符,得到结果
 * @author Administrator
 *
 */
public class Question1 {

    public static void reflection(Class clazz) {

        System.out.println("------属性------");
        Field[] fields = clazz.getDeclaredFields();
        for(Field f : fields) {
            int iModifiers = f.getModifiers();
            String sModifiers = Modifier.toString(iModifiers);
            //打印所有属性的修饰符及属性名
            System.out.println(sModifiers+" "+f.getName());
        }

        System.out.println("------方法------");
        Method[] methods = clazz.getMethods();
        for(Method m: methods) {
            int iModifiers = m.getModifiers();
            String sModifiers = Modifier.toString(iModifiers);
            //打印所有方法修饰符及方法名
            System.out.println(sModifiers+" "+m.getName());
        }
    }

    public static void main(String[] args) {
        reflection(Person.class);
    }

}

final class Person {

    private String name;
    private String age;
    private final String idCard;

    Person(String idCard) {
        this.idCard = idCard;
    }

    public static void m(){};
    public void m1(String s){};
    public final void m2(){};

}

下面是程序的输出结果

------属性------
private name
private age
private final idCard
------方法------
public static m
public m1
public final m2
public final wait
public final native wait
public final wait
public equals
public toString
public native hashCode
public final native getClass
public final native notify
public final native notifyAll

结果显示,final修饰的类,其属性和方法不是被final修饰的。

final定义的类,其中的属性、方法不是final的。
其实,可以做个假设: 如果,final定义的类,其中的属性和方法默认是final的,那结合生活,举个例子
例如:
假设,房子 中 有一个 家具类 的对象作为属性(很合理哈...),现在假设,一旦住进了房子,以后不会搬家,那么这个
房子类就应该定义成final的,那么根据上面的假设:家具一旦被初始化后,也是不能更改指向的引用(家具一旦被确定后,就不能换新的)。

但是,如果说某天,家里的家具坏了,必须要换一个(很正常...),(换新家具,相当于变量引用了一个新对象,

而final修饰的变量一旦被赋值,则引用不能被修改),很明显不符合情理,形成了悖论... 家里的家具明明可以换的,不然坏了,不能换新的怎么用。。。

到此结束了,客官请回吧 :)

时间: 2024-10-05 04:27:40

final修饰的类,其属性和方法默认是被final修饰的吗?的相关文章

final可以修饰类、属性、方法

final可以修饰类.属性.方法. 当用final修饰类的时候,此类不可被继承,即final类没有子类.这样可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生. 当利用final修饰一个属性(变量)的时候,此时的属性成为常量. JAVA利用final定义常量(注意在JAVA命名规范中常量需要全部字母都大写): Final int AGE=10: 常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的. Final可以配合static使用. ? Static fin

java的接口、类、属性、方法各有哪些修饰符

参考博客:http://blog.csdn.net/cao_tao199612/article/details/7458245 1. 接口的修饰符只有:public 2. 类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1.公共类修饰符 public : Java 语言中类 的可访问控制符只有一个: public 即公共的.每个 Java 程序的主类都必须是 public 类

<九>面向对象分析之UML核心元素之设计类,类,属性,方法,可见性

设计类 --->设计类是系统实施中一个或多个对象的抽象.        --->设计类已经直接映射到实现代码了,因此设计类依赖于实施语言.另一方面,设计类来源于前期的系统分析,在统一过程中,类不是品空想像出来的.他们可以一一映射到前期系统分析的成果上.从这个观点出发,分析类的重要性就能够体现出来.分析类为设计类中多需要的界面,逻辑和数据提供了非常好的抽象基础,设计类可以非常容易和自然地从分析类中演化出来. 类        --->类对对象进行定义,而对象又实现(或成为实施)用例.类的来

关于对象、类、属性和方法的理解

文章开头申明:半路出家的野路子,可能个人理解有所欠缺,希望不吝赐教. 在初步学习java的过程中,往往都是绕不开面向对象的思想,说到对象或许挺多初学者和我一样只是听说过一个"万物皆对象"的说法,简单的记下对象包含属性和方法,然而实际使用的过程中往往有忽略这些东西,也就是犯浑了.个人的理解是希望将对象.类.属性和方法用一个例子来简单说明. 打个比方说我到商场买手机这个例子吧.我到了商场买手机,第一步自然就是向售货员提出我的要求:如手机大小.CPU.内存等等(属性),要求能拍照打电话首发短

波哥学JAVA,定义类 创建对象 实例化对象 属性 类调用属性或者方法

定义类 声明对象  创建对象 实例化对象 属性 对象调用属性或者方法 举例,下面定义类了一个类并声明属性,写了一个方法: 创建对象 实例化对象 属性 类调用属性或者方法

Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找

Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找 //查找是否存在 var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   reg.Subject := 'CodeGear Delphi 2007 for Win32';   reg.RegEx  := '\d';   if reg.Match then     ShowMessage('找到了')   else     ShowMessage('

Delphi 正则表达式之TPerlRegEx 类的属性与方法(2): 关于子表达式

Delphi 正则表达式之TPerlRegEx 类的属性与方法(2): 关于子表达式 // MatchedExpression 与 SubExpressions[0] var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   reg.Subject := 'CodeGear Delphi 2007';   reg.RegEx  := 'Delphi';   while reg.MatchAgain do   begin    

Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace

Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace // Replace var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   reg.RegEx  := 'ab';   reg.Replacement := '◆';   reg.Subject := 'ababab';   reg.ReplaceAll;   ShowMessage(reg.Subject); //返回: ◆◆◆  

Delphi 正则表达式之TPerlRegEx 类的属性与方法(5): Compile、Study

Delphi 正则表达式之TPerlRegEx 类的属性与方法(5): Compile.Study // Compile.Study var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   reg.RegEx  := 'ab';   reg.Options := [preCaseLess];   reg.Compile; {编译表达式}   reg.Study; {Study 方法会检查是否编译, 如果没有编译则执行 Com