导航:首页 > 编程语言 > java接口中定义属性

java接口中定义属性

发布时间:2024-09-16 14:06:11

『壹』 如何在java类中定义接口属性并如何使用接口的方法

摘要
一, 接口基础知识

1, java语言不支持一个类有多个直接的父类(多继承),但可以实现(implements)多个接口,间接的实现了多继承.
2, 与接口相关的设计模式:
1, 定制服务模式
设计精粒度的接口,每个接口代表相关的一组服务,通过继承来创建复合接口
2, 适配器模式
当每个系统之间接口不匹配时,用适配器来转换接口
3, 默认适配器模式
为接口提供简单的默认实现
4, 代理模式
为接口的实现类创建代理类,使用者通过代理来获得实现类的服务
5, 标识类型模式
用接口来标识一种没有任何行为的抽象类型
6, 常量接口模式
在接口中定义静态常量,在其它类中通过import static语句引入这些常量
3, 接口的特征归纳:
1, 接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)
2, 接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化
public interface A
{
int CONST = 1; //合法,CONST默认为public,static,final类型
void method(); //合法,method()默认为public,abstract类型
public abstract void method2(); //method2()显示声明为public,abstract类型
}
3, 接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法
public interface A
{
int var; //错,var是常量,必须显示初始化
void method(){...}; //错,接口中只能包含抽象方法
protected void method2(); //错,接口中的方法必须是public类型
static void method3(){...}; //错,接口中不能包含静态方法
}
4, 接口中没有构造方法,不能被实例化
public interface A
{
public A(){...}; //错,接口中不能包含构造方法
void method();
}
5, 一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
public interface A
{
void methodA();
}
public interface B
{
void methodB();
}
public interface C extends A, B //C称为复合接口
{
void methodC();
}
public interface C implements A{...} //错
6, 接口必须通过类来实现它的抽象方法
public class A implements B{...}
7, 当类实现了某个接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象的
8, 不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例
public class B implements A{}
A a = new B(); //引用变量a被定义为A接口类型,引用了B实例
A a = new A(); //错误,接口不允许实例化
9, 一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.
public class A extends B implements C, D{...} //B为class,C,D为interface
4, 通过接口,可以方便地对已经存在的系统进行自下而上的抽象,对于任意两个类,不管它们是否属于同一个父类,只有它
们存在相同的功能,就能从中抽象出一个接口类型.对于已经存在的继承树,可以方便的从类中抽象出新的接口,但从类
中抽象出新的抽象类却不那么容易,因此接口更有利于软件系统的维护与重构.对于两个系统,通过接口交互比通过抽象
类交互能获得更好的松耦合.
5, 接口是构建松耦合软件系统的重要法宝,由于接口用于描述系统对外提供的所有服务,因此接口中的成员变量和方法都
必须是public类型的,确保外部使用者能访问它们,接口仅仅描述系统能做什么,但不指明如何去做,所有接口中的方法
都是抽象方法,接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量.二, 比较抽象类与接口
1, 抽象类与接口都位于继承树的上层
相同点
1, 代表系统的抽象层,当一个系统使用一颗继承树上的类时,应该尽量把引用变量声明为继承树的上层抽象类型,
这样可以提高两个系统之间的送耦合
2, 都不能被实例化
3, 都包含抽象方法,这些抽象方法用于描述系统能提供哪些服务,但不提供具体的实现
不同点:
1, 在抽象类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,这是抽象类的优势,但这一优势
限制了多继承,而接口中只能包含抽象方法.
由于在抽象类中允许加入具体方法,因此扩展抽象类的功能,即向抽象类中添加具体方法,不会对它的子类造
成影响,而对于接口,一旦接口被公布,就必须非常稳定,因为随意在接口中添加抽象方法,会影响到所有的实
现类,这些实现类要么实现新增的抽象方法,要么声明为抽象类
2, 一个类只能继承一个直接的父类,这个父类可能是抽象类,但一个类可以实现多个接口,这是接口的优势,但这
一优势是以不允许为任何方法提供实现作为代价的三, 为什么Java语言不允许多重继承呢?
当子类覆盖父类的实例方法或隐藏父类的成员变量及静态方法时,Java虚拟机采用不同的绑定规则,假如还允许
一个类有多个直接的父类,那么会使绑定规则更加复杂,因此,为了简化系统结构设计和动态绑定机制,Java语言
禁止多重继承.
而接口中只有抽象方法,没有实例变量和静态方法,只有接口的实现类才会实现接口的抽象方法(接口中的抽象方
法是通过类来实现的),因此,一个类即使有多个接口,也不会增加Java虚拟机进行动态绑定的复杂度.因为Java虚
拟机永远不会把方法与接口绑定,而只会把方法与它的实现类绑定.四, 使用接口和抽象类的总体原则:
1, 用接口作为系统与外界交互的窗口
站在外界使用者(另一个系统)的角度,接口向使用者承诺系统能提供哪些服务,站在系统本身的角度,接口制定
系统必须实现哪些服务,接口是系统中最高层次的抽象类型.通过接口交互可以提高两个系统之间的送耦合
系统A通过系统B进行交互,是指系统A访问系统B时,
把引用变量声明为系统B中的接口类型,该引用变量引用系统B中接口的实现类的实例.
public interface B
{
}
public class C implements B
{
}
public class A
{
}
B a = new C();
2, 接口本身必须非常稳定,接口一旦制定,就不允许随遇更加,否则对外面使用者及系统本身造成影响
3, 用抽象类来定制系统中的扩展点
抽象类来完成部分实现,还要一些功能通过它的子类来实现 2008/1/9
一, Java多态机制中的绑定规则深入剖析
class Base
{
String var = "BaseVar"; //实例变量
static String staticVar = "StaticBaseVar"; //静态变量 void method() //实例方法
{
System.out.println("Base method");
} static void staticMethod() //静态方法
{
System.out.println("Static Base method");
}
}public class Sub extends Base
{
String var = "SubVar"; //实例变量
static String staticVar = "StaticSubVar"; //静态变量

void method() //隐藏父类的method()方法
{
System.out.println("Sub method");
} static void staticMethod() //隐藏父类的staticMethod()方法
{
System.out.println("Static Sub method");
} String subVar = "Var only belonging to Sub"; void subMethod()
{
System.out.println("method only belonging to Sub");
} public static void main(String args[])
{
//引用变量who被声明为Base类型,引用Sub类的实例
Base who = new Sub();

//成员变量(静态变量,实例变量)与引用变量所声明的类型(Base类型)的成员变量绑定
System.out.println("who.var = "+who.var); //所以,打印Base类的var变量
System.out.println("who.staticVar = "+who.staticVar); //所以,打印Base类的staticVar变量 //实例方法与引用变量实际引用的对象(Sub对象)的方法绑定
who.method(); //所以,打印Sub实例的method()方法 //静态方法与引用变量所声明的类型(Base类型)的方法绑定
who.staticMethod(); //所以,打印Base类的staticMethod()方法
}
}

【分析过程】
1, 对于一个引用类型的变量,Java编译器按照它声明的类型来处理.
例如在以下代码中,编译器认为who是Base类型的引用变量,不存在subVar成员变量喝subMethod()方法,编译报错
Base who = new Sub(); //引用变量who被声明为Base类型,引用Sub类的实例
who.subVar = "123"; //编译错,在Base类中没有subVar属性
who.subMethod(); //编译错,在Base类中没有submethod()方法
如果要访问Sub类的成员,必须通过强制类型转换:
Base who = new Sub();
//把Base引用类型的who成员变量强制转换为Sub引用类型
//把引用变量转换为子类的类型称为向下转型,把引用变量转换为父类的类型称为向上转型
((Sub)who).subVar = "123";
((Sub)who).subMethod();
Java编译器允许在具有直接或间接继承关系的类之间进行类型转换,对于向上转型,Java编译器会自动进行,对于
向下转型,需要进行强制类型转换
如果两种类型之间没有继续关系,即不在继承树的同一个继承分支上,那么Java编译器不允许进行类型转换
2, 对于一个引用类型的变量,运行时Java虚拟机按照它实际引用的对象来处理
例如以下代码虽编译可通过,但运行时会抛出ClassCastException运行时异常
Base who = new Base(); //who引用Base类的实例
Sub s = (Sub)who; //运行时会抛出ClassCastException
在运行时,子类的对象可以转换为父类类型,而父类的对象实际上无法转换为子类类型
3, 在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
1, 实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机
动态决定的
2, 静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经
绑定
3, 成员变量(静态变量,实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为
实际上是在编译阶段就已经绑定

『贰』 JAVA中定义接口时可以包涵哪些成员

在接口类中,成员变量必须都是常量,也就是final修饰的。

接口中的方法默认都是public abstract 都是抽象的,比如 public abstract int(int a,int b);

因为,java中没有多重继承,只可以实现多个接口,而有很多的天然性,也就是static final这种类型数据,我们通过实现多个接口,就可以获得各种不同的天然属性。

(2)java接口中定义属性扩展阅读:

在Java语言规范中,一个方法的特征仅包括方法的名字、参数的数目和类型,而不包括方法的返回类型、参数名以及所抛出来的异常。在Java编译器检查方法的重载时,会根据这些条件判断两个方法是否是重载方法。但在Java编译器检查方法的置换时,则会进一步检查两个方法(分处超类型和子类型)的返还类型和抛出的异常是否相同。

『叁』 java的接口、类、属性、方法各有哪些修饰符

1、 接口的修饰符只有:public 2、 类的修饰符分为:可访问控制符和非访问控制符两种。 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract ;最终类修饰符 final 1、公共类修饰符public: Java 语言中类 的可访问控制符只有一个: public 即公共的。每个 Java 程序的主类都必须是 public 类作为公共工具供其它类和程序使用的应定义为 public 类。 2 、抽象类修饰符abstract:凡是用 abstract 修饰符修饰的类,被称为抽象类。所谓抽象类是指这种类没有具体对象的一种概念类。这样的类就是 Java 语言的 abstract 类。 3、最终类修饰符final:当一个类不可能有子类时可用修饰符 final 把它说明为最终类。被定义为 final 的类通常是一些有固定作用、用来完成某种标准功能的类。 4、类缺省访问控制符:如果一个类没有访问控制符,说明它具有缺省的访问控制符特性。此时,这个类只能被同一个包中的类访问或引用。这一访问特性又称为包访问性。 3、属性的控制修饰符也分为:可访问控制符和非访问控制符两类。 可访问控制符有 4 种:公共访问控制符: public ;私有访问控制符: private ;保护访问控制符: protected ;私有保护访问控制符: private protected 非访问控制符有 4 种:静态域修饰符: static ;最终域修饰符: final ;易失 ( 共享 ) 域修饰符: volatile ;暂时性域修饰符: transient 1、公共访问控制符 public :用 public 修饰的域称为公共域。如果公共域属于一个公共类,则可以被所有其它类所引用。由于 public 修饰符会降低运行的安全性和数据的封装性,所以一般应减少 public 域的使用。 2、私有访问控制符 private : 用 private 修饰的成员变量 ( 域 ) 只能被该类自身所访问,而不能被任何其它类 ( 包括子类 ) 所引用。 3、保护访问控制符 protected :用 protected 修饰的成员变量可以被三种类所引用:①该类自身;②与它在同一个包中的其它类;③在其它包中的该类的子类。使用修饰符 protected 的主要作用是允许其它包中它的子类来访问父类的特定属性。 4、私有保护访问控制符 private protected :用修饰符 private protected 修饰的成员变量可以被该类本身或该类的子类两种类访问和引用。 5、静态域修饰符 static :用 static 修饰的成员变量仅属于类的变量,而不属于任何一个具体的对象,静态成员变量的值是保存在类的内存区域的公共存储单元,而不是保存在某一个对象的内存区间。任何一个类的对象访问它时取到的都是相同的数据;任何一个类的对象修改它时 , 也都是对同一个内存单元进行操作。 6、最终域修饰符 final :最终域修饰符 final 是用来定义符号常量的。一个类的域 ( 成员变量 ) 如果被修饰符 final 说明,则它的取值在程序的整个执行过程中都是不变的。 7、易失 ( 共享 ) 域修饰符 volatile :易失 ( 共享 ) 域修饰符 volatile 是用来说明这个成员变量可能被几个线程所控制和修改。也就是说在程序运行过程中,这个成员变量有可能被其它的程序影响或改变它的取值。因此,在使用中要注意这种成员变量取值的变化。通常 volatile 用来修饰接受外部输入的域。 8、暂时性域修饰符 transient :暂时性域修饰符 transient 用来定义一个暂时性变量。其特点是:用修饰符 transient 限定的暂时性变量,将指定 Java 虚拟机认定该暂时性变量不属于永久状态,以实现不同对象的存档功能。否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。 4、方法的控制修饰符也分为:可访问控制符和非访问控制符两类。 可访问控制符有 4 种:公共访问控制符: public ;私有访问控制符: private ;保护访问控制符: protected ;私有保护访问控制符: private protected 非访问控制符有 5 种:抽象方法控制符: abstract ;静态方法控制符: static ;最终方法控制符: final ;本地方法控制符: native ;同步方法控制符: synchronized 1、抽象方法控制符 abstract :用修饰符 abstract 修饰的方法称为抽象方法。抽象方法是一种仅有方法头,没有方法体和操作实现的一种方法。 2、静态方法控制符 static :用修饰符 static 修饰的方法称为静态方法。静态方法是属于整个类的类方法;而不使用 static 修饰、限定的方法是属于某个具体类对象的方法。 由于 static 方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即 static 方法只能处理 static 的域。 3、最终方法控制符 final :用修饰符 final 修饰的方法称为最终方法。最终方法是功能和内部语句不能更改的方法,即最终方法不能重载。这样,就固定了这个方法所具有的功能和操作,防止当前类的子类对父类关键方法的错误定义,保证了程序的安全性和正确性。所有被 private 修饰符限定为私有的方法,以及所有包含在 final 类 ( 最终类 ) 中的方法,都被认为是最终方法。 4、本地方法控制符 native :用修饰符 native 修饰的方法称为本地方法。为了提高程序的运行速度,需要用其它的高级语言书写程序的方法体,那么该方法可定义为本地方法用修饰符 native 来修饰; 5、同步方法控制符 synchronized :该修饰符主要用于多线程共存的程序中的协调和同步。

『肆』 如何在Java类中定义接口属性并如何使用

在接口定义好属性变量后,只要实现了该接口,那么就可使用了

『伍』 java接口中可以定义类吗

可以定义,也不仅限于抽象类。只是接口本身不能被实例化,接口内部的专类是可以属实例化的。
调用接口的内部类有两种方法:
1.接口名.类名
2.创建实现类implements接口,再直接实例化内部类
示例代码:
public interface Test{

class A{
public int a=1;
}

}

--

public class Program {
public static void main(String[] args) {
Test.A a = new Test.A();
System.out.println(a.a);
new B().method();
}
}
class B implements Test{

void method(){
System.out.println(new A().a);
}
}
亲测。正常运行打印'1' [换行]'1'

阅读全文

与java接口中定义属性相关的资料

热点内容
微软平板开机密码设置 浏览:978
linux删除一行的快捷键 浏览:269
win10改hosts文件 浏览:354
数据博世怎么样 浏览:411
用tar解包没有那个文件或目录 浏览:307
录歌教程 浏览:604
java小数进制转换 浏览:270
80后qq头像女生 浏览:388
word2013页面颜色 浏览:661
linux系统安装显卡驱动 浏览:243
手机安卓培训机构 浏览:819
英语版本的哈面宝宝 浏览:567
手机动态壁纸教学视频教程 浏览:543
网络摄像机sip 浏览:757
湘潭编程学校哪里好 浏览:389
win10设置桌面小图标怎么去掉吗 浏览:122
网络安全创业 浏览:787
修改linux 浏览:464
如何编程计算机cpu高占用程序 浏览:808
程序员活动策划方案 浏览:130

友情链接