关于static 访问权限、继承、多态、内部类结合在一起时的使用方法

本文主要讲的是static与后面这些概念结合在一起时static的用法,当然其他相关的内容也会涉及到。

一、static和访问权限和继承关系结合

想了解Java访问权限的内容可以去看这篇博客Java的权限修饰符的区别和用法总结
这三者结合时就是简单的把各自的使用方法放一起,结合代码解释

public class Test {
    public static void main(String[] args){
        Children.pr();
        Parent.pr();
        Parent p = new Parent();
        p.pr();
    }
}

class Parent{
    static int i=1;
    static void pr(){
        System.out.println("pr1:"+i);
    }
}

class Children extends Parent{
    public void t(){
        pr();
    }
}

编译通过,运行结果:
test1:1
test1:1
test1:1
static成员正常被子类继承。且子类可以通过 子类名.父类静态成员 来调用父类的静态成员变量。从用法上来说就是相当于子类也有了父类的静态成员。

如果在pr()方法加上private会怎样呢

public class Test {
    public static void main(String[] args){
//      Children.pr();//编译不通过
//      Parent.pr();//编译不通过
        Parent p = new Parent();
//      p.pr();//编译不通过
//      p.pr2();//编译不通过
    }
}

class Parent{
    static int i=1;
    private static void pr(){
        System.out.println("pr1:"+i);
    }
    private void pr2(){
        System.out.println("pr1:"+i);
    }
}

class Children extends Parent{
    public void t(){
//      pr();//编译不通过
//      pr2();//编译不通过
    }
}

注释部分都是编译不通过的。
所以说明加上private的方法子类都是无法继承的,无论是不是static,用private修饰的成员变量只能在本类使用。不管是不是静态。

二、static、访问权限、继承、多态关系的结合

加上多态的用法之后就有点不同了

public class Test {
    public static void main(String[] args){
//      Children.pr();//编译不通过
//      Parent.pr();//编译不通过
        Parent p = new Parent();
//      p.pr();//编译不通过
//      p.pr2();//编译不通过

        Parent p2 = new Children();
//      p2.pr2();//编译不通过
        p2.pr3();
        p2.staticPr3();//警告
    }
}

class Parent{
    static int i=1;
    private static void pr(){
        System.out.println("pr:"+i);
    }
    private void pr2(){
        System.out.println("pr2:"+i);
    }
    static void staticPr3(){
        System.out.println("ParentStaticPr3");
    }
    void pr3(){
        System.out.println("ParentPr3");
    }
}

class Children extends Parent{
    public void t(){
//      pr();//编译不通过
//      pr2();//编译不通过
    }
    static void staticPr3(){
        System.out.println("ChildrenStaticPr3");
    }
    void pr3(){
        System.out.println("ChildrenPr3");
    }
}

输出结果:
ChildrenPr3
ParentStaticPr3
结论:非静态方法属于类的实例,是可以被子类重写,从而达到多态的效果; 静态方法属于类,是不能被重写,故而也不能实现多态。

静态方法不能实现多态,Parent p2 = new Children(); p2.pr3(); p2.staticPr3();强行这样写会有警告,并且staticPr3调用的是父类的方法。

三、static、访问权限、继承、内部类关系结合

想了解内部类相关内容的可以去看这篇博客java内部类总结

public class Test {

    static class Parent{
        static int i=1;
        private static void pr(){
            System.out.println("pr:"+i);
        }
        private void pr2(){
            System.out.println("pr2:"+i);
        }
        static void staticPr3(){
            System.out.println("ParentStaticPr3");
        }
        void pr3(){
            System.out.println("ParentPr3");
        }
    }

    class Children extends Parent{
        public void t(){
        }
        static void staticPr3(){//编译不通过
            System.out.println("ChildrenStaticPr3");
        }
        void pr3(){
            System.out.println("ChildrenPr3");
        }
    }

}

从上面Children的staticPr3方法编译不通过可知普通内部类不能有静态成员变量,只有静态内部类才能有静态成员变量。 内部类中结合权限修饰符、继承、多态的static用法和普通外部类一样。

时间: 2024-07-30 12:48:09

关于static 访问权限、继承、多态、内部类结合在一起时的使用方法的相关文章

窥探Swift之类的继承与类的访问权限

上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过面向对象编程(OOP)的小伙伴并不陌生,继承就是OOP编程中几大特征之一,所以还是有必要把类的继承拎出来聊聊的.说到访问权限,这个在OOP编程中也是不可或缺的.如果你接触过其他OOP的语言,你应该对private, public, protected并不陌生.在Swift这么面向对象的编程语言中,也有类似的概

C++ 的三种访问权限与三种继承方式_C 语言

三种访问权限 我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public.protected.private.要理解它们其实也很容易,看下面了一个例子. 父类: class Person { public: Person(const string& name, int age) : m_name(name), m_age(age) { } void ShowInfo() { cout << "姓名:" << m_name <&l

理解Java访问权限控制_java

今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理? 场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1.fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理? 此时,访问权限控制便可以起到作用了. 在Java中,提

JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类

JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Object是什么呢?我们可以翻阅JAVA API文档看他的介绍 上面介绍说,object是类层次结构的根类,也就是超类 Object:是所有对象的直接后者间继承关系,传说中的老祖宗,你父亲还有父亲,你父亲的父亲还有父亲是爷爷,这是继承关系,但是你的祖宗却只有一位,该类中定义的肯定是所有对象都具备的功能

谈谈Java中protected访问权限

来谈谈protected访问权限问题.看下面示例1: Test.java class MyObject {} public class Test { public static void main(String[] args) { MyObject obj = new MyObject(); obj.clone(); // Compile error. } } 此时出现上文提到的错误:The method clone from the type Object is not visiuable.

第6章 访问权限控制

引言:访问权限(或隐藏具体实现)与"最初的实现并不恰当"有关. 先了解两个概念: 封装(encapsulation),即隐藏对象的属性和实现细节,仅对外公开接口. 重构(Refactoring),就是通过调整程序代码改善软件的质量.性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性. 程序员分为两类,类库的消费者和类库的开发者,类库的消费者希望类库出现新版本的时候,他们并不需要改写他们的代码,而类库的开发者则必须有权限对类库进行修改和改进,而不影响客户端程序员. 这就要求

PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)_php技巧

本文实例讲述了PHP面向对象的特性.分享给大家供大家参考,具体如下: Demo1.php <?php header('Content-Type:text/html; charset=utf-8;'); //创建一个电脑类 class Computer { //什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外. //public 是对字段的公有化,这个字段类外即可访问,赋值和取值 public $_name = '联想'; } $computer = new Computer();

Java中成员方法与成员变量访问权限详解_java

记得在一次面试的笔试题中,有的面试官会要求写出具体的像pullic这些访问限定符的作用域.其实,平常我都没去系统的考虑这些访问限定符的作用域,特别是包内包外的情况,OK,笔试不行了.  这是java基本的知识,也是公司看重的,那没办法啦,我的脑袋记不住东西,那我只能把这些东西写下来方便自己温故知新,不废话了,贴代码了. 代码如下: package com.jaovo; /** *_1_ 成员变量访问权限的求证 * public private protected default(默认的权限) *

举例详解Java中的访问权限修饰符_java

访问权限符:(1)public: 对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中. 对于类来说:    也是一样.(2)friendly: 对于成员老说:如果一个类的成员没有任何权限修饰,那么它门就是缺省包访问权限,用friendly来表示,注 意friendly不是Java中的关键字,这里是个人喜欢的方式用它表示而已.同一个包内其它类可以访问,但包外 就不可以.对于同一个文件夹下的.没有用package的classes,Java会自动将这些classes初见为隶属于该