Java中的各类修饰符

1.类修饰符,分为两类,可访问控制符:public;非访问控制符:abstract,final。

  1. 公共类修饰符public,每个Java程序都必须有一个public类作为主类。
  2. 抽象类修饰符abstract,抽象类不能new出对象。但是抽象类中方法不一定都是抽象的。
  3. 最终类修饰符final,被定义的类不能被继承,完成特殊或固定功能的类被定义成该类。
  4. 类缺省访问控制符,一个类没有访问控制符,就具有缺省的访问控制符。这个类只能被同一个包的类访问或引用。

2.属性修饰符也分为:可访问控制符和非访问控制符

  1. 可访问控制符有4种:公共访问控制符:public;私有访问控制符:private;保护访问控制符:protected;私有保护访问控制符:private protected
  2. 非访问控制符也有4种:静态域修饰符:static;最终域修饰符:final;易失(共享)域修饰符:volatile;暂时域修饰符:transient
  • public:用public修饰的域称为公共域。如果公共域属于一个公共类,则可以被所有其他类所引用。这样会降低运行的安全性和数据的封装性,很少使用。
  • private:用private修饰的域只能被该类自身所访问,而不能被任何其他类(包括子类)所引用。
  • protected:用protected修饰的域能被三种类所引用:①该类自身;②与它在同一个包中的其它类;③在其它包中的该类的子类。
  • private protected:用private protected修饰的域能被类自身和该类的子类两种类访问和引用。(在eclipse中测试,此修饰符似乎有问题!)
  • static:用static修饰的域属于类的变量,不属于任何一个对象。静态成员变量存储在类内存区域的公共存储单元,而不是某一个对象的内存区域。
  • final:final用来定义符号常量的。一个类的域被声明成final,它的值在程序的整个执行阶段都不会变。
  • volatile:volatile被用来说明成员变量可以被几个线程控制和修改。也就是说在程序执行过程中,这个成员变量有可能被其他的程序影响或改变。通常volatile用来修饰接受外部输入的域。
  • transient:transient用来声明一个暂时性变量。表明此变量不属于对象的永久性状态,对象序列化时不保存此变量的值。

3.方法修饰符也分为可访问控制符和非访问控制符

  1. 可访问控制符有4种:公共访问控制符:public;私有访问控制符:private;保护访问控制符:protected;私有保护访问控制符:private protected
  2. 非访问控制符有5种:抽象方法控制符:abstract;静态方法控制符:static;最终方法控制符:final;本地方法控制符:native;同步方法控制符:synchronized

可访问控制符与属性相似,不再赘述。下面介绍非访问控制符。

  • abstract:用abstract修饰的方法称为抽象方法。抽象方法只有方法头,没有方法体,也就是没有具体实现。
  • static:用static修饰的方法称为静态方法。静态方法是属于整个类的方法,不属于某一个对象,可用类名直接调用。
  • final:用final修饰的方法称为最终方法。最终方法是功能和内部语句不能被更改的方法,即不能被覆盖,以防止子类对父类方法的错误定义。所有被private修饰的方法以及所有final类中的方法都是最终方法。
  • native:用native修饰的方法称为本地方法。为了提高程序的运行速度,需要用其他的高级语言实现方法的方法体,可以用native修饰,与abstract不同,其没有方法体。
  • synchronized:该修饰主要用于多线程共存的程序中的协调和同步。被修饰的方法不能被多个线程同时执行。

转帖自:kuaiwei2009

PHP类的修饰符

PHP 中通过在前面添加访问修饰符 public、protected 或 private 来实现对属性或方法的访问控制。

访问控制

类型的访问修饰符允许开发人员对类成员的访问进行控制,这是 OOP 语言的一个特性。

PHP 支持如下三种访问修饰符:

public (公有的):类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)这个类成员(包括成员属性和成员方法)。如果类的成员没有指定成员访问修饰符,将被视为 public 。

protected (受保护的):被定义为 protected 的成员不能被该类的外部代码访问,但该类的子类具有访问权限。

private (私有的):被定义为 private 的成员,允许同一个类里的所有成员访问,但对于该类的外部代码和子类都不允许访问。

修饰符访问权限对照表:

public protected private

同一个类中 √ √ √

类的子类中 √ √

所有的外部成员 √

提示

在子类覆盖父类的方法时,子类中方法的访问权限不能低于父类被覆盖方法的访问权限。

封装

封装,就是把类(对象)的属性和服务结合成一个独立的单位,并尽可能隐藏内部的细节,只保留必要的接口与外部发生联系。这种封装特性,有效的保证了对象的独立性,使软件错误能够局部化,大大减少查错和排错的难度。

使用 private 关键字来对属性和方法进行封装:

<?php

class Person {

//将成员属性定义为 private

private $name;

private $age;

//定义一个构造方法初始化赋值

function __construct($name, $age) {

$this->name=$name;

$this->age=$age;

}

function say() {

echo “我的名字叫:”.$this->name.”<br />”;

echo “我的年龄是:”.$this->age;

}

}

$p1=new Person(“张三”, 20);

$p1->say();

?>

在该例子中,如果我们试图用 $p1->name = “张三”; 这种方式去访问对象属性就会产生错误。而构造方法和 say() 方法没有指定私有属性,在 PHP 中则默认为公有的(public)。

通过PHP 类的访问控制与封装 public,protected,private 修饰符_PHP基础教程.

[转载]如何设置Response中的ContentType

ajax开发中, 常遇到下面的几种情况:

1 服务端需要返回一段普通文本给客户端

2 服务端需要返回一段HTML代码给客户端

3 服务端需要返回一段XML代码给客户端

4 服务端需要返回一段javascript代码给客户端

5 服务端需要返回一段json串给客户端

================================

对于每一种返回类型 规范的做法是要在服务端指定 response的contentType 的.

(当然 不指定绝大多数情况下也没什么问题 尤其是返回”非xml”的时候)

Java代码 复制代码

1. 普通文本 : text/plain

2. HTML代码 : text/html

3. XML代码 : text/xml

 

以上三个可以说是毫无争议的, 也没什么值得讨论的,

但是另外两种情况 就要注意一下了.

javascript 的 contentType 按最标准的写法 应该是 application/javascript.

而常用的 text/javascript 已经被 rfc定义为废弃的.

(参见 rfc4329)

但是 在这里暂时不建议使用 application/javascript .

大家还是继续使用 text/javascript 为好.

因为很多老旧浏览器并不支持 application/javascript .

而所有浏览器都支持 text/javascript.

在标准和广泛的兼容性之间 还是暂且选择后者吧.

json 的 contentType 常见写法有 : text/json & text/javascript .

但是 这个 text/json 其实是根本不存在的,

而 text/javascript 在有些时候客户端处理起来会有歧义.

对于json的contentType , rfc里定义的标准写法是 :application/json.

(参见 rfc4627)

在这里毫无疑问 我们应该选择标准写法的 application/json.

======================

也许有人会问, 设置这些有什么用呢?

以前一些程序没有设置这些东西 运行的也很好啊.

首先必须承认的一点是, 这些信息 在目前绝大多数情况下 确实不设置也可以.

但是这种做法是不规范不标准的.

未来对于复杂的ajax应用 ,不规范的行为是会带来很大的隐患.

举个例子.

对于同样的内容 可以有下面的3种形式

html形式

Html代码 复制代码

1. <script type=”text/javascript”>

2.  var user = {

3.    name : “Tom”,

4.    age : 12

5. };

6. </script>

对于 html 形式,客户端得到数据后,往往是对其做dom操作.

javascript形式

Javascript代码 复制代码

1. var user = {

2.   name : “Tom”,

3.   age : 12

4. ;

对于 javascript形式,往往是对其做eval操作:

eval(responseText);

json形式

1. {

2.   name : “Tom”,

3.   age : 12

 

对于 json形式,往往是对其做  eval操作之后 赋值给某变量:

var clientVar= eval(responseText);

客户端拿到不同形式的代码 所要做的工作是不一样的.

如果没有设置 contentType 客户端很难判断 返回的数据是什么, 该怎么处理.

==========================

另外,对于返回信息,如果不设置contentType,web服务器往往会给返回的内容添加一个”默认的contentType”,

但是这个”默认”会根据服务器的不同 以及web应用配置的不同而不同.

而浏览器对于没有足够头信息的返回值 也会做出”某些默认行为(打开 或下载 或报错”.

总之 不同浏览器 不同的浏览器设置 结果可能是不一样的 无法把控.

也就是说 当我们不指定正确的contentType时, 我们所能做的只能是祈祷 在所有环境中, 程序的表现是一致的,

但是与其”祈祷”不如我们亲自把这些信息加上来得可靠.

所以 正确设置返回信息的 contentType  还是很有必要的.

======================

总结 & 建议 :

1.

服务端 向 客户端 发送 JSON数据 时:

Content-Type = ‘application/json;charset=UTF-8’

2.

服务端 向 客户端 发送 JS 代码 时:

Content-Type = ‘text/javascript;charset=UTF-8’

3

服务端 判断 客户端 提交的是否是 JSON数据 时 :

Content-Type = ‘application/json;charset=UTF-8’

Content-Type = ‘text/json;charset=UTF-8’

Content-Type = ‘text/javascript;charset=UTF-8’

Content-Type = ‘application/javascript;charset=UTF-8’

只要 Content-Type 满足上面4个条件中的 任意一个时,就可以认为提交的数据是 JSON数据.

之所以要提供4种选择 是因为 为了提供更好的兼容性.

(我想没有人会提交真正的js代码到服务端 然后用服务端js引擎去解析执行吧?

即使真有这种需求 也可以在js代码外包一层 json格式的 wrapper ,

所以姑且都当作json处理应该没什么问题)

通过如何设置Response中的ContentType – AJAX/JS教程 – 新补天网 – 网络安全资讯站.

javascript cookies 存、取、删除实例

<script>

//写cookies函数 作者:翟振凯

function SetCookie(name,value)//两个参数,一个是cookie的名子,一个是值

{

var Days = 30; //此 cookie 将被保存 30 天

var exp  = new Date();    //new Date(“December 31, 9998”);

exp.setTime(exp.getTime() + Days*24*60*60*1000);

document.cookie = name + “=”+ escape (value) + “;expires=” + exp.toGMTString();

}

function getCookie(name)//取cookies函数

{

var arr = document.cookie.match(new RegExp(“(^| )”+name+”=([^;]*)(;|$)”));

if(arr != null) return unescape(arr[2]); return null;

}

function delCookie(name)//删除cookie

{

var exp = new Date();

exp.setTime(exp.getTime() – 1);

var cval=getCookie(name);

if(cval!=null) document.cookie= name + “=”+cval+”;expires=”+exp.toGMTString();

}

SetCookie (“xiaoqi”, “3”)

alert(getCookie(‘xiaoqi’));

</script>

 

一个非常实用的javascript读写Cookie函数

一个非常实用的javascript读写Cookie函数

function  GetCookieVal(offset)

//获得Cookie解码后的值

{

var  endstr  =  documents.cookie.indexOf  (“;”,  offset);

if  (endstr  ==  -1)

endstr  =  documents.cookie.length;

return  unescape(documents.cookie.substring(offset,  endstr));

}

function  SetCookie(name,  value)

//设定Cookie值

{

var  expdate  =  new  Date();

var  argv  =  SetCookie.arguments;

var  argc  =  SetCookie.arguments.length;

var  expires  =  (argc  >  2)  ?  argv[2]  :  null;

var  path  =  (argc  >  3)  ?  argv[3]  :  null;

var  domain  =  (argc  >  4)  ?  argv[4]  :  null;

var  secure  =  (argc  >  5)  ?  argv[5]  :  false;

if(expires!=null)  expdate.setTime(expdate.getTime()  +  (  expires  *  1000  ));

documents.cookie  =  name  +  “=”  +  escape  (value)  +((expires  ==  null)  ?  “”  :  (“;  expires=”+  expdate.toGMTString()))

+((path  ==  null)  ?  “”  :  (“;  path=”  +  path))  +((domain  ==  null)  ?  “”  :  (“;  domain=”  +  domain))

+((secure  ==  true)  ?  “;  secure”  :  “”);

}

function  DelCookie(name)

//删除Cookie

{

var  exp  =  new  Date();

exp.setTime  (exp.getTime()  –  1);

var  cval  =  GetCookie  (name);

documents.cookie  =  name  +  “=”  +  cval  +  “;  expires=”+  exp.toGMTString();

}

function  GetCookie(name)

//获得Cookie的原始值

{

var  arg  =  name  +  “=”;

var  alen  =  arg.length;

var  clen  =  documents.cookie.length;

var  i  =  0;

while  (i  <  clen)

{

var  j  =  i  +  alen;

if  (documents.cookie.substring(i,  j)  ==  arg)

return  GetCookieVal  (j);

i  =  documents.cookie.indexOf(”  “,  i)  +  1;

if  (i  ==  0)  break;

}

return  null;

}

 

<SCRIPT  language=”javascript”>

<!–

function  openpopup(){

url=”popup.htm”

window.open(“gonggao.htm”,”gonggao”,”width=260,height=212,left=200,top=0″)

}

function  get_cookie(Name)  {

var  search  =  Name  +  “=”

var  returnvalue  =  “”;

if  (documents.cookie.length  >  0)  {

offset  =  documents.cookie.indexOf(search)

if  (offset  !=  -1)  {

offset  +=  search.length

end  =  documents.cookie.indexOf(“;”,  offset);

if  (end  ==  -1)

end  =  documents.cookie.length;

returnvalue=unescape(documents.cookie.substring(offset,  end))

}

}

return  returnvalue;

}

function  helpor_net(){

if  (get_cookie(‘popped’)==”){

openpopup()

documents.cookie=”popped=yes”

}

}

helpor_net()

//–>

</SCRIPT>

 

如果点了确定,只要不清cookie,以后访问都不会再提示,如果不点确定则每次都会提示。放在js文件里,全站包含

<SCRIPT LANGUAGE=”JavaScript”>

<!–

var the_cookie = document.cookie;

var broken_cookie = the_cookie.split(“:”);

var the_visiteraccepted = unescape(broken_cookie[1]);

//

if (the_visiteraccepted==”undefined”){

var tmp=confirm(‘中国人何时何地。’);

if(tmp==false){

window.close();

}else{

var the_visiteraccepted = 1;

var the_cookie = “ILoveChina=visiteraccepted:” + escape(the_visiteraccepted);

document.cookie = the_cookie;

}

}

//–>

</SCRIPT>

 

1. Cookie的兼容性问题

Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。

2. Cookie的内容

同样的Cookie的内容的字符限制针对不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容。这也就是为什么我们在例子中设定Cookie的内容为”Test_Content”的原因。

虽然在Cookie Version 1规定中放宽了限制,可以使用这些字符,但是考虑到新版本的Cookie规范目前仍然没有为所有的浏览器所支持,因而为保险起见,我们应该在Cookie的内容中尽量避免使用这些字符

http://www.hq-poly.com/news/read.asp?id=137

通过javascript cookies 存、取、删除实例 – zxmcl的专栏 – 博客频道 – CSDN.NET.

MYSQL ERRNO:#1005 – Can’t create table ‘./my_news_release_system/user.frm’ (errno: 150)原因总结

#1005 – Can’t create table ‘./my_news_release_system/user.frm’ (errno: 150)

MySQL Error Number 1005 Can’t create table ‘XX.frm’ (errno: 150)

默认分类 2010-04-28 16:04:41 阅读364 评论0   字号:大中小 订阅

烦了我一下午  终于解决了  在这里分享下  一篇彻底解析这个错误的文章。

当你试图在mysql中创建一个外键的时候,这个出错会经常发生,这是非常令人沮丧的。像这种不能创建一个.frm 文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上,这个mysql报错已经被报告是一个mysql本身的bug并出现在mysql 开发者列表当中很多年了,然而这似乎又是一种误导。

在很多实例中,这种错误的发生都是因为mysql一直以来都不能很好的支持的关系的问题, 更不幸的是它也并没有指明到底是哪一个问题会导致上面那种错误,下面我把导致这个可怕 的150错误的常见原因列出来了,并且我以可能性的大小作了排序

已知的原因:

1, 两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11) 都显示为integer。另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED, 这两字段必须严格地一致匹配,更多关于signed 和 unsigned 的信息,请参阅:http://www.verysimple.com/blog/?p=57

2, 你试图引用的其中一个外键没有建立起索引,或者不是一个primary key , 如果其中一个不是primary key 的放,你必须为它创建一个索引。

3, 外键的名字是一个已经存在的一个键值了,这个时候,你应该检查你的数据库以确保外健名字是唯一的,或者你在键名后面加上几个随机的字符以测试是否是这个原因。

4, 其中一个或者两个表是MyISAM引擎的表,若想要使用外键约束,必须是InnoDB引擎,(实际上,如果两个表都是MyISAM 引擎的,这个错误根本不会发生,但也不会产生外键),你可以通过查询浏览器来设置表的引擎类型

5, 你可能设置了ON DELETE SET NULL, 但是相关的键的字段又设置成了NOTS NULL 值。你可能通过修改cascade 的属性值或者把字段属性设置成 allow null 来搞定这个bug.

6, 请确定你的Charset 和 Collate 选项在表级和字段级上的一致

7, 你可能设置为外键设置了一个默认值,如 default=0

8, 在这个关系里面,其中的一个字段是一个混合键值中的一个,它没有自己独立的索引,这时,你必须为它创建一个独立的索引。

9, ALTER 声明中有语法错误

我的错误,SQL和MYSQL语法差别

SQL: CONSTRAINT a_b FOREIGN KEY(b_key) REFERENCES b

MYSQL:CONSTRAINT a_b FOREIGN KEY(b_key) REFERENCES b(b_key)

通过MYSQL ERRNO:#1005 – Can’t create table ‘./my_news_release_system/user.frm’ (errno: 150)原因总结 – huyanping的专栏 – 博客频道 – CSDN.NET.