final关键字
最终修饰符,可以修饰类/方法/变量
修饰类,类不能被继承
修饰方法,方法不能被重写
修饰变量,变量只能被赋值一次,表示常量
final修饰引用类型变量,变量的地址不能改变,属性值可以更改
final Person p = new Person();
p = new Person();//报错,地址值改变
p.name = "张三";
p.name = "李四";//属性值可以改变
final修饰成员变量,不能使用默认值,必须在创建对象之前赋值
public class Person{
final int a = 10;//直接显示赋值
final int b;
public Person(){//构造方法赋值,所有的构造方法必须赋值
b = 10;
}
public Person(参数){
b = 20;
}
}
接口
概念:接口就是功能的集合,接口中都是抽象方法;
接口的定义格式:
public interface 接口名{
抽象方法;
}
接口的使用:
1.接口不能直接创建对象
2.定义实现类实现接口
3.重写接口中所有的抽象方法
4.创建实现类的对象,调用重写的方法
接口的成员特点:
1.接口中没有构造方法
2.接口中的成员变量都是常量 ,public static final修饰(默认修饰符)
3.接口中的成员方法都是抽象方法,被Public abstract修饰(默认修饰符)
接口的特点:
1.类可以实现接口,既可以单实现,也可以多实现
2.类可以在继承一个类的同时,实现多个接口
3.接口与接口时继承关系,既可以单继承,也可以多继承
接口与抽象类的区别:
成员变量: 抽象类中成员变量可以是变量/常量
接口中的成员变量只能是常量
构造方法: 接口中没有构造方法
抽象类中有构造方法,供子类使用
成员方法:接口中的成员方法都是抽象的(jdk1.8之后,增加了默认方法,和静态方法)
抽象类中成员方法既可以是抽象的,也可以是具体的,
理念上的不同:类描述是一类事物的共性内容
接口描述的是体系外的额外功能
JDK8之后的方法:
public interface 接口名{
//默认方法,子类可以重写,可以不重写;但是当实现多个接口时,需要重写,不然会报错;
public default 返回值类型 方法名(){}
//静态方法 接口名.方法名();
public static 返回值类型 方法名(){}
} 多态
概念:一类事物在不同时刻的多种形态,Java作为面向对象语言描述了这种形态;
最终体现为:父类引用指向子类对象;
多态的格式,必须有继承或是实现关系才可以使用多态
具体类:
具体父类 对象名 = new 子类();
抽象类:
抽象类 对象名 = new 继承类();
接口:
接口 对象名 = new 实现类();
多态后访问成员的特点:
成员变量:
编译时,先找父类中的成员变量,如果有编译通过,否则报错
运行时,直接打印这个成员变量的值
成员方法:
编译时,先找父类中的成员方法,如果有编译通过,否则报错
运行时,运行的是子类重写后的方法,如果子类没有重写,运行父类中的方法
多态后,一般表现都是父类表现,只有方法运行的是重写后的方法;
Public class Fu{
int a = 1;
public void method(){
System.out.println("父类中的方法");
}
}
Public class Zi extends Fu{
int a = 2;
public void method(){
System.out.println("子类中的方法");
}
}
Fu fz = new Zi();
System.out.println(fz.a);//1
System.out.println(fz.method()),//子类中的方法
向上转型(自动类型提升)
int a = 10;
double d = a;
//多态就是向上转型;
Zi zi = new Zi();
Fu fz = zi;
向下转型(强制类型转换)
double d = 10.1;
int i = (int)d;
//多态后不能访问子类特有的功能
//需要向下转型,才可访问
Fu fz = new Zi();
Zi zi = (Zi)fz;
boolean 变量名 = 对象 instanceof 类型
判断某个对象,是否属于某个类型,如果属于,返回true,不属于返回false