复习:访问修饰符
方法的重写
继承关系
方法名,参数列表,返回类型(子类要小于等于父类)相同
访问修饰符的大小需要:子类大于等于父类(子类>=父类)
异常(非运行时异常):子类<=父类
作用:扩展父类方法的功能
继承构造方法的调用
子类创建对象,默认调用父类的无参构造方法
如果父类没定义无参的构造方法,那么子类使用super调用父类的构造方法
多态:对象的多态
父类声明=子类的创建
编译时多态–重载
运行时多态–重写
应用:
对象的造型:父子类之间的强制转换!使用:instanceof
—————————————————————————————————
static
static使用: 类名.static的成员
static修饰变量:成员变量:类变量(是所有对象共享的)和实例变量(对象私有的)
—————————————————————————————————
static修饰方法:静态方法只能直接访问静态成员!静态成员在加载时已经初始化了
类方法调用静态方法需要使用新建对象调用静态方法
—————————————————————————————————
static块:
父类静态块—子类静态块—父类构造块—父类构造方法—子类构造块—子类构造方法
—————————————————————————————————
final:
变量:常量——常量值不能改变???
方法:不能被重写
类:不能被继承不能有子类
final int[] NIM = {1,2,3};
abstract
抽象方法:由abstract修饰的方法
特点:没有方法体
抽象类:由abstract修饰的类
特点:
1、不能创建对象
2、抽象类中可以没有抽象方法
3、抽象类由子类创建对象,但是需要将父类的所有的抽象方法都实现,
4、没有实现所有的抽象方法,需要把当前类声明为抽象类
interface
记录了不同的对象有相同的特点
定义接口:interface 接口名{}
变量:int x = 10; public static final 修饰的
方法:jdk1.8之前,抽象方法,可以省略abstract,默认的访问修饰符
public void f();
}
使用接口:实现接口的类,要实现接口中的所有方法,才可以创建对象
如果不实现接口中的所有方法,当前类必须为abstract的类
接口和接口之间是继承关系:
interface A{}
interface B extends A{}
interface C{}
类和接口之间是实现,可以实现多个接口,用逗号隔开即可
接口jdk8新特性:
1接口中可以定义普通方法
default void test(){
System.out.println("test");
}
static void test2(){
System.out.println("test2");
}
2default修饰的方法由实现类调用
static修饰的方法可以由接口名直接调用,接口不能创建对象
3.实现类的接口和父类定义的方法同名,如何访问?
答:调用父类的方法
4如果两个接口中都定义了同名方法,则怎样?
答:子类必须重写同名方法
5.函数式接口
接口中只有一个抽象方法
接口和抽象类的区别:
抽象类 | 接口 |
---|---|
模板类 | 不同类型的公共的行为(规范JDBC) |
不能多继承的 | 可以多继承 |
有构造方法 | 没有构造方法 |
变量是普通变量 | 都是公有静态常量 |
都是普通方法 | 普通方法由default或者static修饰 |
抽象方法没有默认访问修饰符 | 访问修饰符是public |
——————————————————————————————
内部类:
类体内部类:
非静态内部类:可以访问外部类的成员
不可以定义静态成员,都是可以定义静态常量
内部类创建对象,调用内部方法:外部类.内部类 名称 =外部类.new 内部类
静态内部类:可以访问外部静态成员
可以定义静态和非静态成员
创建对象:外部类.内部类 名称=new 外部类.内部类
方法内的内部类:
可以访问外部类成员
不能经验静态成员,但可以定义静态常量
方法内的变量在被内部类访问后,变量表示为常量!
匿名类
前面是接口的话,则需要接口方法的实现
匿名类可以创建对象,可以创建子类的对象
父类声明,子类创建的时候,需要看父类有没有这个调用的方法
静态方法不能直接访问实例成员,需要访问调用,需要先创建实例对象
package cn_tedu_demo;
interface Calculator{
int calc(int a,int b);
}
public class Demo01Calculator {
public static void main(String[] args) {
//调用invokeCalc方法。方法的参数使用匿名内部类实现
invokeCalc(1,1,new Calculator(){
@Override
public int calc(int a, int b) {
return a+b;
}
});
//lambda表达式
invokeCalc(1,2,(a,b)->a+b);
}
public static void invokeCalc(int a,int b,Calculator c){
int sum = c.calc(a,b);
System.out.println(sum);
}
}