Java学习--三个修饰符
一、abstract
具备某种对象的特征,但不完整,例如animal就是一个抽象的概念,现实生活中没有生物叫做动物,所以animal不应该被创建成对象。
用abstract修饰的类,不能被new出对象,不能独立存在。
abstract class Animal{
String breed;
int age;
String sex;
public void eat(){
System.out.println("动物吃");
}
}
此类不能被new出来
1.抽象类的作用
-
可被子类继承,提供共性属性和方法。
-
可声明为引用,更加自然的使用多态。
-
抽象父类,可作为子类的组成部分,依附于子类对象存在,由父类共性+子类独有组成完整的子类对象。
2.抽象方法
父类提供的方法很难满足子类不同需求,如不定义,则表示所有动物都不会吃、睡。如定义,略显多余,多数会被子类覆盖。
也就是抽象方法的定义不具体实现功能,但在子类必须实现其特有的方法,且抽象方法必须在抽象类之中。
public abstract class Animal{
String breed;
int age;
String sex;
public abstract void eat();
}
子类中必须重写eat方法,或者子类也是抽象类,可以不重写eat方法。
二、static
1.静态属性
正常的对象的实例属性是单个对象所独有的,不会影响到其他对象。
用static修饰的属性是静态属性(类属性),它属性整个类共有的属性。
public class Student{
static int count;
}
在调用时要使用如下方式调用
Student.count;//通过具体的对象也可以访问,但不建议。
静态属性在内存中只有一份,且存在与方法区之中。
应用
可用来统计这个类的对象被创建多少次。
2.静态方法
之前用过的静态方法
Arrays.copyOf();
Arrays.sort();
即类名.静态方法名
静态方法特点
- 静态方法允许直接访问静态成员。
- 静态方法不能直接访问非静态成员。
- 静态方法中不允许使用this或是super关键字
- 静态方法可以继承,不能重写、没有多态。
3.静态代码块
class Myclss{
static String s="静态属性";
static{
System.out.println(s);
}
public static void method(){
}
类加载时,触发静态代码块的执行(仅一次),在静态属性初始化之后执行
作用:可谓静态属性赋值,过必要的初始行为。
类加载
JVM首次使用某个类时,需通过CLASSPATH查找该类的.class文件,从硬盘加载到内存中。
将.class文件中对类的描述信息加载到内存中,进行保存。
加载时机:
- 创建对象
- 创建子类对象(父类也被加载)
- 访问静态属性
- 调用静态方法
- 主动加载:Class.forName(“全限定名”);
三、final
1.概念
最后的,不可更改的
2.用法
final可修饰的内容为
- 类(最终类)不可被继承
- String、Math、System均为final修饰的类,不可被继承
- 方法(最终方法)不能被覆盖或重写
- 变量(最终变量)常量
final修饰类和方法
可以用来修饰你认为功能实现已经完善的方法,或者最低的类别(不可以在被继承的类),这样子类只可以使用被final修饰的方法,而不能重写。
final修饰变量
被修饰变量值不能被改变(常量),只能被赋值一次。
实例常量
就是给实例变量加上final修饰符,变成常量,被修饰的实例常量不在提供默认值,必须手动赋予初始值。
赋值的时机:显示初始化,构造方法。
注意:如果在构造方法中为实例常量赋值,必须保证所有的构造方法都能对其正确赋值。(也就是实例变量如果没赋默认值,就要在所有构造方法中为其赋予正确值。
静态常量
为静态变量增加final变成静态常量
赋值的时机:
可在初始化时赋值,也可在静态代码块赋值。
即被final修饰过的变量,必须想办法在本类赋值,要不没有默认值,且只能赋值一次。
对象常量
final int num=100;
final修饰基本类型时,值不可变
final Student s=new Student();
修饰引用类型时:地址不可以改变,里面的元素可改变,例如数组中的值,但数组对象不可改变。
总结
三个修饰符
abstact,final,static
abstract可放在定义类和方法前,被修饰的类可被继承,不能被new出对象来,抽象方法必须在抽象类中,且如果子类也是抽象类可以不用重写方法,如果子类不是抽象类,必须重写方法。
final修饰的类和方法,必须是最后一个,不可已被继承,不可以被重写,变量都变成了常量,只可以赋值一次,且必须赋值,赋值之后不可以更改,基本类型常量,值不能变,引用类型的,地址不可以改变。如果同时是静态的,可以在静态代码块赋值。
static就理解成类加载后一直在内存中存在,没有final修饰的情况下,如果不赋值是有默认值的。在其他类中可通过类名.方法名/变量名赋值或修改。