BloveSaga

在希腊帕尔纳斯山南坡上,有一个驰名世界的戴尔波伊神托所,在它的入口处的巨石上赫然锈刻着这样几个大字: 认识你自己!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  34 随笔 :: 12 文章 :: 122 评论 :: 0 Trackbacks

#

         多线程学习

 * 程序,进程和线程
程序: 是指计算机指令的集合,它以文件的形式存储在磁盘上。
进程: 是一个程序在其自身的地址空间中的一次执行活动。

进程是资源的申请,调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请
系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不站用系统的运行资源。

线程: 是进程中一个单一的连接控制流程。一个进程可以有多个线程。

线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程
没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远
较进程简单。
 * Java对多线程的支持
Java在语言级提供了对多线程程序设计的支持。
实现线程程序的两种方式:
(1)从Thread类继承;
(2)实现Runnable接口。

Java运行时系统实现了一个用于调度线程执行的线程调度器,用于确定某一时刻由哪一个线程在
CPU上运行。
在java技术中,线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的
进程)。抢占式调度模型就是许多线程处于可以运行状态(等待状态),但实际上只有一个线程在
运行。该线程一直运行到它终止进入可运行状态(等待状态),或者另一个具有更高优级的线程
变成可运行状态。在后一种情况下,低优先级的线程被高优先级的线程抢占,高优先级的线程获得
运行的机会。
Java线程调度器支持不同优先级线程的抢占方式,但其本身不支持相同优先级线程的时间片轮换。
Java运行时系统所在的操作系统(例如:windows2000)支持时间片的轮换,则线程调度器就支持
相同优先级线程的时间片轮换。

用多线程技术模拟一个售票系统
实现代码如下:
class TicketSystem
{
 public static void main(String[] args)
 {
  SellTicket st = new SellTicket();
  new Thread(st).start();
  new Thread(st).start();
  new Thread(st).start();
  new Thread(st).start();
 }
}
class SellTicket implements Runnable
{
 int tickets=100;
 Object o = new Object();
 public void run()
 {
  while(true)
  {
   /*
    synchronized(o)  //同步块在关键字后得加个对象(任意的对象都可以)
    {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println(Thread.currentThread().getName()+
          "sell tickets"+tickets);
          tickets--;    
     }
    }
    */
    sell(); 
  }
 }
 public synchronized void sell()  //同步方法
 {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println(Thread.currentThread().getName()+
          "sell tickets"+tickets);
          tickets--;    
     }   
 }
}
 * 线程的同步
 The code segments within a program that access the same object from separate,concurrent
 thread are called "critical sections"。
 同步的两种方式:同步块和同步方法
 没一个对象都有一个监视器(monitor),或者叫做琐。
 同步方法利用的是this所代表的对象的琐。
 每个class也有一个琐,是这个class所对应的Class对象的琐。
完整示例:
class TicketSystem
{
 public static void main(String[] args)
 {
  SellTicket st = new SellTicket();
  new Thread(st).start();
  /*
   *写一个try{}catch{}块让main()方法所在的线程睡1秒
   *主要是想要线程优先启动
  */
  try
  {
   Thread.sleep(1);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  st.b=true;
  new Thread(st).start();
  //new Thread(st).start();
  //new Thread(st).start();
 }
}
class SellTicket implements Runnable
{
 int tickets=100;
 Object obj = new Object();
 boolean b=false;
 public void run()
 {
  if(b==false)
  {
   while(true)
      sell();
  }
  else
  {
     while(true)
   {  
    synchronized(this)  //同步块在关键字后得加个对象(任意的对象都可以)
    {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println("obj:"+Thread.currentThread().getName()+
          " sell tickets"+tickets);
          tickets--;    
     }
    }   
   // sell(); 
  }
  }

 }
 public synchronized void sell()  //同步方法
 {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println("sell():"+Thread.currentThread().getName()+
          "sell tickets"+tickets);
          tickets--;    
     }   
 }
}

 * 线程的死琐
 哲学家进餐的问题
 一帮哲学家在一起进餐,但是每个人都只有1支筷子,大家都在等待别人拿出一支筷子让自己
 先吃,然后再把自己的拿出去,但是大家都不愿意拿出自己的筷子。
 线程1琐住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的
 监视器,就造成了死琐。

 示例代码:
class TicketSystem
{
 public static void main(String[] args)
 {
  SellTicket st = new SellTicket();
  new Thread(st).start();
  /*
   *写一个try{}catch{}块让main()方法所在的线程睡1秒
   *主要是想要线程优先启动
  */
  try
  {
   Thread.sleep(1);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  st.b=true;
  new Thread(st).start();
  //new Thread(st).start();
  //new Thread(st).start();
 }
}
class SellTicket implements Runnable
{
 int tickets=100;
 Object obj = new Object();
 boolean b=false;
 public void run()
 {
  if(b==false)
  {
   while(true)
      sell();
  }
  else
  {
     while(true)
   {  
    synchronized(obj)  //同步块在关键字后得加个对象(任意的对象都可以)
    {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      } 
      synchronized(this)
      {      
            if(tickets>0)
             {
                System.out.println("obj:"+Thread.currentThread().getName()+
                " sell tickets"+tickets);
                tickets--;    
              }
      }
      }   
    }
  }

 }
 public synchronized void sell()  //同步方法
 {
  synchronized(obj)
  {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println("sell():"+Thread.currentThread().getName()+
          "sell tickets"+tickets);
          tickets--;    
     }
  } 
 }
}
 * wait,notify,notifyAll
 每个对象除了有一个琐之外,还有一个等待队列(wait set),当一个对象刚刚创建的时候,它
 的等待队列是空的。
 我们应该在当前线程锁住对象的琐后,去调用该对象的wait方法。
 当调用对象的notify方法时,将从该对象的等待队列中删除一个任意的线程,这个线程将再次
 成为可运行的线程。
 当调用对象的notifyAll方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将
 成为可运行的线程。
 wait和notify重要用于producer-consumer这种关系中。
 代码示例:
 class Test
{
 public static void main(String[] args)
 {
  Queque q = new Queque();
  Procedur p = new Procedur(q);
  Consumer c = new Consumer(q);
  p.start();
  c.start();
  
 }
}

class Procedur extends Thread   //生产者
{
 Queque q;
 Procedur(Queque q)
 {
  this.q=q;
 }
 public void run()
 {
  for(int i=0;i<10;i++)
  {
   q.put(i);
   System.out.println("Procedur put"+ i);
  }
 }
}

class Consumer extends Thread   //消费者
{
 Queque q;
 Consumer(Queque q)
 {
  this.q=q;
 }
 public void run()
 {
  while(true)
  {
   System.out.println("Consumer get"+q.get());
  }
 }
}

class Queque    //放置数据
{
 int value;
 boolean bFull=false;
 public synchronized void put(int i)
 {
  if(!bFull)
  {
    value=i; 
    bFull=true;
    notify();  
  }
  try
  {
   wait();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 public synchronized int get()
 {
  if(!bFull)
  {
   try
   {
    wait();
   }
   catch(Exception e)
   {
    e.printStackTrace();
   }
  }
  bFull=false;
  notify();
  return value;
 }
}


 线程的状态图

   |
   | new Thread
   |                   yield      sleep,wait,suspend,I/O阻塞
  \|/ start                     |------------------------------------>|
  New----->Runnable|                                                        |Not Runnable
                            \    |<------------------------------------|         /
                             \     sleep结束,notify,resume,I/O操作完成    /
                              \                                                                 /
                               \                                                              /
                                \                                                           /
                                 \                                                         /
                                  \ run方法退出                                /
                                   \stop方法调用                             /
                                    \                                                /
                                     \                                             / 
                                      \                                          /  stop方法调用
                                       \                                       /
                                        \                                     /
                                         \                                   /
                                          \                                /
                                           \                             /
                                            \                           /
                                             \ ______ _____/
                                              |      Dead         |
                                              |____________|
 线程的终止
 
 设置一个flag变量。
 结合interrupt()方法。
 code:
class TestThread
{
 public static void main(String[] args)
 {
  Thread1 t1=new Thread1();
  t1.start();
  int index=0;
  while(true)
  {
   if(index++==500)
   {
    t1.stopThread();
    break;
   }
   System.out.println(Thread.currentThread().getName());
  }
 }
}

class Thread1 extends Thread
{
 private boolean bStop=false;
 public void run()
 {
  while(!bStop)
  {
   System.out.println(getName());
  }
 }
 public void stopThread()
 {
  bStop=true;
 }
}

posted @ 2006-06-08 12:21 蓝色Saga 阅读(150) | 评论 (0)编辑 收藏

我这里有些视频教程,需要的流下email,我会把具体的地址,我下载文件email给你!

视频目录:

1.HTTP协议详解
    详细介绍了 HTTP 协议的内容,包括: HTTP URL 、 HTTP 请求、 HTTP 响应和 HTTP 消息。
    最后给出了两个实验,帮助大家更好地理解 HTTP 协议。
    本课程将为您深入学习 Java Web 开发打下基础。
2. Eclipse开发工具介绍
     Eclipse是一个开放源代码的、基于 Java 的可扩展的开发平台,是目前非常流行的Java开发工具。
    本课程将为您介绍Eclipse的安装、配置和使用。
3. HTML语言速成
    帮助您快速掌握HTML语言,为学习XML和JSP开发打下基础。
4.  MySQL视频教程
5.  面向对象程序设计
6.  LINUX视屏教程

如果以上有你需要的,就留下email地址,晚上我会统一发!
posted @ 2006-06-07 15:30 蓝色Saga 阅读(1537) | 评论 (110)编辑 收藏

匹配中文字符的正则表达式:  [\u4e00-\u9fa5]

匹配双字节字符 ( 包括汉字在内 ) [^\x00-\xff]

应用:计算字符串的长度(一个双字节字符长度计 2 ASCII 字符计 1

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

匹配空行的正则表达式: \n[\s| ]*\r

匹配 HTML 标记的正则表达式: /<(.*)>.*<\/\1>|<(.*) \/>/ 

匹配首尾空格的正则表达式: (^\s*)|(\s*$)

应用: javascript 中没有像 vbscript 那样的 trim 函数,我们就可以利用这个表达式来实现,如下:

String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}

利用正则表达式分解和转换 IP 地址:

下面是利用正则表达式匹配 IP 地址,并将 IP 地址转换成对应数值的 Javascript 程序:

function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //
匹配 IP 地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}

不过上面的程序如果不用正则表达式,而直接用 split 函数来分解可能更简单,程序如下:

var ip="10.100.20.168"
ip=ip.split(".")
alert("IP
值是: "+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

匹配 Email 地址的正则表达式: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配网址 URL 的正则表达式: http://( [\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

利用正则表达式去除字串中重复的字符的算法程序: [ 注:此程序不正确,原因见本贴回复 ]

var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"") 
alert(s1+s2) //
结果为: abcefgi

这个方法对于字符顺序有要求的字符串可能不适用。

得用正则表达式从 URL 地址中提取文件名的 javascript 程序,如下结果为 page1

s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)

利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文: onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

用正则表达式限制只能输入全角字符:  onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

用正则表达式限制只能输入数字: onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

用正则表达式限制只能输入数字和英文: onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData

几个常用正则表达式:
('text',clipboardData.getData('text').replace(/[^\d]/g,''))" 
Email : /^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/,    
Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,    
Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,    
Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,    
IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,    
Currency : /^\d+(\.\d+)?$/,
Number : /^\d+$/,    
Zip : /^[1-9]\d{5}$/,    
QQ : /^[1-9]\d{4,8}$/,    
Integer : /^[-\+]?\d+$/,    
Double : /^[-\+]?\d+(\.\d+)?$/,    
English : /^[A-Za-z]+$/,    
Chinese :  /^[\u0391-\uFFE5]+$/,    
UnSafe :/^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,

posted @ 2006-06-05 22:40 蓝色Saga 阅读(233) | 评论 (0)编辑 收藏

     摘要: 正则表达式是一个描述字符模式的对象。 JavaScript 的 RegExp 对象和 String 对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法 .'***********************'              \\JavaScript//''***************...  阅读全文
posted @ 2006-06-05 22:37 蓝色Saga 阅读(686) | 评论 (0)编辑 收藏

JavaScript语法

什么是脚本程序和JavaScript

 *什么是脚本程序
 <html>
 <script language="javascript">
    alert(new Date());
 </script>
 </html>

 *JavaScript简介
  前身叫作Livescript,是一种基于对象(Object)和事件驱动(Event Driver),并具有安全性能的脚本语言.
 *JavaScript与Java
  是两个公司开发的两个不同产品,作用与用途大不一样,但两者语法上有很多相似之处,JavaScript并不是
  Java的子集.
 *JavaScript,JScript与ECMAScript
 *脚本代码的位置
  我们可以把代码放到<script></script>标签之间:
  <script>
    var x=3;
  </script>
  <p>This is a HTML 段落</p>
  <script>
    alert(x);
  </script>
  也可以放在一个单独的文件中:
  <html>
  <script src="script.js" language="javascript">
 *将脚本程序代码作为属性值
  <a href="javascript:alert(new Data());">javascript</a>
  </html>
=======================================================================================
JavaScript的基本语法

 *JavaScript中的标识符
 标识符是指JavaScript中定义的符号,例如,变量名,函数名,数组名等.标识符可以由任意顺序的
 大小写字母,数字,下划线(_)和美元符号($)组成,但标识符不能以数字开头,不能是JavaScript
 中的保留关键字.
 合法的标识符举例: indentifler,username,user_name,_username,$username
 非法的标识符举例: int,98.3,Hello World
 *Java严格区分大小写
 computer和Computer是两个完全不同的标识符
 *JavaScript程序代码格式
 每条功能语句的最后必须用分号(;)结束,每个词之间用空格,制表符,换行符或大括号,小括号这样
 的分隔符隔开.
 *JavaScript程序的注释
 /*...*/中可以嵌套"//"注释,但不能嵌套"/"...."/".

================================================================================
基本数据类型与常量

 *正型常量
 十六进制以Ox或OX开头,例如:Ox8a.八进制必须以O开头,例如: 0123.十进制的第一位不能为0
 (数字0除外),例如: 123
 *字符常量
 12.32,123.42,5E7,4e5等.
 *布尔值
 true和false.
 *字符串常量
 例如: "a book of JavaScript",'abc',"a",""(空字符串) .
 特殊字符需要用反斜杠(\)来转意.
 例如: \r, \n, \t, \b, \', \\
 在JavaScript中一个连续的字符串不能分开在两行中来写.可以使用"+"号连起来.
 *null常量
 表示变量的值为空
 *undefined常量
 表示一个变量还没有被复值时的状态,或某个对象的属性不存在.

=========================================================================================
变量

 *定义一个变量,系统就会为之分配一块内存,程序可以用变量名来表示这块内存中的数据.
 *声明变量用var关键字
 例如: var x; (这个时候就是undifeined)
 *声明变量的同时为其赋值
 例如: var name="lisi";
 *对已赋值的变量赋于一个其他类型的数据
 例如: name=123;
 *不事先声明变量而直接使用
 例如: x=1234;

算术运算符

 *+ 加法运算符或正值运算符,例如, x+5, +6.
  它还能实现多个字符串的想加,也能将字符串与其他的数据类型连成一个新的字符串,条件
  条件是该表达式中至少有一个字符串,例如: "x"+123的结果为"x123".
 *- 减法运算符或负预算符,例如, 7-3, -8.
 ** 乘法运算符,例如, 3*7.
 */ 除法运算符,例如 9/4.
 *% 求模运算符(算术中的求余),例如, 5%2
 *++将变量值加1后再将结果赋给这个变量,分为两种,例如a++和++a
 *--用法与++预算符一样
 

赋值运算符
 
  赋值运算符的作用是将一个值赋给一个变量,最常用的是"=",还可以由"="运算符和其他的一些
  预算符组合成新的运算符,例如:
  "+=","-="等.

比较运算符

  *>大于
   当左边的操作数大于右边的操作数时,返回true.
  *<小与
  *=
  *<=
  *>=
  *==
  *!=
  注意: 不要把"=="写成"="

逻辑运算符
 
  *&&
  逻辑与,当左右两边的操作数都为true时,返回值为true,否则为false.
  *||
  逻辑或,当左右两边的操作数都为false时,返回值为false,否则为true.
  *!
  逻辑非,当操作数为ture的时,返回值为false,否则为true.

========================================================================
程序流程控制
 
 *顺序结构
 *if条件选择语句
 *switch选择语句
 *while循环语句
 *do while语句
 *for循环语句
 *break与continue语句

 if条件语句语法1:
 if(条件语句)
 {
   执行语句块
 }
 注意:if(x==null)或if(typeof(x)=="undefined")可以简写成if(!x)
 if条件语句语法2:
 if(条件语句)
 {
   执行语句块1
 }
 else
 {
   执行语句块2
 }
 变量=布尔表达式? 语句1 :语句2
 if条件语句语法3:
 if(条件语句)
 {
   执行语句块1
 }
 else if(条件语句2)
 {
   执行语句块2
 }
 ....
 else if(条件语句块n)
 {
   执行语句块n
 }
 else
 {
   执行语句块n+1
 }
 if语句块的嵌套
 if(x<1)
 {
  if(y==1)
    alert("x<1,y==1");
  else
    alert("x<1,y!=1");
  }
  else if(x>10)
  {
    if(y==1)
      alert("x>10,y==1);
    else
      alert("x>10,y!=1");  
  }

===================================================================
函数
 
 *函数的作用与定义
 *全局变量与局部变量
 *参数个数可变的函数
 *创建动态函数
 *JavaScript中的系统函数

  定义一个函数的语法如下:
  function 函数名 (参数列表)
  {
     程序代码
     return 表达式;
  }
  对函数调用的几种方式:
  1.函数名(传递函数的参数1,传递给函数的参数2,.....)
  2.变量=函数名(传递函数的参数1,传递给函数的参数2,.....)
  3.对于有返回值的函数调用,也可以在程序中直接使用返回结果,例如:
  alert("sum="+square(2,3));

  全局变量与局部变量,看下面的代码:
  <script language="javascript">
   var msg="全局变量";
   function show()
   {
      msg="局部变量";
   }
   show();
   alert(msg);
  </script>

  参数个数可变的的函数:
 <script language="javascript">
  function testparams()
  {
    var params="";
    for(var i=0;i<arguments.length;i++)
    {
      params +=" "+ arguments[i];
    }
    alert(params);
  }
    testparams("abc",123);
    testparams(123,456,"abc");
 </script>
  注意:arguments代表了传递给函数的所有参数的所有集合。当函数的个数不确定,
  获得参数个数很多,你又不想为每个参数定义一个变量,那么你就可以定义一个
  像上面那个一样的,定义一个为空的参数名,在内部用循环来实现。
 创建动态函数的语法:
 var varName=new Function(argument1,....,lastArgument);
 说明:
 所有的参数都必须是字符串型的,最后的参数必须是这个动态函数的功能程序代码.
 例子:
 <script>
   var square=new Function("x","y",
            "var sum;sum=x*x+y*y; return sum;");
   alert(square(3,2));
 </script>
 动态函数有什么作用,在什么情况下使用?
 
 JavaScript中的系统函数:
 .encodeURI方法(比URL的描述的范围更大,一般情况下可以等同)
 返回一个URI字符串编码后的效果。例如:
 <script language="javascript">
   var uriStr=encodeURI("http://www.doit.org/index.html?country=中国&name=z x");
   alert(uriStr);
 </script>

 .decodeURI方法
 将一个已编码的URI字符串解码成最初的字符串并返回.
 .parseInt方法
  第一字符串按指定的进制转换成一个整数,语法格式为:parseInt(numString,[redix])。
  如果没有指定第二个参数,则前缀为'Ox'的字符串被视为十六进制,前缀为'O'的字符串
  被视为八进制,所有其他的字符串被视为十进制。
  例如: alert(parseInt("123abc",10));
 .parseFloat方法
  将一个字符串转换为小数。
 .isNaN方法(用与检测)
 .escape方法(用于对文本的简单加密)
  返回对一个字符串进行编码后的结果字符串。所有空格,标点,重音符号以及任何其他
  ASCII字符都用%xx编码替换,其中xx等于表示该字符的Unicode编码的十六进制数,字符
  值大于255字符以%uxxxx格式表示。
 .unescape方法
  将一个用escape方法编码的字符串解码成原始字符串。
 .eval方法
  将其中的参数字符串作为一个JavaScript表达式执行。

=======================================================================
  对象
 *对象与对象实例
 *构造方法与this关键字的作用
 *在函数中修改参数值的问题

 对象与对象实例
 .对象中所包含的变量就是对象的属性,对象中所包含的对属性进行操作的函数就是对象的
  方法,对象的属性和方法都叫对象的成员。
 .对象是某一类事物的描述,是抽象的概念;而对象实例是一类事物中的具体个例。
 .能够被用来创建对象实例的函数就是对象的构造函数,只要定义一个对象的构造函数,就
  等于被定义了一个对象。使用new关键字和对象的构造函数就可以创建对象实例,语法格式
  如下: var ObjectInstance = new ObjName(传递给该对象的实际参数列表)。
  <script language="javascript">
  function Person()
  {
    //这是一个构造函数
  }
  var person1 = new Person();  //创建了一个实例变量(对象实例)
  person1.age = 18;
  person1.name = "blovesaga"; //age和name为对象属性
  //alert(person1.name+"."+person1.age);
  function sayFunc()
  {
    alert(person1.name+"."+person1.age);//我们也可以使用person["age"](对象实例["成员变量"])来访问
  }
  person1.say=sayFunc;  //把方法名赋值给了person1.say成员,我们可以在其他地方像
                        //调用方法一样来调用
  person1.say();
  </script>

看下面的例子:
<html>
 <script language="javascript">
   //定义一个构造函数,也就是对象的名称为person
   function Person()
   {
   }
   //创建一个对象实例
   var person1=new Person();
   person1.age=18;
   person1.name="zxy";
   //编写一个成员方法
   function sayFunc()
   {
      var x="name";
      eval("alert(person1."+ x + ");");  //这个字符串中的内容将被作为JavaScipt代码来执行
      alert(person1.name+":"+person1.age);
   }
   person1.say=sayFunc; //把方法名赋值给了person1.say成员
   person1.say=sayFunc(); //写了括号表示执行sayFunc()函数在复值
   person1.say();
 </script>
</html>

===================================================================
构造方法与this关键字

 .为一个对象实例新增加的属性和方法,不会增加到同一个对象所产生的其它对象实例上。
 .所有的实例对象在创建都会自动调用构造函数,在构造函数中增加的属性和方法会被
  增加到每个对象实例上。
 .对象实例是使用new关键字创建的,在构造方法中不要有返回结果的return语句。
 .调用对象的成员方法时,需要使用“对象实例.成员方法"的形式,很显然,用作成
  员方法的函数被调用,一定伴随有某个对象实例。this关键字代表某个成员方法执行时
   ,引用该方法的当前对象实例,所以,this关键字一般只在用作对象成员方法的
  函数中出现。
  <script language="javascript">
   function Person(name,age)
   {
     this.age=age;
     this.name=name;
     this.say=sayFunc;
   }
   function sayFunc()
   {
      alert(this.name+":"+this.age);
   }
   var person1=new Person("张山",18);
   person1.say();
   var person2 = new Person("里四",30);
   person2.say();
  </script>
例子代码:
<html>
 <script language="javascript">
   //定义一个构造函数
   function Person(name,age)
   {
     this.name=name;//当前的对象实例增加一个成员变量name,成员变量的通过Person()参数name传递进来
     this.age=age;//当前的对象实例增加一个成员变量age,成员变量的通过Person()参数age传递进来
     this.say=sayFunc; //增加一个sayFunc()函数
   }
   function sayFunc()
   {
     alert(this.name + ":" + this.age);
   }
   //创建一个对象实例
   var person1=new Person("张三",18);
   person1.say();  //调用person1的say()成员方法
   var person2=new Person("李四",29);
   person2.say();  //调用person2的say()成员方法
 </script>
</html>

=====================================================================
在函数中修改参数值的问题

 将基本数据类型的变量作为函数参数传递的情况:
 <script language="javascript">
  function changeValue(x)
  {
    x=5;
  }
  var x=3;
  changeValue(x);
  alert(x);
 </script>
注意: 在函数changeValue(x)中的x=5并不能修改主程序中的x值,函数接受的参数
就相当于一个局部变量,当函数调用完也就没用了。所以该程序的结果为x=3;如果
我们把一个对象的实例传递给函数,而我们有在函数中修改了对象实例的属性,那么
最后的结果也会变化的。

posted @ 2006-06-05 22:34 蓝色Saga 阅读(258) | 评论 (0)编辑 收藏

仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页