信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索

java接口中定义的常量的访问方法和多实例教程方法

查看数: 2239 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-10-23 11:06

正文摘要:

一、常量定义的基本注意事项。   在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字)来定义常量。当常量被设定后,一般情况下就不允许再进行更改。如可以利用如下的形式来定义一个常量:fin ...

回复

信息发布软件 发表于 2016-10-23 11:19:40
在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外。然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看。

1、可以在enum中添加变量和方法

先来看一段代码示例:

java代码
01
public enum State {
02
        Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4);
03
        // 成员变量
04
        private String name;
05
        private int index;
06

07
        // 构造方法,注意:构造方法不能为public,因为enum并不可以被实例化
08
        private State(String name, int index) {
09
            this.name = name;
10
            this.index = index;
11
        }
12

13
        // 普通方法
14
        public static String getName(int index) {
15
            for (State c : State .values()) {
16
                if (c.getIndex() == index) {
17
                    return c.name;
18
                }
19
            }
20
            return null;
21
        }
22

23
        // get set 方法
24
        public String getName() {
25
            return name;
26
        }
27

28
        public void setName(String name) {
29
            this.name = name;
30
        }
31

32
        public int getIndex() {
33
            return index;
34
        }
35

36
        public void setIndex(int index) {
37
            this.index = index;
38
        }
39
    }
从上面的代码中我们可以看到,定义完枚举值,然后在其后面加上分号,接着就可以定义其他的变量、方法了。另外需要特别说明的是,enum中的构造方法不可以用public标识,这样做是为了防止用户实例化enum。

2、可以用来定义常量

先来回顾一下Java中如何定义常量吧,看下面一段代码:


java代码
1
public static final int normalState = 1;
2
private static final int updateState = 2;
下面我们还可以用enum枚举来代替上面的常量定义,代码如下:


java代码
1
public enum State {
2
  Normal, Update, Deleted, Fired
3
}
在Java中用enum来定义常量在语法上没有什么优势,但是enum枚举类型可以提供更多的操作功能。

3、在enum中实现接口

先来看下面一段代码:


java代码
01
public interface ICanReadState {
02
        void read();
03

04
        String getState();
05
}
06

07
    public enum State implements ICanReadState {
08
        Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4);
09

10
        private String name;
11
        private int index;
12

13
        private State(String name, int index) {
14
            this.name = name;
15
            this.index = index;
16
        }
17

18
        // 接口方法1
19

20
        @Override
21
        public String getState() {
22
            return this.name;
23
        }
24

25
        // 接口方法2
26
        @Override
27
        public void read() {
28
            System.out.println(this.index + ":" + this.name);
29
        }
30
    }
和一般的类中使用接口一样,enum枚举中同样可以继承接口,并实现接口中的所有方法,这样做的好处在于可以更方便地对枚举中的值进行排序、比较等操作,封装性更好。

总结

说白了,enum枚举类型是一个不可以被继承的final类,就以上面的State枚举为例,如果你查看enum类型的字节码,其实是State类型的类静态常量。
信息发布软件 发表于 2016-10-23 11:17:36
我们在定义常量的时候,可以把常量定义在接口里面,如:

package org.zy.demo.base;
public interface InterfaceDemo {
final String name="this is my name";   
}

上面是我定义的接口和常量。
常量的定义没有指明public static。
我实现此接口:

package org.zy.demo.base;
public class InterfaceImpl  implements InterfaceDemo{   
}

那么我们如何访问呢?
我做了一个demo:

package org.zy.demo.base;
public class MainDemo {
public static void  main(String[] args){
InterfaceImpl ii=new InterfaceImpl();
String name = InterfaceDemo.name;
System.out.println(name);
String n=ii.name;
System.out.println(n);
}
}

执行的结果如下:

this is my name
this is my name

在上面的程序中,我们使用了两种不同的方法来取得了name的值。
由第一种方法我们可以知道:其实接口内定义的所有的属性和方法都是public类型的。如果是属性,其默认是Public static的。
通过第二种方法我们可以知道,此属性是公有的。否则我们怎么能直接访问呢?
由上面的结论,我们可以知道,为什么我们定义接口中的方法的时候,不用添加public,可以定义如下方法:

Public Interface A{
A();
}

当然你也可以这样定义:

Public Interface A{
Public A();
}

信息发布软件 发表于 2016-10-23 11:14:50
waver_jiang

发表文章: 1
注册时间: 2006年10月21日 10:23
昨天的面试题,请指教发表: 2006年10月21日 10:24
回复
昨天去面试,问到了一个接口问题,为什么接口中定义的变量必须为常量?请指点!<script type="text/javascript"><!-- google_ad_client = "pub-2190557680964036"; //336x280, 创建于 07-11-18 google_ad_slot = "6368516427"; google_ad_width = 336; google_ad_height = 280; //--></script><script src="" type="text/javascript"> </script>
banq

发表文章: 8513
注册时间: 2002年08月03日 17:08
Re: 昨天的面试题,请指教发表: 2006年10月23日 15:26
回复
我只知道这是Java规定,另外接口是行为抽象,不是属性抽象。
taoj555

发表文章: 3
注册时间: 2006年09月26日 15:42
Re: 昨天的面试题,请指教发表: 2006年11月16日 16:10
回复
接口不能被实例化,所以其成员变量必须为不可修改的,就是常量。
javagood

发表文章: 5
注册时间: 2007年01月25日 11:14
回复:昨天的面试题,请指教发表: 2007年01月25日 17:32
回复
不是太明白
peterkong

发表文章: 6
注册时间: 2005年04月11日 22:28
re:昨天的面试题,请指教发表: 2007年01月31日 10:58
回复
因为接口定义处方法以外都
final static的所以必须为常量
billylinux

发表文章: 4
注册时间: 2007年01月31日 16:21
re:昨天的面试题,请指教发表: 2007年01月31日 16:24
回复
三楼的:接口不能被实例化,所以其成员变量必须为不可修改的,就是常量。

这个是正解
taia

发表文章: 2
注册时间: 2007年01月31日 18:45
re:昨天的面试题,请指教发表: 2007年01月31日 18:46
回复
楼上的
"接口不能被实例化" 与 "其成员变量必须为不可修改的" 有必然的联系吗?

抽象类也不能实例化,但它就可以定义变量


另外,接口是可以定义变量的,偶刚才试过了,可以通过编译
taia

发表文章: 2
注册时间: 2007年01月31日 18:45
re:昨天的面试题,请指教发表: 2007年01月31日 18:56
回复
续上,干脆把代码也贴出来


public abstract class Word{

public int i;

}



class Test extends Word
{
public static void main(String[] args)
{
Test test=new Test();
System.out.println(test.i);
test.i=2;
System.out.println(test.i);
}
}


------------
PS:把WORD抽象类标识也可改为接口标识,但里面的变量i必须赋初值,可以不用fanil来声明为常量
fogu7

发表文章: 10
注册时间: 2007年02月01日 08:46
re:昨天的面试题,请指教发表: 2007年02月01日 08:47
回复
还真没想过
iswind

发表文章: 1
注册时间: 2007年02月01日 17:59
re:昨天的面试题,请指教发表: 2007年02月01日 18:00
回复
因为接口不包含任何实现细节,所以他们不能定义普通的字段——这样的定义会把实现策略强加给选择实现该接口的类。
leoyu

发表文章: 49
注册时间: 2007年01月31日 22:11
回复:昨天的面试题,请指教发表: 2007年02月02日 09:37
回复
首先你要弄清接口的含义.接口就是提供一种统一的'协议',而接口中的属性也属于'协议'中的成员.它们是公共的,静态的,最终的常量.相当于全局常量.
抽象类是不'完全'的类,相当于是接口和具体类的一个中间层.即满足接口的抽象,也满足具体的实现.

[该贴被leoyu于2007年02月02日 09:40修改过]
dhxyu

发表文章: 1
注册时间: 2007年01月29日 16:46
re:昨天的面试题,请指教发表: 2007年02月02日 13:37
回复
来看看 哈
journeydj

发表文章: 1
注册时间: 2007年02月02日 20:52
回复:昨天的面试题,请指教发表: 2007年02月02日 20:56
回复
学习一下 J道第一贴(刚注册的 :))
jdonfans

发表文章: 61
注册时间: 2007年01月16日 11:42
re:昨天的面试题,请指教发表: 2007年02月03日 21:05
回复
什么公司啊,无不无聊了一点。管它为什么,只要知道接口里面只能声明常量不就得了。

他如果问: 接口里面能定义变量吗?

这样还说得过去。
YRHYRH

发表文章: 14
注册时间: 2006年12月01日 03:06
re:昨天的面试题,请指教发表: 2007年02月05日 03:39
回复
leoyu 正解呀。。呵呵。。
worfchina

发表文章: 1
注册时间: 2007年03月26日 01:47
re:昨天的面试题,请指教发表: 2007年02月09日 13:26
回复
接口不能被实例化,所以其成员变量必须为不可修改的,就是常量。
jiu shi l
Edgra

发表文章: 18
注册时间: 2006年12月26日 16:53
回复:re:昨天的面试题,请指教发表: 2007年03月09日 14:48
回复
反问他, 如果你定义。 有啥意义???
icen

发表文章: 11
注册时间: 2007年03月09日 22:42
re:昨天的面试题,请指教发表: 2007年03月11日 11:20
回复
如果接口中定义的是变量,而且接口中的变量可是public static的
那么如果一个方法改变了该接口的变量的值的话,这样破坏了封装性,所有当前程序中访问该接口的方法,所有实现了该接口的对象的值都会跟着变,这会引起很大的混乱的。

[该贴被icen于2007年03月11日 11:22修改过]
zhouxu

发表文章: 23
注册时间: 2007年01月31日 13:08
re:昨天的面试题,请指教发表: 2007年03月11日 22:51
回复
Java因为不支持多继承而广泛使用接口,可能这条规定也只是为了简化语言本身,除此之外我想不出还有什么特别的意义。
一个接口实例的改变不会对其它程序有影响,也没听说有理论强调在"接口"中定义变量就不好。
Coolyu0916

发表文章: 196
注册时间: 2007年04月23日 11:29
re:昨天的面试题,请指教发表: 2007年03月12日 09:06
回复
在接口中定义常量基本上意义不大
除了为了一些特殊的标识
kungstriving

发表文章: 4
注册时间: 2006年12月07日 12:38
re:昨天的面试题,请指教发表: 2007年03月28日 11:29
回复
JAVA在接口定义中,会将接口中的所有变量默认定义为public static final,就算你只是定义int i = 0; java也会将它转化为public static final int i = 0;
piaochunzhi

发表文章: 3
注册时间: 2007年03月13日 09:02
re:昨天的面试题,请指教发表: 2007年03月28日 12:36
回复
这 种公司不去也就那样了!

不会是 isofts。。。。。。 这个 垃圾公司吧
richit

发表文章: 1
注册时间: 2007年04月08日 08:22
re:昨天的面试题,请指教发表: 2007年04月08日 08:22
回复
学习。。。
colina

发表文章: 7
注册时间: 2007年03月15日 10:18
re:昨天的面试题,请指教发表: 2007年04月08日 15:43
回复
学习!
njlinj

发表文章: 1
注册时间: 2007年04月08日 22:52
re:昨天的面试题,请指教发表: 2007年04月08日 23:03
回复
积累~
fanfan6621

发表文章: 1
注册时间: 2007年05月26日 13:41
回复:回复:昨天的面试题,请指教发表: 2007年05月26日 14:26
回复
leoyu的说法是正确的,我补充以下。
如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,可以通过实现接口的对象的行为来修改接口中的属性。这当然没有问题,但是考虑这样的情况。如果接口A中有一个public访问权限的静态变量a。按照java的语义, 我们可以不通过实现接口的对象来访问变量a,通过A.a = xxx;就可以改变接口中的变量a的值了。正如抽象类中是可以这样做的,那么实现接口A的所有对象也都会自动拥有这一改变后的a的值了,也就是说一个地方改变了a,所有这些对象中a的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?所以接口中不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。

通俗的讲,你认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则的一种体现。
rose

发表文章: 22
注册时间: 2007年06月22日 12:40
re:昨天的面试题,请指教发表: 2007年06月23日 14:52
回复
支持fanfan6621的说法。
yijianfengyu

发表文章: 3
注册时间: 2007年07月23日 11:37
re:昨天的面试题,请指教发表: 2007年07月25日 09:20
回复
其实这个题目非常好,就测试你对开闭原则的理解!
simic

发表文章: 1
注册时间: 2007年07月30日 13:52
re:昨天的面试题,请指教发表: 2007年07月30日 14:06
回复
哈哈 这个题目相当高明

不能简单回答说 java规范规定了不能在interface中定义变量。

因为规范这么规定肯定是有他的thinking 当然了java规范里确实还有很多不可理解的定义。。

interface里定义变量 比如定义一个 publc string name; 那还不如定义getName or/and setName 方法来的好 因为直观的表明了这个interface的行为是能供查询name 还是可以修改name。

abstract class 可以的定义变量 因为abstract class里还有普通的方法 而这些方法可能会需要用到变量。


1. 抽象类

  Java语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类,用abstract 关键字来修饰一个方法时,这个方法叫做抽象方法。格式如下:
  abstract class abstractClass{ …} //抽象类
  abstract returnType abstractMethod([paramlist]) //抽象方法

 抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能被实例化,抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类

 2. 接口

  接口是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。它的用处体现在下面几个方面:
  ◇ 通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。
  ◇ 通过接口指明多个类需要实现的方法。
  ◇ 通过接口了解对象的交互界面,而无需了解对象所对应的类。

  1)接口的定义
  接口的定义包括接口声明和接口体。
  接口声明的格式如下:
  [public] interface interfaceName[extends listOfSuperInterface] { … }
   extends 子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。

  接口体包括常量定义和方法定义
  常量定义格式为:type NAME=value; 该常量被实现该接口的多个类共享; 具有public ,final, static的属性。
  方法体定义格式为:(具有 public和abstract属性)
  returnType methodName([paramlist]);

  2)接口的实现
  在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分开。

  3) 接口类型的使用
  接口作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。


QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2024-11-23 18:56 , Processed in 0.122785 second(s), 44 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表