接口jdk8的新特性:
1、接口中可以定义普通方法
default void test() {
System.out.println("test");
}
static void test2() {
System.out.println("test2");
}
2、default修饰的方法要由实现类调用
static 修饰的方法可以由接口名直接调用
接口不能创建对象
3、实现类的接口和父类定义了同名方法,访问父类方法
4、如果两个接口中都定义了同名方法,会出现编译错误,子类必须重写同名方法
接口和抽象类的区别:
抽象类 接口
模板类 不同类型的公共行为
不能多继承 可以多继承
有构造方法 没有构造方法
变量是普通的变量 都是共有静态变量
普通方法 普通方法由 default或者static修饰
抽象方法没有默认访问修饰符 访问 修饰符是public
内部类
1、类体内部类
可以访问外部类的成员
不可以定义静态成员,但是可以定义静态常量
内部类定义对象,调用内部方法:外部类.内部类 名称=外部类.new 内部类
class Inner{
final static int b =0;
int a;
void test3(){
x = 0;
y = 9;
System.out.println("test3");
}
}
可以访问外部静态成员
可以定义静态和非静态成员
static class Inner{
int a=0;
static int b = 9;
void f(){
y = 9;
System.out.println(y);
}
}
2、方法内的内部类
void f(){
int a = 9;
//可以访问外部类的成员
//不能定义静态成员,但是可以定义静态常量
//方法内的变量被内部类访问后,变量别表示为常量
class Inner{
int b=0; //jdk1.7之后默认常量
final static int c = 0;
void f(){
int r = a+0;
x = 0;
y = 9;
System.out.println("!!!!!");
}
}
new Inner().f();
}
3、匿名类
//创建子类的对象
Object obj = new Object(){
@Override
public String toString() {
return "Hello";
}
};
//接口的实现类
IDemo demo = new IDemo(){
@Override
public void f() {
System.out.println("接口方法的实现");
}
};
//方法的参数使用匿名类实现
public void test(IDemo demo){
demo.f();
}
public static void main(String[] args) {
Demo4 demo4 = new Demo4();
demo4.test(new IDemo(){
@Override
public void f() {
System.out.println("接口方法的实现");
}
});
}
匿名类练习:
public interface IA {
void ma();
}
class MyClass {
public static void method(IA ia) {
System.out.println("in method");
ia.ma();
}
}
public class TestInnerClass {
public static void main(String[] args) {
MyClass.method(new IA(){
public void ma() {
System.out.println("ma in anonymous inner class");
}
});
class MyMaClass implements IA{
public void ma() {
System.out.println("ma in local inner class");
}
}
MyClass.method(new MyMaClass());
}
}