一.abstract 抽象的
1.方法
被abstract所修饰的方法 被称为抽象方法
a)语法: abstract放置在方法的返回值类型之前 并且与访问权限修饰符顺序无要求
抽象方法没有方法的实现部分 连{}都没有
public abstract double area();
public abstract double girth();
2.类
站在语法的角度:被 abstract所修饰的类被称为抽象类
站在使用的角度:只能被声明 不能被实例化的类 被称为抽象类
a)语法: abstract放置在class关键字之前 并且与访问权限修饰符顺序无要求
abstract class 类名{
}
b)特点:
1)抽象类可以被声明
2)无法通过new的形式实例化对象
3)抽象类有构造方法 是在创建其子类时来使用
4)抽象类必须有子类才有意义
5)如果一个抽象类的子类 没有实现其所有的抽象方法 那么这个子类也是个抽象类
6)抽象类中 可以有非抽象方法
e)好处: 强制多态
思考:
1)有一个类中有抽象方法 那这个类一定是抽象类吗?
一定是
2)一个类中没有抽象方法 这个类一定不是抽象类?
不一定 抽象类中不一定有抽象方法
二.static 静态的
静态属性+静态方法 统称为 静态成员
1.属性:static 所修饰的属性被称为静态属性 也叫类变量
类变量:一个类所拥有的变量 是类级别的 该类创建出的所有对象共有 有一个对象改变了类变量 那么所有对象使用类变量时均会受到影响
a)语法: 放置在属性类型之前 并且与访问权限修饰符顺序无要求
class MyClass{
int a;
static int b;
}
b)调用语法:
1)通过对象.类变量
2)类名.类变量 推荐
2.方法:static 所修饰的方法被称为静态方法
a)语法:放置在返回值类型之前 并且与访问权限修饰符顺序无要求
public static void m1(){
System.out.println("这是静态方法m1");
}
b)调用语法:
1)通过对象.方法名()
2)类名.方法名()推荐
c)静态方法的特点:
静态方法内部可以用什么:
1)静态方法内部只允许使用静态成员
2)静态方法内部 不可以使用this与super关键字
静态方法关于重载和覆盖的语法:
1)静态方法可以被重载 符合方法重载的所有语法要求
2)静态方法可以被继承 也可以被覆盖 但是只能被static所修饰的方法覆盖
3)静态方法 不存在多态的情况 父类引用指向子类对象 子类中覆盖了父类中的静态方法,父类引用调用该方法时 依然是父类中未被覆盖的方法
3.初始化代码块
a)语法:
{
功能性代码:打印输出 属性的赋值语句 声明定义局部变量 调用方法
}
b)定义位置:类以内 方法以外
c)作用:按照定义的先后顺序 在创建对象的初始化阶段 执行代码块中的代码 一般用来给属性赋值
4.静态初始化代码块
被static修饰的代码块 被称为静态代码块
a)语法:
static {
功能性代码:打印输出 静态的赋值语句 声明定义局部变量 调用静态方法
}
注意:静态初始化代码块中 不可以使用非静态成员
b)定义位置:类以内 方法以外
c)作用:按照定义的先后顺序 在类加载时的初始化阶段 执行代码块中的代码 一般用来给静态属赋值 类加载只进行一次
5.类加载
a)类加载:JVM在第一次使用某个类时 会通过CLASSPATH所配的路径 将该类所对应的.class文件中类的相关信息(属性/方法/静态成员/父类信息...)读取到JVM的内存中,并保存起来。
b)类加载的过程: 加载----链接(验证+准备+解析)-----初始化----使用----卸载
加载:将.class中的信息读取到内存
验证:验证该.class是否是合法的.class文件 验证相应的访问权限修饰符
准备:给类变量分配空间 给类变量赋默认值 重要
解析:引用替换
初始化:给类变量进行初始化 执行初始化代码或执行静态初始化代码块中的代码 重要
使用:在内存中使用类信息
卸载:将保存的类信息回收
c)类加载(进行到初始化阶段的)触发的时机: 重点
1)第一次创建对象时
2)第一次通过类名.静态属性/方法()的形式 调用静态成员时
3)子类类加载时 其父类如果没有被加载 则也会进行类加载
4)
备注:一般 称类加载的时机 就是进行到初始化阶段性的几种情况 因为类加载触发到初始化阶段之前的情况过于复杂 所以不讨论
类加载做的两件事:给类变量进行空间分配赋默认值 给类变量进行初始化
6.当一个类的对象第一次被创建时 需要掌握
1.类加载:
a)给父类 子类的类变量分配空间赋默认值
b)初始化父类的类变量
c)初始化子类的类变量
2.对象的构建过程:
a)给父类 子类的所有属性分配空间赋默认值
b)递归构建父类对象(重复c~d操作)
c)属性初始化
d)执行构造方法中的内容
三.final 最终的
1.变量 final修饰的变量 被称为常量
final所修饰的变量只能被赋值一次
a)局部变量
修饰八种基本数据类型的变量:值不可变
修饰引用类型的时候:地址不可变
b)成员变量
修饰八种基本数据类型的变量:值不可变
修饰引用类型的时候:地址不可变
注意:
a)final修饰得的成员变量 没有默认值 必须保证在创建对象完成之前给其赋值(初始化阶段/构造方法)
c)类变量
修饰八种基本数据类型的变量:值不可变
修饰引用类型的时候:地址不可变
注意:
b)final修饰得的类变量 没有默认值 必须保证类变量在类加载结束前被赋值(类加载初始化阶段)
d)如果两个变量都是final所修饰的 则二者进行运算时 a+b的结果会尽可能地转换成类型c 从而编译不会出错
但当a+b的范围大于类型c时 编译出错
final 类型a a = 10;
final 类型b b = 20;
类型c c = a+b;
2.方法 final修饰的方法 被称为最终方法
final修饰的方法 可以被重载且与final无关
可以被继承 但不可以被覆盖
3.类 final修饰的类 被称为最终类 也叫做断子绝孙类
final修饰的类 所修饰的类不可以被继承
四.小结
1.final static abstract均不可以修饰构造方法
2.一些修饰符不可联用:
abstract 与 private
abstract 与 static
abstract 与 final
3.导入静态资源 JDK1.5之后的新语法
import static 包名.类名.*;倒入该类所有的静态成员
import static 包名.类名.方法名/属性名;倒入该类指定的静态成员
当导入了静态成员时 该静态成员被使用时可以直接通过名字使用 不用加类名.
package classes;
import classes2.ClassA;
import static classes2.ClassA.m1;
public class TestStatic4{
public static void main(String[] args){
m1();
System.out.println(ClassA.b);
}
}