java接口可以实例化吗?
2016-03-29 12:51
483 查看
java接口可以实例化吗?
比如:
List Set Map都是接口
使用时先实现
List<String> list = new ArrayList<>();
有点类似于指针的感觉了。Factory接口可以用来代表实现它的类。比如:
public interface thing;
public class fruit implements thing;
thing something = new fruit();
这个something指的就是水果。
接口编程是为了实现多继承。
、、、、、、、、、、、、、、、、
以下转自:http://www.runoob.com/java/java-polymorphism.html
声明一个接口的变量(接口的引用)可以指向一个实现类(实现该接口的类)的实例,
但是该接口的变量不能使用实现类中有、接口中没有的方法(实现类中没有重写的方法、自添加的方法),比如:
public class InterfaceCat {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
// a.eat(); // 调用的是 Cat 的 eat
// Cat c = (Cat)a; // 向下转型
// c.work(); // 调用的是 Cat 的 catchMouse
a.work(); //该处编译报错
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
// abstract void work(); // 抽象类(接口)中没有work方法
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
输出结果为:
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
对于多态,可以总结以下几点:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用);
四、变量不能被重写(覆盖),"重写"的概念只针对方法,如果在子类中"重写"了父类中的变量,那么在编译时会报错。
接口不可以实例化。但是接口对象可以指向它的实现类对象。
接口可以看做特殊的抽象类,只是所有的方法都是抽象方法(没有实现的方法),接口的方法都是默认public abstract的,
所以不能被实例化。
比如:
List Set Map都是接口
使用时先实现
List<String> list = new ArrayList<>();
有点类似于指针的感觉了。Factory接口可以用来代表实现它的类。比如:
public interface thing;
public class fruit implements thing;
thing something = new fruit();
这个something指的就是水果。
接口编程是为了实现多继承。
、、、、、、、、、、、、、、、、
以下转自:http://www.runoob.com/java/java-polymorphism.html
声明一个接口的变量(接口的引用)可以指向一个实现类(实现该接口的类)的实例,
但是该接口的变量不能使用实现类中有、接口中没有的方法(实现类中没有重写的方法、自添加的方法),比如:
public class InterfaceCat {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
// a.eat(); // 调用的是 Cat 的 eat
// Cat c = (Cat)a; // 向下转型
// c.work(); // 调用的是 Cat 的 catchMouse
a.work(); //该处编译报错
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
// abstract void work(); // 抽象类(接口)中没有work方法
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
输出结果为:
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
对于多态,可以总结以下几点:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用);
四、变量不能被重写(覆盖),"重写"的概念只针对方法,如果在子类中"重写"了父类中的变量,那么在编译时会报错。
相关文章推荐
- Java 变长參数Varargs
- [疯狂Java]UDP:MulticastSocket实现组播
- java基础知识总结10
- java 对象排序
- Struts1.x环境搭建(一)
- [Java 8] (5) 使用Lambda表达式进行设计
- Java发送Email
- spring mvc EL ModelAndView的 Model 值 在jsp中不显示
- java使用POI jar包读写xls文件
- clean后R.java不见了
- Java反编译插件 Jad和JD-Core
- java获取指定文件夹下的项目名称(.war格式)
- 排序算法--插入排序法
- Java Equals
- Java ArrayDeque实现Stack的功能
- JAVA学习【12】“==”、“equals”判断包装类是否相等
- java 应用的路径问题
- java.util.ArrayDeque类使用方法详解
- Spring MVC理解和主要使用的注解详解
- spring security 3.1中基于数据库自定义验证授权功能实现