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

      例如局部变量和全局变量

  • 相关阅读:
    智慧出行--maas
    hystrix动态修改参数
    hystrix元素详解
    hystrix讲解:熔断降级隔离以及合并请求
    幂等性概念
    设计模式之Command
    Unity AssetBundle工作流
    unity share current game screen
    `Facebook.Unity.Settings' has already been imported error solution
    IOException: win32 io returned 267. Path:
  • 原文地址:https://www.cnblogs.com/sylz/p/5758990.html
Copyright © 2011-2022 走看看