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

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类加载时,运行静态块,在创建对象之前
static的演示
package oo.day04;
//static的演示
public class StaticDemo {

	public static void main(String[] args) {
		Loo o1=new Loo();
		o1.show();
		Loo o2=new Loo();
		o2.show();
		System.out.println(Loo.b);//建议通过类名来访问
		System.out.println(o1.b);//不建议通过引用来访问
		
		Moo.test();//静态方法通过类名.来访问
		
		
		Noo o3=new Noo();
		Noo o4= new Noo();
	}

}


class Noo{
	static {
		System.out.println("静态块");
	}
	public Noo() {
		System.out.println("构造方法");
	}
}
class Moo{
	int a;
	static int b;
	void show() {
		a=1;
		b=2;
	}
	static void test() {//没有隐式的this
		//a=1;//没有this 意味着没有对象,而a必须通过对象来访问,所以此处不能访问
		b=2;
	}
}
class Loo{
	int a;
	static int b;
	Loo(){
		a++;
		b++;
	}
	void show() {
		System.out.println("a="+a);
		System.out.println("b="+b);
	}
}

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;//静态变量
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值