21Java面向对象-----访问控制修饰符、static关键字、final关键字

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44787898/article/details/102759441

1.访问控制修饰符

数据私有化,行为公开化

  • public:公开的,任何类
  • private:私有的,本类
  • protected:受保护的,本类、子类、同包类
  • 默认的:什么也不写,本类、同包类
  • 类的访问修饰:public和默认的
  • 类成员的访问修饰:如以上四种都可以
    在这里插入图片描述

2.static

2.1静态变量

  • 由static修饰
  • 用static修饰的成员变量不属于对象的数据结构,属于类的,存在方法区,只有一份
  • 常常通过类名.来访问
  • 何时用:所有对象的数据都一样时使用
class Cat {
   private int age;
   private static int numOfCats;
   public Cat(int age){
      this.age = age;
      System.out.println(++numOfCats);
   }
}
Cat c1 = new Cat(2);
Cat c2 = new Cat(3);

在这里插入图片描述

2.2静态方法

  • 通常的方法都会涉及到对具体对象的操作,这些方法在调用时,需要隐式的传递对象的引用(this)
int d = p1.distance(p2);
//调用distance方法时,除了传递p2参数外,还隐式的传递了p1作为参数,在方法中的this关键字即表示该参数
  • static修饰的方法则不需要针对某些对象进行操作,其运行结果仅仅与输入参数有关,调用时直接用类名引用
double c = Math.sqrt(3.0 * 3.0 + 4.0 * 4.0);
//该方法在调用时,没有隐式的传递对象引用,因此在static方法中不可以使用this关键字
  • 没有this就意味着没有对象,而实例变量必须通过对象.来访问,所以静态方法中不能直接访问实例成员
  • 由于static在调用时没有具体的对象,因此在static方法中不能对非static成员(对向成员)进行访问。static方法的作用在于提供一些“工具方法”和“工厂方法”等。

2.3静态块

  • 由static修饰
  • 属于类的,类被加载期间自动执行,类只被加载一次,所以静态块也只执行一次
  • 何时用:常常用于加载/初始化静态资源(图片、音频、视频)
class Foo{
   static{
     //类加载期间,只执行一次
     System.out.println("Load Foo.class");
   }
   public Foo{
     System.out.println("Foo()");
   }
}
Foo foo = new Foo();
//输出的结果为:
//Load Foo.class
//Foo()
//Foo类加载时,运行静态块,在创建对象之前

3.final

  • 修饰变量------变量不能被改变
  • 修饰方法---------方法不能被重写
  • 修饰类------------类不能被继承
package oo.day04;
//final演示
public class FinalDemo {
	public static void main(String[] args) {
	}
}
class Zoo{}
final class Xoo extends Zoo{} //可以继承别的类
//class Yoo extends Xoo{}//错误,final修饰类不能被继承

class Loo{  //final修饰方法---不可被重写
	void show(){}
	final void say(){}
}
class Moo extends Loo{
	void show(){}
	//void say(){} //错误,final方法不能被重写
}

class Koo{  //final修饰变量---不能改变,用得比较少
	final int a = 5; //声明同时初始化
	final int b;   
	Koo(){
		b = 5;   //先声明,再在构造中初始化
	}
	void show(){
		final int c;  //应用率几乎为零
		//System.out.println(c);//错误,c没有值
		c = 5;
		System.out.println(c);
	}
  void say(){
  	//a = 88; //错误,final修饰的变量不能改变
  }
}

  • static final 修饰的成员变量被称为常量,必须声明同时初始化。不可被改变
  • static final 常量会在编译期被替换
class Foo{
   public static final int NUM = 100;
}
class Goo{
   public static void main(String[] args){
      System.out.println(Foo.NUM);
      //代码编译时,会替换为:System.out.println(100);
   }
}

补充

成员变量

1.实例变量:
1)属于对象,存在堆中
2)有几个对象就有几个实例变量
3)必须通过对象名.来访问
2.静态变量
1)属于类的,存在方法区中
2)只有一份
3)常常通过类名.来访问

class Aoo{
    int a;//实例变量
    static int b;//静态变量
}

猜你喜欢

转载自blog.csdn.net/qq_44787898/article/details/102759441