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

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

  • 相关阅读:
    python3.8安装flask出现错误“ModuleNotFoundError: No module named '_ctypes'”
    利用virtualenvwrapper创建虚拟环境出现错误“/usr/bin/python: No module named virtualenvwrapper”
    CentOS7 下升级Python版本
    Python 定义动态变量
    Linux常用命令
    项目经验之:项目用到LinQ (总结)
    ListBox操作一些总结
    项目经验之:如CSDN一样的分页,我能否做这样的分页吗??????
    记上一笔,listbox展示项中,隐藏其中一项
    项目经验之:SQL一些简单问题中可以使用的技巧
  • 原文地址:https://www.cnblogs.com/yorickLi/p/6173710.html
Copyright © 2011-2022 走看看