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

简介: 本文主要讲的是static与后面这些概念结合在一起时static的用法,当然其他相关的内容也会涉及到。一、static和访问权限和继承关系结合想了解Java访问权限的内容可以去看这篇博客Java的权限修饰符的区别和用法总结 这三者结合时就是简单的把各自的使用方...

本文主要讲的是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用法和普通外部类一样。

目录
相关文章
|
5月前
10 # 类:继承和成员修饰符
10 # 类:继承和成员修饰符
28 0
|
9月前
|
安全 编译器 C++
[C++] 类与对象(中)类中六个默认成员函数(1)上
[C++] 类与对象(中)类中六个默认成员函数(1)上
|
5月前
|
Java
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
40 0
|
9月前
|
Java 程序员 C#
C++类成员的访问权限以及类的封装
C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。 Java、C# 程序员注意,C++ 中的 public、private、protected 只能修饰类的成员,不能修饰类,C++中的类没有共有私有之分。 在类的内部(定义类的代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。 在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 p
62 0
|
9月前
|
存储 编译器 C++
[C++] 类与对象(中)类中六个默认成员函数(1)下
[C++] 类与对象(中)类中六个默认成员函数(1)下
|
11月前
继承类的方法
继承类的方法
86 0
|
编译器 数据安全/隐私保护 C++
【六、继承】多继承、继承中的构造函数和析构函数、类成员访问控制
【六、继承】多继承、继承中的构造函数和析构函数、类成员访问控制
123 0
【六、继承】多继承、继承中的构造函数和析构函数、类成员访问控制
|
前端开发 开发者
class-子类访问父类上的实例方法|学习笔记
快速学习 class-子类访问父类上的实例方法
81 0
|
Java
Java中继承的实现及继承中变量、构造方法、成员方法的访问特点
继承的实现及继承中变量、构造方法、成员方法的访问特点的简单示例
92 0
Java中继承的实现及继承中变量、构造方法、成员方法的访问特点
|
设计模式 安全 Java
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
称为类 B 继承类 A 特点: B类的对象可以使用 A类的属性和方法 优点: 代码复用.重复相同的代码不用多次书写. 名词: 类A: 父类 基类 类B: 子类 派生类 2. 单继承和多层继承[理解] 单继承: 如果一个类只有一个父类,把这种继承关系称为单继承 多继承: 如果一个类有多个父类,把这种继承关系称为多继承 多层继承: C–> B --> A 3. 子类重写父类的同名方法[掌握] 重写: 子类定义和父类名字相同的方法. 为什么重写: 父类中的方法,不能满足子类对象的需求,所以
413 1
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型