目录
修饰符
四种权限修饰符
修饰符 | 当前类 | 同一包内(子类和无关类) | 不同包(子类) | 不同包(无关类) |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default(默认) | Y | Y | N | N |
private | Y | N | N | N |
public(公共权限)
可以修饰类,成员变量,成员方法,构造方法
被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符
可以修饰的成员:
1、public修饰类:
//public 修饰类
public class Test {
public static void main(String[] args) {
System.out.println("hello world");
}
}
2、public修饰成员变量:
public class Test {
//public 修饰变量
public String str = "hello world";
public static void main(String[] args) {
System.out.println("hello world");
}
}
3、public修饰方法:
public class Test {
//public 修饰方法
public void test(){
System.out.println("hello world");
}
public static void main(String[] args) {
Test t = new Test();
t.test();
}
}
4、public修饰构造方法:
public class Test {
//public 修饰构造方法
public Test(){
System.out.println("构造方法");
}
public static void main(String[] args) {
PublicTest t = new Test();
}
}
访问范围:
public修饰的成员在任意位置都可以访问
1、本类中访问:
/**public 修饰的成员在本类中可以正常访问*/
public class Test {
//public 修饰变量
public String str = "public 修饰的变量";
//public 修饰方法
public void test(){
System.out.println("public 修饰的方法");
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.str);
t.test();
}
}
2、同包中的类访问:
package demo;
public class Test {
//public 修饰变量
public String str = "public 修饰的变量";
//public 修饰方法
public void test(){
System.out.println("public 修饰的方法");
}
}
package demo;
/**public 修饰的成员在同包的类中可以正常访问*/
public class TestMain {
public static void main(String[] args) {
Test pt = new Test();
System.out.println(t.str);
t.test();
}
}
3、子类中访问:
package demo;
public class Test {
//public 修饰变量
public String str = "public 修饰的变量";
//public 修饰方法
public void test(){
System.out.println("public 修饰的方法");
}
}
package demo.demo01;
import demo.Test;
/**public 修饰的成员在子类中可以正常访问*/
public class TestSub extends Test {
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.str);
t.test();
}
}
4、其它类访问:
package demo;
public class Test {
//public 修饰变量
public String str = "public 修饰的变量";
//public 修饰方法
public void test(){
System.out.println("public 修饰的方法");
}
}
package demo.demo01;
import demo.Test;
/**public 修饰的成员在其它类中可以正常访问*/
public class TestOther {
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.str);
t.test();
}
}
protected(受保护权限)
可以修饰成员变量,成员方法,构造方法,不能修饰类(外部类,内部类不考虑)
被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。
如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。
可以修饰的成员:
protected 不能修饰类、代码块,可以修饰变量、方法、构造方法
1、protected 可以修饰变量:
public class Test {
//protected 修饰的变量
protected String str = "hello world";
public static void main(String[] args) {
System.out.println("hello world");
}
}
2、protected可以修饰方法:
public class Test {
//protected 修饰的方法
protected void test(){
System.out.println("hello world");
}
public static void main(String[] args) {
Test pt = new Test();
t.test();
}
}
3、protected可以修饰构造方法:
public class Test {
//protected 修饰的构造方法
protected Test(){
System.out.println("hello world");
}
public static void main(String[] args) {
Test t = new Test();
}
}
访问范围:
1、被protected修饰的成员,在本类中是可以正常访问的。
2、被protected修饰的成员,在同包的类中是可以正常访问的。
3、被protected修饰的成员,在子类中如果子类与父类同包,则子类对象和父类对象都可以正常访问,如果子类与父类不同包,则子类对象可以正常访问,父类对象不可以访问。
4、被protected修饰的成员,在其他类中是不可以访问的。
1、本类中访问:
public class Test {
//protected 修饰的变量
protected String str = "hello world";
//protected 修饰的方法
protected void test(){
System.out.println("hello world");
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.str);
t.test();
}
}
2、同包中的类访问:
package demo;
public class Test{
//protected 修饰的变量
protected String str = "hello world";
//protected 修饰的方法
protected void test(){
System.out.println("hello world");
}
}
package demo;
/**protected 修饰的成员在同包的类中可以正常访问*/
public class TestMain {
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.str);
t.test();
}
}
3、子类中访问:
package demo;
public class Test{
//protected 修饰的变量
protected String str = "hello world";
//protected 修饰的方法
protected void test(){
System.out.println("hello world");
}
}
package demo.demo01;
import demo.Test;
public class TestSub extends Test {
public static void main(String[] args) {
Test t = new Test();
//System.out.println(t.str);//访问不到
//t.test();//访问不到
TestSub tb = new TestSub();
System.out.println(tb.str);//可以访问
tb.test();//可以访问
}
}
4、其他类中访问:
package demo;
public class Test{
//protected 修饰的变量
protected String str = "hello world";
//protected 修饰的方法
protected void test(){
System.out.println("hello world");
}
}
package demo.demo01;
import demo.Test;
public class TestSub extends Test {
}
package demo.demo01;
import demo.Test;
public class TestOther {
public static void main(String[] args) {
Test t = new Test();
//System.out.println(t.str);//访问不到
//t.test();//访问不到
TestSub ts = new TestSub();
//System.out.println(ts.str);//访问不到
//ts.test();//访问不到
}
}
default(默认权限,即,不写)
类,成员变量,成员方法,构造方法都能使用默认权限,即不写任何关键字
默认权限即同包权限,同包权限的元素只能在定义它们的类中使用,以及同包的类中被调用
可以修饰的成员:
可以修饰任何成员
1、可以修饰类:
//default修饰的类
class DefaultTest {
public static void main(String[] args) {
System.out.println("hello world");
}
}
2、可以修饰变量:
package mjl2020051802;
class DefaultTest {
//default修饰的变量
String str = "hello world";
public static void main(String[] args) {
System.out.println("hello world");
}
}
3、可以修饰方法:
class DefaultTest {
//default修饰的方法
void test(){
System.out.println("hello world");
}
public static void main(String[] args) {
DefaultTest dt = new DefaultTest();
dt.test();
}
}
4、可以修饰构造方法:
class DefaultTest {
//default修饰的构造方法
DefaultTest(){
System.out.println("hello world");
}
public static void main(String[] args) {
DefaultTest dt = new DefaultTest();
}
}
访问范围:
1、被default修饰的成员,在本类中是可以正常访问的
2、被default修饰的成员,在同包的类中是可以正常访问的
3、被default修饰的成员,在子类中如果子类与父类同包,则子类对象和父类对象都可以访问,如果子类与父类不同包,则子类对象和父类对象都不可以访问
4、被default修饰的成员,在其它类中不可以被访问
注:被default修饰的类,在同包中可以引入,在非同包中不可以引入
1、本类中访问:
class DefaultTest {
//default修饰的变量
String str = "hello world";
//default修饰的方法
void test(){
System.out.println("hello world");
}
public static void main(String[] args) {
DefaultTest dt = new DefaultTest();
System.out.println(dt.str);
dt.test();
}
}
2、同包的类中访问:
package demo;
class DefaultTest {
//default修饰的变量
String str = "hello world";
//default修饰的方法
void test(){
System.out.println("hello world");
}
}
package demo;
public class TestMain {
public static void main(String[] args) {
DefaultTest dt = new DefaultTest();
System.out.println(dt.str);
dt.test();
}
}
3、子类中访问:
package demo;
class DefaultTest {
//default修饰的变量
String str = "hello world";
//default修饰的方法
void test(){
System.out.println("hello world");
}
}
package demo;
public class DefaultTestSub extends DefaultTest {
public static void main(String[] args) {
DefaultTest dt = new DefaultTest();
System.out.println(dt.str);
dt.test();
DefaultTestSub dts = new DefaultTestSub();
System.out.println(dts.str);
dts.test();
}
}
4、其它类中访问:
package demo;
public class DefaultTest {
//default修饰的变量
String str = "hello world";
//default修饰的方法
void test(){
System.out.println("hello world");
}
}
package demo.demo01;
import demo.DefaultTest;
public class DefaultTestOther {
public static void main(String[] args) {
DefaultTest dt = new DefaultTest();
//System.out.println(dt.str); //不可以访问
//dt.test();//不可以访问
}
}
private(私有权限)
可以修饰成员变量,构造方法,成员方法,不能修饰类(外部类,内部类不考虑)
被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。
可以修饰的成员:
private不可以修饰类和代码块,可以修饰变量,方法和构造方法(与protected一致)
1、可以修饰变量:
public class PrivateTest {
//private 修饰的变量
private String str = "hello world";
public static void main(String[] args) {
System.out.println("hello world");
}
}
2、可以修饰方法:
public class PrivateTest {
//private 修饰的方法
private void test(){
System.out.println("hello world");
}
public static void main(String[] args) {
PrivateTest pt = new PrivateTest();
pt.test();
}
}
3、可以修饰构造方法:
public class PrivateTest {
//private 修饰的构造方法
private PrivateTest(){
System.out.println("hello world");
}
public static void main(String[] args) {
PrivateTest pt = new PrivateTest();
}
}
访问范围:
1、被private修饰的成员,在本类中可以正常访问
2、被private修饰的成员,在同包的类中是不可以访问的
3、被private修饰的成员,在子类中是不可以访问的
4、被private修饰的成员,在其他类中是不可以访问的
1、本类中访问
public class PrivateTest {
//private 修饰的变量
private String str = "hello world";
//private 修饰的方法
private void test(){
System.out.println("hello world");
}
public static void main(String[] args) {
PrivateTest pt = new PrivateTest();
System.out.println(pt.str);
pt.test();
}
}
2、同包的类访问:
package demo;
public class PrivateTest {
//private 修饰的变量
private String str = "hello world";
//private 修饰的方法
private void test(){
System.out.println("hello world");
}
}
package demo;
public class TestMain {
public static void main(String[] args) {
PrivateTest pt = new PrivateTest();
//System.out.println(pt.str);//不可以访问
//pt.test();//不可以访问
}
}
3、子类中访问:
package demo;
public class PrivateTest {
//private 修饰的变量
private String str = "hello world";
//private 修饰的方法
private void test(){
System.out.println("hello world");
}
}
package demo.demo01;
import demo.PrivateTest;
public class PrivateTestSub extends PrivateTest {
public static void main(String[] args) {
PrivateTest pt = new PrivateTest();
//System.out.println(pt.str);//不可以访问
//pt.test();//不可以访问
}
}
4、其它类访问:
package demo;
public class PrivateTest {
//private 修饰的变量
private String str = "hello world";
//private 修饰的方法
private void test(){
System.out.println("hello world");
}
}
package demo.demo01;
import demo.PrivateTest;
public class PrivateTestOther {
public static void main(String[] args) {
PrivateTest pt = new PrivateTest();
// System.out.println(pt.str);//不可以访问
// pt.test();//不可以访问
}
}
状态修饰符
static修饰符:
静态变量:
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
1、static关键字可以修饰类(static不能修饰普通类,只能修饰内部类):
public class StaticTest {
public static class InnerClass{
InnerClass(){
System.out.println("=====我是静态内部类======");
}
}
public static void main(String[] args) {
InnerClass ic = new StaticTest.InnerClass();
}
}
2、static关键字可以修饰方法(static关键字修饰的方法可以通过类名直接调用):
public class StaticTest {
public static void test(){
System.out.println("=====我是静态方法=====");
}
public static void main(String[] args) {
StaticTest.test();
}
}
3、static关键字可以修饰变量(static关键字修饰的变量可以通过类名直接调用):
public class StaticTest {
public static String name = "mjl";
public static void main(String[] args) {
System.out.println("=====我是静态变量 "+StaticTest.name+" ======");
}
}
4、static关键字可以修饰代码块:
public class StaticTest {
static {
System.out.println("=====我是静态代码块======");
}
public static void main(String[] args) {
StaticTest st = new StaticTest();
}
}
final修饰符:
final 变量:
final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。
final 修饰符通常和 static 修饰符一起使用来创建类常量。
1、final关键字可以修饰变量(被final修饰的变量的值不可以更改):
public class FinalTest {
final double PI = 3.1415926;
public static void main(String[] args) {
FinalTest ft = new FinalTest();
System.out.println(ft.PI);
}
}
final 方法
父类中的 final 方法可以被子类继承,但是不能被子类重写。
声明 final 方法的主要目的是防止该方法的内容被修改。
如下所示,使用 final 修饰符声明方法。
2、final关键字可以修饰方法(被final修饰的方法不可以被重写):
public class FinalTest {
public final void test(){
System.out.println("====我是一个final修饰的方法=====");
}
public static void main(String[] args) {
FinalTest ft = new FinalTest();
ft.test();
}
}
final 类
final 类不能被继承,没有类能够继承 final 类的任何特性。
3、final关键可以修饰类(被final修饰的类不可以被继承):
public final class FinalTest {
public static void main(String[] args) {
System.out.println("====我是一个final修饰的类=====");
}
}
抽象修饰符
abstract修饰符:
抽象类:
不能修饰构造方法,不能修饰成员变量,可以修饰类,成员方法
被修饰的类不能被实例化,只能被继承,被修饰的成员方法在子类中必须被重写
抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
抽象类可以包含抽象方法和非抽象方法。
abstract class Caravan{
private double price;
private String model;
private String year;
public abstract void goFast(); //抽象方法
public abstract void changeColor();
}
抽象方法
抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
抽象方法不能被声明成 final 和 static。
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
抽象方法的声明以分号结尾,例如:public abstract sample();。
public abstract class SuperClass{
abstract void m(); //抽象方法
}
class SubClass extends SuperClass{
//实现抽象方法
void m(){
.........
}
}