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

      例如局部变量和全局变量

  • 相关阅读:
    呵呵,庆祝偶的blog开张了~
    把.NET程序部署到没有安装.NETFramwork的机器上
    1842005 日记
    So In Love
    windows网络编程经典入门
    水木穿梭
    c++智能指针的使用,shared_ptr,unique_ptr,weak_ptr
    c++的左值(lvalue),右值(rvalue),移动语义(move),完美转发(forward)
    (一)深入理解JVM第三版JDK的发展历史
    处理在多参数情况下分页参数的完整性
  • 原文地址:https://www.cnblogs.com/sylz/p/5758990.html
Copyright © 2011-2022 走看看