final修饰的基本数据类型 无法进行修改。
final修饰的引用类型的变量 只保证地址不变,对象中的内容可以发生改变
public class Test01 { //定义常量 final static int num = 10; final static Dog dog = new Dog("泰迪","棕黄色"); public static void main(String[] args) { fun(num ); //fun(dog); System.out.println("main"+dog); } public static void fun( ) { dog.setColor("黑色"); //dog = new Dog(); System.out.println("fun"+dog); } public static void fun( int num ) { num++; System.out.println(num); } } class Dog { private String type; private String color; public Dog() { } public Dog(String type, String color) { super(); this.type = type; this.color = color; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Dog [type=" + type + ", color=" + color + "]"; } }静态成员常量 不会导致类加载
静态成员常量的值在加载前无法确定,那么会导致类被加载
public class Test02 { final static int num = (int)(Math.random()*33); static { System.out.println("我是静态代码块"); } public static void main(String[] args) { System.out.println(Test02.num); } } public class Test03 { public static void main(String[] args) { System.out.println(Test02.num); } }F sf if fc
S1 ss1 is1 s1cS2 ss2 is2 s2c m方法main:new S2().m()m(){new S1();}tips:
先加载静态内容 -> 先执行静态代码块 由于父子关系 所以子类加载之前需要先加载父类
执行的父类的初始化块和欧构造器
准备执行子类的构造器 (先执行初始化块 子类构造器中有一个super)
父类的静态代码块子类的静态代码块父类的初始化块父类的构造器子类的初始化块子类的构造器 public class Test04 { public static void main(String[] args) { new S2().m(); } } class F{ static { System.out.println("F static"); } { System.out.println("F init"); } public F() { System.out.println("F construct"); } } class S1 extends F{ static { System.out.println("S1 static"); } { System.out.println("S1 init"); } public S1() { System.out.println("S1 construct"); } } class S2 extends F{ static { System.out.println("S2 static"); } { System.out.println("S2 init"); } public S2() { System.out.println("S2 construct"); } public void m() { new S1(); } }1: 父类中定义的方法不需要具体的实现步骤 子类都不按照父类的做
2: 父类中定义这个方法的目的是告诉子类 一定要保证存在该方法
对于类的要求:
1:父类中不需要定义方法的实现步骤2:子类必须要重写抽象类:包含了抽象方法的的类称之为抽象类。
被abstract修饰的类称之为抽象了
抽象方法:
只要方法的声明,没有方法体。 通过abstract修饰的方法称之为抽象方法避免子类的随意设计 提高了代码可读性 提高了子类的健壮性
1:抽象类中只能包含抽象方法吗?
既可以定义抽象方法也可以定义普通方法
2:是否可以定义构造器抽象类可以存在构造器但是无法实例化
抽象类中的构造器是给子类准备的
抽象类就是用来被继承的 抽象方法就是被重写的
3:子类继承了抽象了之后一定要重写所有的抽象方法 public class Test02 { public static void main(String[] args) { // 实例化抽象类 //Father f = new Father(); Son s = new Son(); } } abstract class Father{ public Father() { System.out.println("我是抽象类的构造器"); } public abstract void study(); //public abstract void work(); } class Son extends Father{ public Son() { } public void study() { } }将上下文中的一些不会变化的内容保留下来 在父类中实现
并且定义整个程序的执行流程
将核心的业务逻辑或者是算法逻辑延迟到子类中去实现。
是一个规范 是一套标准 比抽象了还抽象
修饰符 interface 接口名{}
接口中的变量都是公开的 静态的最终常量值 默认情况下变量都是public static final修饰 接口中可以定义静态方法(不建议1.8) 接口中定义的对象方法都是抽象方法 接口中的方法默认就是通过abstract修饰的 接口中的默认方法从1.8之后才开始被使用 允许在接口中定义default方法 而且存在方法体1、 类和接口直接通过implements 发生关系 类实现接口
2、类必须要实现接口中的所有抽象方法
3、一个类可以实现多个接口 类名 implements 接口1,接口2。。。。。
4、一个类实现了接口之后 要将当前接口以及接口的父接口中的所有抽象方法全部重写
5、接口可以多继承
6、接口无法实例化
7、接口没有构造器
8、接口中也可以使用多态
java.lang.NullPointerException 空指针异常 对象为null
ClassCastException 类型转换异常null可以强转为任意类型 null也可以是任意类型instanceof 检查一个对象是否属于某个特定类,也可以用instanceof检查一个对象是否实现了某个特定的接口,返回boolean类型的值。
if(!(obj instanceof User)) { return false; }器
8、接口中也可以使用多态
java.lang.NullPointerException 空指针异常 对象为null
ClassCastException 类型转换异常null可以强转为任意类型 null也可以是任意类型instanceof 检查一个对象是否属于某个特定类,也可以用instanceof检查一个对象是否实现了某个特定的接口,返回boolean类型的值。
if(!(obj instanceof User)) { return false; }