java修饰符,抽象类
java修饰符
java中提供了很多的修饰符,主要分为以下两大类
- 访问修饰符
- 非访问修饰符
访问修饰符
修饰符就是用来修饰类,方法,变量的,根据修饰符的不同,被修饰的内容也会拥有不同的访问权限
public: 对所有类都可见,使用对象:类,接口,变量,方法
protected: 对同一包内的类和所有子类可见,使用对象:变量,方法。
default:(什么都不写)在同一包内可见,不使用任何修饰符。使用对象:类,接口,变量,方法。
private:在同一类内可见,使用对象变量,方法。
非访问修饰符
-
static修饰符,用来修饰方法变量
-
final修饰符,用来修饰类,方法,变量,final修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
static
静态变量:
static关键字用来声明独立于对象的静态变量,对于静态变量,无论它有多少个实例化对象,静态变量也只有一个,它属于类,而不属于任何单个的对象。可以通过类名.变量名直接调用。
静态方法:
静态方法是不在对象上执行的方法,而是通过类名直接调用,例如Math.pow(x,a);用来计算x的a次方的值,
一个比较容易混淆的问题?
静态方法能不能引用非静态资源?静态方法里能不能引用静态资源,非静态方法能不能引用静态资源?
public class Test(){
private String name = "张三"
public static void main(String[] args){
System.out.println(name);
}
}
静态资源是独立于类存在的,它在类的初始化的时候就加载了,而非静态资源是类new的时候加载的,类的初始化早于new。所以main方法先执行,此时还没有变量name,就会报错,所以上面的几个问题也就很明确了。
1.静态方法不能引用非静态资源,因为静态方法先加载。
2.静态方法能引用静态资源,因为是一起加载的。
3.非静态方法能够引用静态资源,因为,非静态方法后加载,此时静态资源已经被加载了。
静态代码块
静态代码块也是初始化一个类的时候做操作用的,静态块里面的代码只执行一次,且只在初始化类的时候执行,
public class Test{
private static int a = B();
static {
System.out.pritnln("静态代码块执行了");
}
public static void main(String[] args){
System.out.println("main方法执行了");
}
public statinc int B(){
System.out.pritnln("静态方法B执行了");
}
}
从上面的代码可以得出结论,静态资源的加载顺序是严格按照静态资源的定义顺序来加载的。
final关键字
final关键字一般用来修饰变量,方法,类,被final修饰后的变量一旦赋值后,就不能重新被赋值,如果成员变量是基本数据类型,初始化之后成员变量的值就不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向得呢个对象,不能再指向别的对象,但是对象中的内容可以允许改变。
可以看到基本变量使用final修饰了就不可以变了。
对于引用变量被final修饰了,引用变量引用不可变,但是引用对象的内容可以改变。
java抽象类
包含抽象方法的类就是抽象类,而抽象方法就是没有方法主体的方法,因为,重写的原因,父类的方法会被子类以不同的方式进行实现,此时父类的方法体就没有存在的意义了。没有方法体的方法就称为抽象方法。
使用abstract关键字来修饰方法和类,这样的方法和类就是抽象方法和抽象类。
抽象类定义:
修饰符 abstract class 类名{
}
只要一个类包含抽象方法,那么该类必须是抽象类,
抽象方法定义:
修饰符 abstract 返回值类型 方法名(参数列表);
public abstract void eat();
抽象方法的特点:
- 抽象类不能创建对象,所以抽象类必须被继承,才能被使用。
- 继承抽象类的子类必须重写父类所有的抽象方法,否则,该子类也必须声明为抽象类,
- 抽象类中,不一定包含抽象方法,但是包含抽象方法的类必定是抽象类。