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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(){};
    
}
View Code

下面是程序的输出结果

------属性------
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修饰的变量一旦被赋值,则引用不能被修改),很明显不符合情理,形成了悖论... 家里的家具明明可以换的,不然坏了,不能换新的怎么用。。。

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





以上是关于final修饰的类,其属性和方法默认是被final修饰的吗?的主要内容,如果未能解决你的问题,请参考以下文章

Final浅谈

Final 用法

final关键字所修饰的类有什么特点

final关键字修饰的类称为

12finall(java)

Java final修饰符