-
2015-05-31 16:11:33
一直以来,我一直认为接口是不可以创建对象的,随着学习的不断深入发现这是片面或错误的。接口存在的意义就是支持java的多态机制。java规定接口interface不能直接使用new关键字来创建对象,但并没有限定它不能创建对象。学习了匿名内部类后,可以发现,接口使用匿名方式创建对象也是可以的。
例如:
File driec = new File("G:/file/test"); File[] files = driec.listFiles(new FilenameFilter() { //FilenameFilter是接口,创建其匿名对象 @Override public boolean accept(File dir, String name) { return new File(dir,name).isFile() && name.endsWith(".java"); } });
如有错误,欢迎指正。
更多相关内容 -
接口可以创建对象、实例化吗?
2021-01-05 17:31:27文章目录一、interface的基础知识1. 接口使用interface来定义2.... 接口中不可以定义构造器 意味着接口不能实例化5. Java开发中,接口通过让类去实现implement的方式去使用6. java类可以实现多个接一、interface的基础知识
1. 接口使用interface来定义
2. Java中 接口和类是并列的两个结构
3. JDK7以前:只能定义全局变量和抽象方法:①全局常量:public static final的。 ②抽象方法: public abstract 的。 JDK8及以后: 除了定义全局变量和抽象方法以外,还可以定义静态方法、默认方法
4. 接口中不可以定义构造器 意味着接口不能实例化
5. Java开发中,接口通过让类去实现implement的方式去使用
如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以去实例化 如果实现类没有覆盖接口中的所有抽象方法,则此实现类仍为一个抽象类
6. java类可以实现多个接口----->弥补了java单继承的局限性
class AA extends BB implements CC,DD,EE
7. 接口与接口之间可以继承,而且可以多继承
二、接口不能实例化,为什么还会看到new interface?
举例一
FileFilter fileFilter = new FileFilter() { public boolean accept(File pathname) { String tmp = pathname.getName().toLowerCase(); if (tmp.endsWith("." + "vb")) { return true; } return false; } };
解释:FileFilter是一个接口。但这里面用到了匿名内部类。FileFilter() {。。。}一大段实现了(implements)接口,而实现接口的类为匿名类,然后再用new创建匿名类的对象。
举例二
interface A { public void f(); } public class Test { A a = new A() {public void f() {return;}}; }
解释:A a的时候只是声明a为A类型,而new A() {public void f() {return;}};的时候实际上产生了一个匿名类(如果你查看一下编译后的结果,会发现有一个Test$1.class的文件,这个就是匿名类,后面的数字是自动编号的),而a所指的具体对象就是Test$1这个类型的对象。
可以将上面的代码改写成普通的实现接口的方式
interface A { public void f(); } class NiMingB implements A{ public void f() {return;} } public class Test{ NiMingB niming = new NiMingB(); }
总结:接口无法直接创建对象,但是实现了接口的类可以创建对象,我们实现了某一个接口,就相当于创建了这个接口的一个子类,接口就是这个类的父类,而父类引用 是可以指向之类对象的。所以我们不是创建的不是接口对象,而是实现了该接口的类的对象,也就是接口的子类对象。
-
Java采用接口方式创建类的对象
2020-11-27 17:47:15采用接口方式创建类的对象 与用类创建类的对象的方式相似,只是将第一个类名改为接口名。 若有 类student 接口Person 类student实现Person 即class student implements Person 则用类创建类的对象为 student s1=...采用接口方式创建类的对象
与用类创建类的对象的方式相似,只是将第一个类名改为接口名。
若有- 类student
- 接口Person
- 类student实现Person 即class student implements Person
则用类创建类的对象为
- student s1=new student();
用接口方式创建为
- Person p1=new student();
注: 用接口方式创建的类的对象,只能用对象名.方法名 访问接口中定义的方法,不能访问类中自己定义的属性和方法以及接口中的属性。
详见下面代码:
代码示例:
interface face01 { double pi=3.14; abstract void getArea(); //对face01接口定义两个抽象方法 abstract void getLength(); } class Circle implements face01 { double radius; Circle(double r) //用构造方法对半径赋值 { radius = r; } public void getArea() { System.out.println("圆的面积为:" + radius * radius * pi); } public void getLength() { System.out.println("周长为:" + 2 * pi * radius); } } public class CSDN { public static void main(String[] args) { System.out.println("--采用普通方式创建类的对象--"); Circle c1=new Circle(5.5); c1.getArea(); c1.getLength(); System.out.println("--采用接口方式创建类的对象--"); face01 c2=new Circle(7.6); c2.getArea(); c2.getLength(); } }
结果:
--采用普通方式创建类的对象-- 圆的面积为:94.985 周长为:34.54 --采用接口方式创建类的对象-- 圆的面积为:181.3664 周长为:47.728 Process finished with exit code 0
注:
- 在该题中,若使用c2.radius对半径进行赋值,则会报错,不能运行。
- 也不能用c2.pi对pi的值进行更改,因为接口中属性默认为公共的静态最终变量(即public static final)。
-
抽象类可以创建对象吗?
2019-06-26 21:55:34这种情况搞不懂,创建对象成功了,是只要把抽象方法给具现化了就能创建吗? ``` abstract class Driver { public abstract void drive(); } public class Test { public static void main(String[] args) ... -
创建实现Java的接口类的对象
2019-02-01 12:39:32public interface Jiekou { ...//实现接口的class public class Jiekouimple implements jiekou{ public void s(); } public class Test( public static void main(String[] args) { ...public interface Jiekou {
public void s();
}
//实现接口的class
public class Jiekouimple implements jiekou{
public void s();
}
public class Test(
public static void main(String[] args) {
Jiekou jiekou = new Jiekouimple ();
}
)接口是不能实例化的,即不能new一个接口出来,但是可以创建一个接口实现类的对象;
必须要重写接口中的方法
Jiekou jiekou = new Jiekou() { @Override public void s() { } };
接口的使用规范:
1.接口中可以定义常量,不能定义变量,如果你在接口中定义属性,那么通过反编译可以看见他会自动用public static final 修饰,接口中的属性都是全局静态常量,接口中的常量必须在定义时指定初始值。
2.接口中所有的方法都是抽象方法,接口中方法都会自动用public abstract 修饰,即接口中只有全局抽象方法。
如:
public interface UserDao { String var = "常量1"; Integer t = 23; User getById(Long id); }
反编译后的:
package com.slef.dao;
import com.slef.model.User;
public abstract interface UserDao
{
public static final String var = "常量1";
public static final Integer t = Integer.valueOf(23);public abstract User getById(Long paramLong);
} -
接口不能用new创建对象,为什么接口数组可以用new创建对象,请教啊
2017-03-14 07:50:45 CharSequence是一个接口 -
java接口的实现类如何创建对象
2016-12-26 12:59:29接口的实现类创建对象时,都要用多态吗?还是有什么其他的情况?因情而异? -
抽象类和接口作为形式参数 多态 抽象类和接口虽然都不能直接创建对象,但是可以通过多态进行对象的创建
2017-07-15 00:25:23/* 抽象类和接口作为形式参数: ... //抽象类和接口虽然都不能直接创建对象,但是可以通过多态进行对象的创建... */ //************抽象类作为形式参数*********** abstract class Person { publi -
通过接口抽象类“创建”对象
2018-08-21 21:36:24首先声明,用接口或者抽象类实例化一个对象是不可能的,错误的。 接口、抽象类实现注意点 Interface 属性默认都是 public static final 方法默认都是 public abstract 都不用显示声明 抽象类 至少含有一个... -
JAVA创建接口(抽象类)的匿名实现类对象
2020-09-28 19:54:09JAVA可以使用如下方法来创建基于接口的匿名实现类对象 new<接口名>(){ //重写方法 }; package hello2; /** * 创建匿名的接口实现类对象:临时创建了一个没有命名的接口实现类 * 代码简约化 * */ ... -
接口--实例化接口对象的三种方式
2019-12-26 17:45:12当我们创建了一个接口的时候,我们是无法像创建类对象一样,直接实例化接口对象的。所以在这里,我来分享三种方式来实例化接口对象。 //这里会提示'Student' is abstract; cannot be instantiated,也就是说接口是... -
Java对象创建过程
2022-03-28 17:54:13java对象创建过程、对象的组成、对象头、实例数据、对齐填充、对象创建方式、new关键字、Class类的newInstance方法、Constructor类的newInstance方法、Object类的clone方法、反序列化、无父类的对象创建、有父类的... -
java为什么要用接口声明对象而具体类创建对象?
2017-09-13 21:55:34一 首先接口不能实例化对象这是毋庸置疑的 !!!! 原因:1.实际语义是实例化一个实现该接口的匿名内部类,接口本身是用来抽象的,实例化接口没有意义。 2.实例化实际意义是在jvm的堆中开辟出一块内存空间,比如... -
抽象类能否创建对象
2020-07-16 20:06:40抽象类和接口都能创建对象,只是后边的new不能是new他们自己,但可以new他们的实现类(必须是类,不能是抽象类和接口), 人们使用抽象类和接口只是为了说明要干什么事,而让他们的实现类去根据自己的需要去实现这些... -
创建对象的5种方式
2021-03-20 20:44:40这是我们最常见的创建对象的方式,通过这种方式我们还可以调用任意的构造器(无参的和有参的)。 public class Main { public static void main(String[] args) { Person person1 = new Person(); Person pe -
抽象类为什么不能创建对象?
2020-07-10 17:24:06在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。 抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当... -
Java中4种创建对象的方法
2022-04-23 18:20:104种创建对象的方法: 使用 new 关键字调用对象的构造器; 使用 Java 反射的 newInstance() 方法; 使用 Object 类的 clone() ...Java 反射中有一个 newInstance() 方法,可以创建对象,步骤如下:获取要创建的类的 Cl -
java 根据泛型创建对象,实例化泛型对象
2020-02-17 00:53:20实例化泛型对象 在你发布的代码中,不可能创建一个泛型T,因为你不知道它是什么类型: public class Abc<T> { public T getInstanceOfT() { // There is no way to create an instance of T here // since... -
java接口与对象区别
2017-11-21 08:35:57深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为... -
工厂模式(创建对象的最佳方式)
2021-07-14 10:01:02在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 工厂模式具体包括了简单工厂、工厂方法、抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计... -
java利用反射为接口实例化对象并调用
2018-12-28 17:26:37java利用反射为接口实例化对象并调用 package xxxxx; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import xxxxx.MyLibrary.MyCallback; import java.lang.reflect.InvocationHandler; ... -
C语言接口与实现:创建可重用软件的技术.pdf
2011-09-30 17:46:11与当前某些面向对象语言不同,c语言为创建可重用应用程 序接口(application programming interface,api)提供的语言和功能支持非常少。尽管大多 数c语言程序员在自己所编写的每一个应用程序中都使用api和实现api的库... -
不能创建对象的三种情况!!!
2019-05-21 21:26:58不能创建对象的三种情况 private修饰的私有对象 构造方法私有,不能创建对象 原因 : 因为子类要创建对象,... -
面向对象编程,你知道Java有哪些创建对象的方式吗?
2020-08-24 21:44:36Java有哪些创建对象的方式? 1、用new关键字创建对象,需要使用构造器。 2、使用反射机制创建对象,用Class类或Constructor类的newInstance()方法。 3、通过object类的clone方法 4、使用反序列化 -
Spring——Spring容器创建对象的特点
2021-03-08 12:08:001.Spring容器创建对象的特点 1.1 Spring是在什么时候创建的对象? 1.2 Spring容器创建对象,一次创建几个? 1.3 获取Spring容器中定义的对象数量、名称 1.4 Spring创建非自定义类对象、没有接口的类对象 1.... -
1、利用接口实现动态的创建对象[选做题] 1.1 创建4个类: 苹果 香蕉 葡萄 园丁 1.2 在三种水果的构造方法中...
2018-12-16 15:38:57package javademo9; import java.util.Scanner; interface Fruit{ } class Apple implements Fruit { public Apple() { ...创建了一个苹果对象"); } } class Pear implements Fruit { public Pea... -
Java多态和实现接口的类的对象赋值给接口引用的方法
2016-09-12 23:53:03我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。//定义接口InterA ... -
Java创建对象的四种方式
2016-05-09 16:47:56该类的对象可以被序列化。如果某类未实现 Serializable 接口,则该类对象不能实现序列化。 保存状态的目的就是为了在未来的某个时候再恢复保存的内容,这可以通过反序列化来实现。对象的反序列化过程与序列化... -
java——除了new,你还会用supplier创建对象吗?
2020-04-01 19:26:15官方给的接口 使用FunctionalInterface接口,只有一个get方法 @FunctionalInterface public interface Supplier<T> { /** * Gets a result. * * @return a result */ T get(); } 解析 如下列代码...