用于个人知识梳理
**抽象类:**抽象方法可以实例化,可以拥有抽象方法,也可以没有,可以有静态方法,也可以有非静态方法,和非抽象类唯一区别是如果在当前类实例化,需要借助匿名内部类,这个匿名内部类是他的子类等同于接口的实现类.只能单继承
代码演示
``public abstract class AbstractDemo {
private String name;
{//如果这个类被实例化时,会执行这个代码
System.out.println("------------------");
}
static {//如果这个类的方法被调用时,会执行这里的代码
System.out.println(“这个类用来给自己梳理知识!”);
}
public static void main(String[] args) {
//抽象类可以实例化,就是得重写里面的抽象方法
AbstractDemo a= new AbstractDemo() {
@Override
public void drink() {
// TODO Auto-generated method stub
System.out.println("喝水");
}
@Override
public void die() {
// TODO Auto-generated method stub
System.out.println("啪,你死了");
}
};
/*编译错误
AbstractDemo b= new AbstractDemo();
*/
a.check();
a.drink();
a.die();
}
public abstract void drink();//抽象类中的抽象方法
public abstract void die();
public void check() {//抽象类里的非静态方法
System.out.println(this.name+“让我康康你发育正不正常”);
}
public static void address() {//抽象类中的静态方法
System.out.println(“他住在下北泽”);
}
/*
*默认方法仅用于接口,编译错误
default void check() {
}*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
对比
public abstract class AD2 {
private String name;
{//如果这个类被实例化时,会执行这个代码
System.out.println("------------------");
}
static {//如果这个类的方法被调用时,会执行这里的代码
System.out.println(“这个类用来给自己梳理知识!”);
}
public static void main(String[] args) {
//抽象类可以实例化,就是得重写里面的抽象方法
AD2 a= new AD2() {
};
a.check();
}
public void check() {//抽象类里的非静态方法
System.out.println(this.name+“让我康康你发育正不正常”);
}
public static void address() {//抽象类中的静态方法
System.out.println(“他住在下北泽”);
}
/*
*默认方法仅用于接口,编译错误
default void check() {
}*/
}
接口:
接口中可以多继承,然后实现类需要实现所有抽象方法,接口中所有成员变量都是静态变量,接口中只能有静态方法,抽象方法,默认方法,静态方法通过类名来调用,默认方法要通过接口的实现对象去调.虽然在接口中可以通过匿名内部类直接创建接口的实现对象.
代码演示
``public interface Pork {
int S_A =17;
int S_D = 3;
public static void main(String[] args) {
Pork p = new Pork() {
@Override
public void playPork() {
// TODO Auto-generated method stub
System.out.println("快乐斗地主");
}
};
p.square(“卢本伟”);
Pork.miao();
Pork.standUp();
}
void playPork();//抽象方法
static void miao() {//静态方法
System.out.println(“大家都是十七张牌,你还能秒我”);
}
default void square(String name) {//默认方法
System.out.println(“从现在开始起这里叫”+name+“广场!”);
}
static void standUp() {
System.out.println(“全体起立!所有人给我站起来!”);
}
}
编译不报错,用eclipse运行时可以选择运行两个类,运行子类,子类没有main方法,当然不行,但父类就没有问题
错误: 在类 test.Pork$1 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application
;
实现类中当然没有问题,lambda表达式应用于函数式接口,就是里面只有一个抽象方法的接口,简略代码.
总结,抽象类作为具体事物的特性抽象总结,接口而作为功能的抽象,都放在面向对象的特性中,在我现在看来,确实是体现了他能提高代码复用率的特点,更多的地方现在的我还体会不出来,如果以后的学习能让我有新的感悟,我还会继续补充.