一、abstract关键字
1、 修饰:类 方法
抽象类:
抽象类不能实例化,他里面可以有抽象方法,也可以有普通的方法和全员属性
有抽象方法的一定是抽象类
抽象方法:
抽象没有方法体({}),小括号后带;,他是子类必须要实现重写的方法,除非子类也是抽象类
抽象方法,是一种约束,一种规范,规定了子类必须实现的方法及其参数
2、abstract关键字的使用总结
- abstract修饰类:不能new对象,但可以声明引用。
- abstract修饰方法:只能方法声明,没有方法实现。(需包含在抽象类中)
- 抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
- 子类继承抽象类后,必须重写父类中的所有的抽象方法,否则子类还是抽象类
3、抽象类和普通类的区别:
抽象类 | 普通类 | |
---|---|---|
关键字 | abstract关键字 | 不需要 |
构造方法 | 抽象类不能被实例化 | 普通类可以 |
成员方法 | 可以是抽象的,也可以是普通的 | 不能有抽象方法,只能是普通方法 |
成员变量 | 都有 | 都有 |
4.练习
public class Test {
public static void main(String[] args) {
//对于抽象类,不能创建对象
//Animal a = new Animal();
Dog d = new Dog();
//调用子类重写方法
d.run();
}
}
abstract class Animal {
//只有声明, 没有实现,那么就是抽象方法。
public abstract void run();
}
class Dog extends Animal {
//重写抽象方法
@Override
public void run() {
System.out.println("狗在跑");
}
}
二、static
静态的。属于类,不再属于对象。不必创建对象,可以自接通过类名访问
1、修饰:变量和方法
静态属性static
类级别的static属性,是所有的对象都共享的,即1个对象改变,所有的对象都会受到影响
-
1、static会作为对象之间的沟通
-
2、静态常量,方便我们快速使用
-
3、工具类,可以让我们方便快速的使用
注意,静态的属性方法,所消耗的资源较大,所以一般的变量或者方法不推荐使用
静态方法中:属于类
可以访问静态的属性和静态的方法(属于类的),但是不能直接访问非静态的属性和非静态的方法(属于对象的)。
非静态方法中:属于对象
全都行:静态的,非静态的都可以。this,super都可以。
类级别: 因为他是在类加载的时候就一起加载进去
所有类的对象都可以使用
对象级:是在对象初始化的时候,被初始化,才能使用
全员属性/实例变量/实例属性/全局变量
范围:本类可以使用
局部变量:先初始化,才能使用
代码块、if{}、for{}
静态的运行顺序:
父类的静态块==>子类静态块==>父类动态块/构造块==>父类的构造方法==>子类的动态块/构造块==>子类构造方法
2.总结
-
static修饰的成员为静态成员,无需创建对象,可直接通过类名访问
-
静态方法不能直接访问非静态成员
-
静态方法中不能使用this或super
-
静态方法可以继承、不能重写、没有多态
-
静态代码块在类加载时被执行,且只执行一次
三、final
“最终的,最后的”。
1、修饰:类、变量、方法
//final修饰变量:则为常量,只能赋值这一次。
赋值之后,数值不能再修改了。
final修饰引用类型是内存地址不可变,如数组,可以使用num[0]=1下标的方式进行值得改变,因为值存储的空间就是同一内存地址
注意:String 虽然是引用类型,但在这里是属于值不可变
注意:我们的常量命名都是大写英文,如果是多个单词组成的使用下划线分割如:final String STUDENT_NAME = "haha";
//final修饰方法:最终方法 该方法不能被子类重写,可以继承
//final修饰类:最终则类不能被继承
2.实例常量
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
class Student {
//实例常量不在通过默认值,必须手动赋予初始值
//赋值时机:显示初始化、动态代码块、构造方法
final String NAME;//="tom";
{
//name = "tom";
}
//构造方法中为实例常量,必须保证所有构造方法都能对其正确赋值
public Student() {
this.NAME = "tom";
}
public Student(String name) {
this.NAME = "tom";
}
}
四、总结
修饰符 | 修饰对象 | 语法规则 |
---|---|---|
final | 变量 | 变常量,数值不能再更改 |
final | 方法 | 该方法不能被子类重写 |
final | 类 | 该类不能被继承 |
static | 属性(成员变量) | 表示类的属性,属于类,应该由类来调用(类名.属性名) |
static | 方法 | 表示类的方法,属于类,应该由类来调用(类名.方法名()) |
static | 代码块 | 静态代码块,程序一加载的时候就执行,只执行1次 |
abstract | 方法 | 抽象方法:只有方法的声明,没有方法体{}也没有,;结束 |
abstract | 方法 | 构造方法,static方法,final方法不能是抽象的 |
abstract | 方法 | 抽象方法所在的类,也必须是抽象的 |
abstract | 类 | 如果该类中,有抽象方法,那么类必须也是抽象的,不能实例化 |
abstract | 类 | 子类来继承,并实现抽象方法 |
abstract | 类 | 如果子类没有全部实现所有的抽象方法,那么子类也是抽象的 |
五、类加载
1、JVM在首次使用某个类时,需通过CLASSPATH查找改了的.class文件
2.将.class文件中对类的描述信息加载到内存中,进行保存
3.加载时机:
- 创建对象
- 创建子类对象
- 访问静态属性
- 调用静态方法
- 主动加载:Class.forName(“全限定名”)