首页 专题 文章 代码 归档
Java 面向对象-作用域问题
2020.02.28 14:06 2020.02.28 14:06

1. Java作用域

在此前的章节中,我们不止一次的使用到了public private protected等等修饰符;

这是修饰符代表了不同的权限;

2. public

public修饰的类(class)、接口(interface),可以被其他任何包下的任何类访问!

Student.java

public class Student {
    public void hello() {
        System.out.println("Hello Public!");
    }
}

Main.java,可以访问Student中的hello方法,因为public修饰了Student类和hello方法

public class Main {
    public static void main(String[] args) {
        Student s = new Student();
        s.hello();

    }
}

当然,上面说了:"因为public修饰了Student类和hello方法",所以要想访问某个类中的某个方法,除了该类是public修饰外,还需要该方法被public修饰。

也即是说,你要访问某个方法,首先你得有权限访问该方法所在的类!

3. private

被定义成private的字段或者方法无法被外界访问,不管该类是否被public修饰;

package test07;

public class Student {
    private int age;//无法被外界访问

    private void test() {
        System.out.println("该方法也无法被外界访问!");
    }
}

值得一说的是,Java有内部静态类,内部静态类可以访问该类的private方法

package test07;

public class Student {
    private int age;//无法被外界访问

    private static int id = 1;
    static class h {
        public void print() {
            System.out.println(Student.id);
            // 同样通过"类名.属性(方法)名"来访问!
            // 该静态类可以访问父类的id字段
        }
    }
}

如上,该静态类(h)可以访问父类(Student)的id字段,但是请注意:静态类智能访问静态方法或属性,所以对于父类的非静态属性、方法,依然是无法访问的!

4. protected

protected主要作用于继承关系,被protected修饰的字段、方法子类可以访问;

5. package

最后,包作用域是指一个类允许访问同一个包的没有public、protected、private修饰的class,以及没有public、protected、private修饰的字段和方法。

class Dog {
    void shout() {
        System.out.println("狗吠....");
    }
}

Main.java

package test07;

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.shout();

    }
}

但请注意:包名必须完全一致,包没有父子关系,com.misiai和com.misiai.child是不同的包。

6. 局部变量

局部变量根据定义形式的不同,又可以分为如下三种:

1、形参:在定义方法签名时定义的变量,形参的作用域在整个方法中都有效

2、方法局部变量:在方法体内定义的局部变量,它的作用域是从定义该变量的地方生效,到该方法结束时失效

3、代码块局部变量:这个局部变量的作用域从定义该变量的地方生效,到该代码结束时失效。

一个变量只在一对{}中起作用。

java允许局部变量和成员变量同名,如果方法中局部变量和成员变量同名,局部变量就会覆盖成员变量;

如果需要在这个方法中引用被覆盖成员变量,则可使用this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。

7. final

Java还提供了一个final修饰符。final与访问权限不冲突,它有很多作用。

1、用final修饰class可以阻止被继承:

package test01;

// 无法被继承:
public final class Hello {
    private int n = 0;
    protected void hi(int t) {
        long i = t;
    }
}

2、用final修饰method可以阻止被子类覆写:

package test01;

public class Hello {
    // 无法被覆写:
    protected final void hi() {
    }
}

3、用final修饰field可以阻止被重新赋值:

package test01;

public class Hello {
    private final int n = 0;
    protected void hi() {
        this.n = 1; // error!
    }
}

4、用final修饰局部变量可以阻止被重新赋值:

package test01;

public class Hello {
    protected void hi(final int t) {
        t = 1; // error!
    }
}

5、final+static修饰的变量是常量:

public static final int COUNT = 1;
本节阅读完毕! (分享
二维码图片 扫描关注我们哟