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

  例如局部变量和全局变量

时间: 2024-10-29 19:07:55

Java谜题——类谜题(二)的相关文章

Java File类学习 <二>

1.File类提供了删除文件或一个空文件夹的方法,并提供了判断文件或者文件夹是否存在,判断是否为文件.文件夹.是否为隐藏文件.以及是否为绝对路径的方法 package com.fish.file; import java.io.File; /* 删除: delete() 删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false. deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除 判断

java中常用的工具类(二)

下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

Java多线程基础(二)定时器类:Timer类和TimerTask类

Java多线程基础(二)定时器类:Timer类和TimerTask类 Timer类和TimerTask类是jdk实现定时器功能的早期方法,jdk1.5以前就支持Timer类和TimerTask类.JDK1.5之后引入了新的机制,将在后续博文中研究. 1 指定时间间隔后执行任务 import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TraditionalTimerTest {

Java常用类(二) Scanner类和大数类

二.Scanner类 有C系语言基础的可能都比较熟悉scanf("%d",&a);和cin>>a;这种代码,也打开了程序交互的第一道门.因此,这些程序员开始学Java时都会先找输入输出(指标准输入输出),Java的输出就非常常见,任何一个Java教程基本都是以输出开始的,然而输入却在很后面提到,因为Java的输入不似输出那么简单.现在我们就来介绍一下实现输入的Scanner类. 1.Scanner基本使用方法和next()系列方法 一个从键盘输入的基本示例: imp

Java 反射理解(二)-- 动态加载类

Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 演示 我们以具体的代码来演示什么是动态加载类和静态加载类: 新建:Office.java: class Office { public static void main(String[] args) { // new 创建对象,是静态加载类,在编译时刻就需

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

Java复用类

Java复用类 Java复用类一般有两种方法. 一,组合:在新的类中产生现有类的对象.由于新的类是由现有类的对象所组成,所以这种方法成为组合. import java.util.*; class WaterSource{ private String s; WaterSource(){ System.out.println("WaterSource()"); s="constructed"; } public String toString(){ return s;

解决内存泄漏更加清楚的认识到Java匿名类与外部类的关系

1.事件起因 在做项目的时候,通过Android Studio的Memory Monitor窗口观察程序内存使用情况,发现当程序退出的时候,有一部分应该释放掉的内存没有释放掉,知道程序中应该有内存泄漏了.为了发现程序中的内存泄漏,我切换了IDE工具到Eclipse,里面安装了内存泄漏的分析工具MAT,具体怎么用MAT分析内存泄漏可以自己Google,我把我自己找到内存泄漏的地方贴出来 从上图中可以看到,有24M左右的内存被mView(其实它真正是一个Fragment)这个变量持有,导致Java垃

Java Date类和Calendar类的一个控制台打印日期的小程序

Java Date类和Calendar类的一个打印日期的小程序,可以直接用. package com.boy.Idate.calendar; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 控制台可视化日历 * @author 田硕 */ public class VisualCalendar {