Java的三个修饰符:abstract static final

  • 10.1 abstract
  • 1.1 不该被创建的对象
  • 1.2 抽象类
  • 1.3 抽象类的作用
  • 1.4 不该被实现的方法
  • 1.5 抽象方法
  • 2 static
  • 2.1 静态属性
  • 2.2 静态方法
  • 2.3 静态代码块
  • 2.4 类的加载时机
  • 2.5 总结
  • 3 final
  • 3.1 什么是最终
  • 3.2 final类
  • 3.3 final变量
  • 3.4 实例常量
  • 3.5 静态常量
  • 3.6 对象常量


10.1 abstract

1.1 不该被创建的对象
  • 程序是用来模拟现实世界、解决现实问题的;
  • 现实世界中存在的都是“动物”具体的子类对象,并不存在“动物”对象,所以,Animal不应该被独立创建成对象。

如何限制这种对象的创建?

1.2 抽象类

应用:abstract修饰类,此类不能new对象。

  • 被abstract修饰的类,称为抽象类。
  • 抽象类意为不够完整的类、不够具体的类,
  • 抽象类对象无法独立存在,即不能new对象。
1.3 抽象类的作用
  • 作用:
  • 可被子类继承,提供共性属性和方法。
  • 可声明为引用,更自然的使用多态。
  • 经验:
  • 抽象父类,可作为子类的组成部分。
  • 依附于子类对象存在。
  • 由父类共性+子类独有组成完整的子类对象。
1.4 不该被实现的方法

需求:

  • Dog中的eat()应输出“狗在吃骨头”。
  • Cat中的eat()应输出“猫在吃鱼”。

方法声明必要,方法实现多余。

1.5 抽象方法
public class TestAnimal {
	public static void main(String[] args) {
		//Animal animal=new Animal();
		Animal dog=new Dog();
		Animal cat=new Cat();
		
		dog.eat();
		cat.eat();

	}
}

//动物类
abstract class Animal {
	
	String breed;//品种
	int age;//年龄
	String sex;//性别
	
	//吃(抽象方法)
	public abstract void eat();
	//睡
	public void sleep() {
		System.out.println("动物睡...");
	}
}

//狗狗类
class Dog extends Animal{
	@Override
	public void eat() {
		System.out.println("狗在吃骨头");
	}
}

//猫咪类
class Cat extends Animal{
	@Override
	public void eat() {
		System.out.println("猫在吃鱼");
	}
}

2 static

static:表示静态的

  • 可以修饰属性、方法、代码块、内部类
2.1 静态属性

修饰的属性:静态属性(类属性)

静态变量:通过类名.属性名调用

  • 1、在类的对象之间是共享的

应用场景:在多个对象之间共享变量的时候,应该使用静态变量

public class Student extends Person {	
	int a; 		 //实例变量
	static int b;//类变量
}
//1、创建Student类的对象
Student stu1 = new Student();
Student stu2 = new Student();
stu1.a = 10;
stu2.a = 20;

//实例变量在多个对象之间是独立的
System.out.println(stu1.a); //10
System.out.println(stu2.a); //20 

//静态变量在多个对象时间是共享的
stu1.b = 100;
stu2.b = 200;
System.out.println(stu1.b);//200
System.out.println(stu2.b);//200

//静态属性正确的调用方式:类名.属性名调用
Student.b = 300;
2.2 静态方法

static修饰方法:静态方法、类方法

静态方法:通过类名.方法名调用

  • 1、静态方法只能调用静态的属性和静态的方法
  • 2、静态方法中不能使用this和super关键字
  • 3、抽象方法不能使用static修饰
  • 4、静态方法不能被重写,但是可以被继承

应用场景:一般在编写的工具类中使用静态方法

public class Student extends Person {
	int a; 		 //实例变量
	static int b;//类变量	
	public void play1() {
		//访问静态变量
		System.out.println(b);
		//访问静态方法
		play2();
		System.out.println("实例方法");
	}	
	public static void play2() { 
		//访问实例变量a		
        //错误,原因:静态方法,类加载就已经存在,而实例变量要等到类被创建之后才存在
        //System.out.println(a); 
		//调用实例方法paly1();
		//play1();//错误,原因与实例变量一致
		//如果非要调用,那么必须要创建类的对象,通过对象去调用属性和方法
		Student stu = new Student();
		System.out.println(stu.a);
		stu.play1();		
		
		//在静态方法中不能使用this和super关键字
		//System.out.println(this.a);
		//this.play1();
			
		System.out.println("静态方法");
	}
}
2.3 静态代码块

修饰的代码块称之为静态代码块

  • 1、静态代码块在类加载的时候就执行
  • 2、优先于动态代码块
  • 3、只会被执行一次。
public class User {	
	//代码块   在对象被创建的时候自动调用,每次创建对象都会执行。优先于构造方法先执行
	{
		System.out.println("这是非静态代码块");
	}
	//静态代码块   在类被加载的时候自动调用,且只会被调用一次。优先于代码块先执行
	static {
		System.out.println("这是静态代码块");
	}	
	static int a = 10;
	//构造方法
	public User(){
		System.out.println("这是无参构造方法");
	}
}
2.4 类的加载时机

类加载的时机:

  • 1、创建对象
  • 2、创建子类对象
  • 3、调用静态属性和方法
  • 4、Class.forName(“类的全限定名”); 全限定名:包名+类名
2.5 总结

static内存分配

java中为三个属性赋值的方法 java三个修饰符_System

3 final

3.1 什么是最终

概念:最后的,不可更改的。

  • final可修饰的内容:
  • 类(最终类)
  • 方法(最终方法)
  • 变量(最终变量)
3.2 final类
  • final修饰类:此类不能被继承。
  • String、Math、System均为final修饰的类,不能被继承。
  • final修饰方法:此方法不能被覆盖。
  • 意为最终方法,不支持子类以覆盖的形式修改。
3.3 final变量

final修饰变量:此变量值不能被改变(常量)。

所有final修饰的变量只能赋值一次,值不允许改变。

3.4 实例常量
  • 实例常量不再提供默认值,必须手动赋予初始值。
  • 赋值时机:显示初始化、动态代码块、构造方法。
  • 注意:如果在构造方法中为实例常量赋值,必须保证所有的构造方法都能对其正确赋值。
3.5 静态常量
  • 静态常量不再提供默认值,必须手动赋予初始值。
  • 赋值时机:显示初始化、静态代码块。
3.6 对象常量
  • final修饰基本类型:值不可变
  • final修饰引用类型:地址不可变