关于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用法和普通外部类一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值