zoukankan      html  css  js  c++  java
  • Java谜题——类谜题(二)

    1、域的隐藏

    代码如下:

    class Base {
        public String className = "Base";
    }
    
    class Derived extends Base {
        private String className = "Derived";
    }
    
    public class PrivateMatter {
        public static void main(String[ ] args) {
            System.out.println(new Derived().className);
        }
    }

        先猜猜输出什么吧?还是编译都不通过?

        父类Base和子类Derived中都有变量className,尽管Base有一个公共域className,但是这个域没有被继承到Derived类中,因为它被Derived中的className隐藏了。又因为Derived中的className为私有的,所以不具有访问权限,导致出现编译错误。

        那我们怎么样去访问Base的公共变量className呢?你肯定会想到强制类型转换,事实就是这么做的!

    代码如下:

    class Base {
        public  String className = "Base";
    }
    
    class Derived extends Base {
        public String className = "Derived";
    }
    
    public class PrivateMatter {
        public static void main(String[ ] args) {
            System.out.println(((Base)new Derived()).className);
        }
    }

        到此,我们可以得出一条结论,隐藏后的域可以通过子类强制类型转换来访问。但是,我们是否联想到方法的覆写?方法被覆写之后,不能通过这种方法访问到(除非在子类方法中使用super关键字调用父类方法)。因为强制类型转换之后,虽然得到父亲的引用,但是仍然是子类的实例,所以调用的方法还是子类的方法。(这也就是隐藏和覆写的区别

        编写程序时,除了覆写,要特别注意名字的区分,尽量不要一样。

    2、Java规定:一个main方法必须接受一个单一的字符串数组参数

    3、java 默认修饰符

      特别注意缺省的时候与在不在同一个包中的关系。

          参考博客:http://blog.csdn.net/cocojiji5/article/details/6638240

      还要注意:包内私有的方法是不能被包外的方法声明所覆写。

    4、final修饰符作用

    对方法而言:final意味着该方法不能被覆写(对实例方法而言)或者隐藏(对静态方法而言)。对于域,final意味着该域不能被赋值超过一次。

    5、遮掩obscure

    6、遮蔽shadow

      例如局部变量和全局变量

  • 相关阅读:
    计算器程序
    输入三个整数,输出最大数和最小数
    输入三个数a,b,c,要示按由小到大的顺序输出
    最短路
    luogu P3953 逛公园
    二分图匹配
    luogu P3231 消毒
    [bzoj2120] [洛谷P1903] 数颜色
    [bzoj2038] [洛谷P1494] [2009国家集训队] 小Z的袜子(hose)
    [洛谷P4012] [网络流24题] 深海机器人问题
  • 原文地址:https://www.cnblogs.com/sylz/p/5758990.html
Copyright © 2011-2022 走看看