java解惑之属性隐藏

<span style="font-size:18px;">import java.util.*;
public class SixtySixth {
        public static void main(String[] args){
                System.out.println(new Child().name);
                System.out.println(new Child().count);
                System.out.println(new Child().parent);
                System.out.println(((Base)new Child()).count);
                System.out.println(((Base)new Child()).name);
                //System.out.println(((Base)new Child()).uniq);
                Child.fun();//调用子类隐藏的方法
                new Child().f1();//调用子类继承的方法,在f1()中调用重写的f()
        }
}
class Child extends Base{
        public String name =  "child";//掩盖父类的非静态name
        public static int count=100;//掩盖了父类的静态count
        public static int uniq = 200;//子类独有的静态
        public static void fun(){
                System.out.println("fun:child");
        }
        public void f(){
                System.out.println("override");
        }
}
class Base{
        public String name =  "base";
        public static int count = 0;
        public static int parent=5;//父类独有静态
        public int bc = 6;//父类独有的非静态bc,可被子类继承
        public Base(){
                count++;
        }
        public void f1(){
                f();
        }
        public static void fun(){
                System.out.println("fun:base");
                //f();
        }
        public void f(){
                System.out.println("original");
        }
}
</span>

child

100

5

4

base

fun:child

override

关于继承

静态方法,一般方法和静态属性,一般属性都会被子类继承到,但是只有一般方法可以被重写,有多态性,其他三个都是被继承或被隐藏。

如果被隐藏了,那么访问的就是子类中的属性,而不管是不是合理。

如:

import java.util.*;
public class SixtySixth {
        public static void main(String[] args){
                System.out.println(new c().a);
        }
}
class c extends b{
        private int a = 0;
}
class b{
        public int a = 1;
}

访问到的a是谁呢?是输出0还是1呢?

SixtySixth.java:12: 错误: a可以在c中访问private
		System.out.println(new c().a);
		                          ^
1 个错误

既没有输出0也没有输出1,而是报错了。也就是说被隐藏之后的属性,只能在类里面用super访问隐藏的属性或方法。

import java.util.*;
public class SixtySixth {
        public static void main(String[] args){
                new c().f();
        }
}
class c extends b{
        private int a = 0;
        public void f(){
                System.out.println("我的a="+a);
                System.out.println("我父类的a="+super.a);
        }
}
class b{
        public int a = 1;
}
我的a=0
我父类的a=1
时间: 2024-11-10 15:51:03

java解惑之属性隐藏的相关文章

Java解惑五:类之谜

本文是依据JAVA解惑这本书,做的笔记.电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题46 函数重载的问题. JAVA重载解析过程:1. 选取全部可用的方法或者构造器:2. 从过程1中选取的方法或构造器中选择最精确的. 一般而言:能够强制要求编译器选择一个精确的重载版本号,将实參转型为形參所声明的类型. 谜题47 继承中静态域的问题. 静态域由声明它的类及其全部子类共享. 假设须要让每个子类都具有某个域的单独拷贝,必须在每个子

Java解惑七:更多类之谜

谜题66 继承的问题. 对于实例方法:命名相同时,子类会覆写父类的方法,且访问权限至少和父类一样大. 对于域:命名相同时,子类会隐藏父类的域,且访问权限任意. 谜题67 不要重用库中的类名. 谜题68 命名的问题. 类名应该以大写字母开头,形式为:MixedCase. 变量以小写字母开头,形式为:mixedCase. 常量以大写字母开头,形式为:MIXED_CASE. 单个大写字母,只能用于类型参数,形式为:Map<K, V>. 包名应该都是小写,形式为:lower.case. 当一个变量和一

java中静态属性和和静态方法的继承问题 以及多态的实质

首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里面定义了静态方法和属性,那么这时候父类的静态方法 或属性称之为“隐藏”,你如果想要调用父类的静态方法和属性,直接通过父类名.方法名或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是 跟实例方法和属性不太一样,存在“隐藏”的这种情况. 多态之所以能够实现是依赖于 继承 接口和 重写 .重

《Java解惑》读书笔记

 摘选自<Java解惑>一书,之前整理了部分,一直没看完,最近为了督促自己每天读点这本书,决定一天至少更新一个谜题的内容,欢迎讨论. 欢迎关注技术博客http://blog.sina.com.cn/u/1822488043 Java解惑读书笔记 谜题1:奇数性 取余操作的定义: ( a / b ) * b + ( a % b ) = a 其中(a/b)是java运算的结果,也就是a/b是一个整数,比如3/2=1. 所以当取余操作返回一个非零结果的时候,它与左操作数具有相同符号. 请测试你的

【java解惑】输入输出流使用后及时关闭问题

如下所示代码: public class Example041 { public static void main(String[] args) throws IOException { Example041 e41 = new Example041(); e41.copy("d:\\微信名ape_it.txt", "d:\\微信名爱题猿.txt"); } private void copy(String src, String dest) throws IOExc

【java解惑】java中那些反常识的小知识(续)

六.Q:请为 i!=0 && i ==-1 提供一个声明,使得其成立. 分析:在布尔表达式(i != 0 && i == -i)中,一元减号操作符作用于 i,这意味着它的类型必须是数字型的:一元减号操作符作用于一个非数字型操作数是非法的.因此,我们要寻找一个非 0 的数字型数值,它等于它自己的负值.NaN 不能满足这个属性,因为它不等于任何数值,因此,i 必须表示一个实际的数字.肯定没有任何数字满足这样的属性吗?嗯, 没有任何实数具有这种属性,但是没有任何一种 Java 数

【java解惑】java中那些反常识的小知识

一.Q:请为 i == i + 1 ;  提供一个声明使得条件成立.  分析:一个数字永远不会等于它自己加 1对吧!如果这个数字是无穷大的又会怎样呢?Java 强制要求使用IEEE二进制浮点数算术标准IEEE 754,它可以让你用一个 double 或 float 来表示无穷大.无穷大加 1 还是无穷大.如果 i 在声明为无穷大那么i == i + 1 就成立.     A:可以用任何被计算为无穷大的浮点算术表达式来声明 i ,例如double i = 1.0 / 0.0; 不过最好是能够利用标

java解惑之final

<span style="font-size:18px;">import java.util.*; class J{ public static final int count = 011; } public class SeventyFirst extends J{ public static final int count = 022; public static void main(String[] args){ System.out.println(count);

【java解惑】前缀自增自减和后缀自增自减问题

    如下代码: public class Example025 { public static void main(String[] args) { int ape = 100; int it = 100; int ape_it = 100; for (int i = 0; i < 100; i++) { ape--; it = it--; ape_it = --ape_it; } System.out.println("ape = " + ape); System.out.