java三大修饰符
java三大修饰符,即抽象(abstract)、静态(static)和最终的,不可变(final)
一、抽象、抽象类
抽象: java中用abstract关键字来修饰抽象事物,从字面上可以理解为抽象既是朦胧,似是而非,像又却不是;具备某种对象特征,但又不完整。用abstract修饰的类称为:抽象类,同样被abstract修饰的方法称为:抽象方法。
那到底什么是抽象类呢?例如在我们生活中可以把动物当成是一个抽象类,动物可以有很多种,但是具体是什么样的我们并不知道,如我们在街上看到一只狗,此刻在我们脑中的主观反应就是一只“狗”,并不会说成是一只动物。即动物这个概念是个宽泛并且抽象的。同样的动物的各种行为也是各不相同,那么在程序中就是抽象方法。
如何创建,使用抽象类?
1.使用abstract关键字修饰
abstract class Animal {
int age;//年龄
String sex;//性别
//吃(抽象方法)
public abstract void eat(); //抽象方法没有方法体
}
2.通过子类继承并实例化对象
class Dog extends Animal{
@Override
public void eat() { //重写抽象方法
System.out.println("狗在吃狗粮");
}
}
Animal animal = new Dog() //多态,
animal.eat(); //输出"狗吃狗粮"
3.使用抽象类的注意事项:
- 抽象类意为不够完整的类、不够具体的类,即不能实例化对象,必须通过子类来实现。
- 子类继承了一个抽象父类,那么必须重写父类中的所有抽象方法,除非子类也声明为抽象类。
- 抽象类中既可以有具体的实现方法(普通方法),也可以有没有具体的实现方法(抽象方法)
- 抽象方法是没有具体的实现,即在定义时没有方法体(没有{})
- 抽象方法不能使用private,final关键字修饰,否则产生冲突,即子类无法覆盖重写父类抽象方法。
二、static静态关键字
静态: 如果将一个类字段定义为static,那么每个类都只有一个这样的字段。而对于非静态的实例字段,每个对象都有自己的一个副本。即一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,所以凡是本类的对象都【共享】一份;
如何使用static静态关键字?
1.使用static修饰成员属性
public class MyStatic{
int a; //实例属性
static int b; //静态属性
}
public class TestStatic{
public static void main(String[] args){
MyStatic ms1 = new MyStatic();
ms1.a=10;
ms1.b = 100;
MyStatic ms2 = new MyStatic();
ms2.a =20;
ms2.b = 200;
System.out.println(ms1.a +"\t"+ms2.a);
//输出结果为10,20
System.out.println(ms1.b +"\t"+ms2.b);
//输出结果为200,200
}
}
即实例属性是每个对象各自持有的独立空间(多份),对象单方面修改,不会影响其他对象。而静态属性是整个类共同持有的共享空间(一份),任何对象修改,都会影响其它对象。
2.使用static修饰成员方法
public class MyStatic{
public void method1(){
method2(); //成员普通方法可以访问静态方法
System.out.println("成员普通方法");
}
public static void method2(){
// method1(); 静态方法不能访问非静态方法
System.out.println("静态方法");
}
}
public class TestStatic{
public static void main(String[] args){
// 静态方法可以不用创建对象,通过类名调用,而实例方法必须创建对象调用
//method()1
MyStatic.method2();
MyStatic ms1 = new MyStatic();
ms1.method1();
ms1.method2();//不推荐,使用对象名调用静态方法
}
}
3.使用static修饰属性,方法的注意事项
- 静态的总是优先于非静态的,静态是随着类的加载而被加载
- 静态方法不允许访问非静态方法,因为静态加载时机更快,静态方法中不允许使用this或是super关键字;静态方法可以继承,不能重写、没有多态。(“后人知道先人,先人却不知道后人”)
- 调用静态方法应使用类名的方式进行调用,虽然使用对象也可以,但是不推荐,容易造成混淆,因为静态跟实例对象并没有关系。
三、final关键字
final: 代表最终的,不可改变的。可以用来修饰类,变量,方法。
1.使用final修饰的类不可被继承,称之为“太监类”。
2.使用final修饰的方法不可被覆盖重写。
3.对于使用final修饰的成员变量来说,如果修饰的是基本数据类型,那么其值不可改变,且编译器不再提供默认值,必须手动赋值;且必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。
4.final如果修饰的是引用数据类型,那么指的是其地址值不可变;
final int[] a = {2,3,4,1};
System.out.println(a); //[I@22f71333
a[0] =8;
System.out.println(a); //[I@22f71333
//final修饰的引用数据类型,所谓的最终不可变指的是他们的地址值不变,还是可以改变其变量值的
5.final可以与静态static使用修饰常量,作为全局常量。