本文目錄一覽:
- 1、靜態方法和實例方法的區別
- 2、類實例方法,靜態方法的使用與區別
- 3、javascript中什麼時候用靜態方法什麼時候用實例方法,規則是什麼,各好在哪兒?
- 4、類方法、實例方法和靜態方法的區別
- 5、js代碼如何封裝
- 6、js公有,私有,靜態屬性和方法的區別
靜態方法和實例方法的區別
靜態方法和實例方法的區別主要體現在兩個方面:
在外部調用靜態方法時,可以使用”類名.方法名”的方式,也可以使用”對象名.方法名”的方式。而實例方法只有後面這種方式。也就是說,調用靜態方法可以無需創建對象。
靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問實例成員變數和實例方法;實例方法則無此限制。
下面幾個例子展示了這一區別。
1、調用靜態方法示例。
//———–hasStaticMethod.java—————–
public class hasStaticMethod{
//定義一個靜態方法
public static void callMe(){
System.out.println(“This is a static method.”);
}
}
下面這個程序使用兩種形式來調用靜態方法。
//———–invokeStaticMethod.java—————–
public class invokeStaticMethod{
public static void main(String args[]){
hasStaticMethod.callMe(); //不創建對象,直接調用靜態方法
hasStaticMethod oa = new hasStaticMethod(); //創建一個對象
oa.callMe(); //利用對象來調用靜態方法
}
} 程序兩次調用靜態方法,都是允許的,程序的輸出如下:
This is a static method.This is a static method.
允許不創建對象而調用靜態方法,是Java為了減少程序員調用某些常用方法時的麻煩,而允許程序員按照傳統的C語言中使用函數的方式來使用方法。典型的例子是前面某些程序中使用”Math.ramdon()”來獲取隨機數。
還有一個很典型的代表就是數組的處理工具Arrays
2、靜態方法訪問成員變數示例。
//———–accessMember.java—————–
class accessMember{
private static int sa; //定義一個靜態成員變數
private int ia; //定義一個實例成員變數
//下面定義一個靜態方法
static void statMethod(){
int i = 0; //正確,可以有自己的局部變數sa = 10;
//正確,靜態方法可以使用靜態變數
otherStat();
//正確,可以調用靜態方法
ia = 20; //錯誤,不能使用實例變數
insMethod(); //錯誤,不能調用實例方法
}
static void otherStat(){}
//下面定義一個實例方法
void insMethod(){
int i = 0; //正確,可以有自己的局部變數
sa = 15; //正確,可以使用靜態變數
ia = 30; //正確,可以使用實例變數
statMethod(); //正確,可以調用靜態方法
}
}
本例其實可以概括成一句話:靜態方法只能訪問靜態成員,實例方法可以訪問靜態和實例成員。之所以不允許靜態方法訪問實例成員變數,是因為實例成員變數是屬於某個對象的,而靜態方法在執行時,並不一定存在對象。同樣,因為實例方法可以訪問實例成員變數,如果允許靜態方法調用實例方法,將間接地允許它使用實例成員變數,所以它也不能調用實例方法。基於同樣的道理,靜態方法中也不能使用關鍵字this。
main()方法是一個典型的靜態方法,它同樣遵循一般靜態方法的規則,所以它可以由系統在創建對象之前就調用。
希望多多交流,多多關注,共同成就夢想
類實例方法,靜態方法的使用與區別
靜態方法是用來操作這個類型的,方法被該類的所有實例共享。
而實例方法用來操作單個實例,不被該類所有實例共享。
靜態方法中不能調用實例方法,也不能訪問實例變數。
實例方法可以調用靜態方法,也能訪問靜態變數。
總之靜態方法對應的是類型,即Class,類。但是實例方法對應的是實例,即object,對象。
javascript中什麼時候用靜態方法什麼時候用實例方法,規則是什麼,各好在哪兒?
script type=”text/javascript”
/*一、靜態方法和屬性( 類、方法、屬性都為靜態類型; 不能創建實例訪問)*/
var staticFunc = function(){};
staticFunc.today = new Date(); //添加靜態屬性
staticFunc.weather = “sunny”;
staticFunc.show = function(){ //添加靜態方法
alert(this.today + ” weather is ” + this.weather);
};
staticFunc.show(); //靜態方法和屬性直接訪問,不能通過實例訪問
alert(staticFunc.today + ” is ” + staticFunc.weather);
//new staticFunc().show(); //這裡對staticFunc實例化會導致錯誤,如下圖
//alert(new staticFunc().today); //這裡也會發生同樣的錯誤
/*二、普通對象,同時擁有靜態和非靜態屬性、方法
(可以用實例化 * 注意:1.靜態方法/屬性使用類名訪問 2.非靜態方法/屬性使用實例名訪問 )*/
function Person(name){
this.name = name; //非靜態屬性
this.showName = function(){ //添加非靜態方法(添加到「類」的實例上)
alert(“my name is ” + this.name + “.”);
}
Person.run = function(){ //添加靜態方法(直接添加到「類」上)
alert(“I am runing… …”);
}
}
/*通過prototype關鍵字添加非靜態屬。每個人的愛好可能不一樣
【1.具有相同的行為就用靜態方法或屬性,如人類都有一張嘴;2. 具體到每個「類」的每個實體,如每個人的興趣愛好可能不一樣,就用實例方法或屬性】*/
Person.prototype.hobby = “movie,music,programming,reading.”;
//添加靜態屬性
Person.hand = 2;
var me = new Person(“zhangsan”);
//非靜態方法或屬性必須通過實例來訪問
me.showName();
alert(“my hobby has ” + me.hobby);
//靜態方法必須通過「類」來訪問
Person.run();
alert(“I have ” + Person.hand + ” hands.”);
/script
類方法、實例方法和靜態方法的區別
類方法:
1.類方法只能訪問『類變數』的方法
2.類方法需要使用@classmethod裝飾器定義
3.類方法的第一個參數是類實例,約定寫為cls
說明:
類(實例)和對象(實例)都可以調用類方法,類方法不能調用實例變數
靜態方法:@staticmethod
1.靜態方法是普通函數,靜態方法定義在類的內部,只能憑藉該類或實例調用。
2.靜態方法需要使用@staticmethod裝飾器定義
3.靜態方法寫普通函數定義相同,不需要傳入self和cls參數
說明:
類和實例都可以調用靜態方法
靜態方法不能訪問類變數和實例變數
js代碼如何封裝
1. 定義js類
js並不是一種面向對向的語言, 沒有提供對類的支持, 因此我們不能像在傳統的語言里那樣 用class來定義類, 但我們可以利用js的閉包封裝機制來實現js類, 我們來封裝一個簡的Shape類.
代碼如下:
function ShapeBase() {
this.show = function(){
alert(“ShapeBase show”);
};
this.init = function(){
alert(“ShapeBase init”);
};
}
這個類里定義了兩個方法:show和init, 需要注意的是這裡用到了this來聲明, 而不是var, 因為用var是用來定義私有方法的.
另外, 我們還可以用prototype屬性來定義Shape的方法.
代碼如下:
ShapeBase.prototype.show=function()
{
alert(“ShapeBase show”);
}
ShapeBase.prototype.init=function()
{
alert(“ShapeBase init”);
}
上面這種寫法看起來不太直觀,我們可以將所有的方法寫在一起.
代碼如下:
ShapeBase.prototype={
show:function(){
alert(“ShapeBase show”);
},
init:function() {
alert(“ShapeBase init”);
}
};
現在, 類是寫好了, 讓我們寫個js來測試下, 看看結果是不是跟我們想像的一樣呢?
代碼如下:
function test(src){
var s=new ShapeBase();
s.init();
s.show();
}
看到了吧, 其調用方式和C#一模一樣, 而結果也如我們所料.
到目前為止, 我們學會了如何創建js的類了, 但還只是實例方法,要是實現跟C#中的靜態方法要怎麼做呢?
其實, 實現js的靜態方法很簡單, 看下面如何實現:
代碼如下:
//靜態方法
ShapeBase.StaticDraw = function()
{
alert(“method draw is static”);
}
2. 實現JS類抽象和繼承
同樣, js中也不支持類繼承機制,但我們可以通過將父類prototype中的成員方法複製到子類的prototype中來實現.
和類的繼承一樣,JavaScript也沒有任何機制用於支持抽象類.但利用JavaScript語言本身的性質.可以實現自己的抽象類.
首先來看看js中的虛方法, 在傳統語言中虛方法是要先定義的, 而包含虛方法的類就是抽象類,不能被實例化,而在JavaScript中,虛方法就可以看作該類中沒有定義的方法,但已經通過this指針使用了.
和傳統面向對象不同的是,這裡虛方法不需經過聲明,而直接使用了, 並且類也可以被實例化.
先定義object的extend方法, 一個為靜態方法,一個為實例方法, 這兩個方法用於實現繼承的prototype複製
代碼如下:
Object.extend = function(destination, source) {
for (property in source) {
destination[property] = source[property];
}
return destination;
}
Object.prototype.extend = function(object) {
return Object.extend.apply(this, [this, object]);
}
接下來我們實現一個繼承類Rect, 這裡先用一種簡單的方法來實現。
代碼如下:
function Rect() { }
Rect.prototype = ShapeBase.prototype; //只這一句就行了
//擴充新的方法
Rect.prototype.add=function() {
alert(“Rect add”);
}
這種方法不能用於重寫,如果改變了show方法, ShapeBase的show也會指向同一函數可能是由於prototype賦值只是簡單的改變指向地址.
如果上面也定義了:
Rect.prototype.show=function() {
alert(“Rect show”);
}
那麼執行結果如下:
function test(){
var s=new ShapeBase();
s.show(); //結果:Rect show
var r=new Rect();
r.show(); //結果:Rect show
r.add();
}
我們再使用object.extend實現繼承, 並實現一個oninit虛方法, 修改ShapeBase如下:
代碼如下:
ShapeBase.prototype={
show:function()
{
alert(“ShapeBase show”);
},
initialize:function () {
this.oninit();
}
};
實現Rect類繼承.
代碼如下:
Rect.prototype=(new ShapeBase).extend({
//添加新的方法
add:function() {
alert(“Rect add”);
},
//使用這種方法可以重寫show方法
show:function() {
alert(“Rect show”);
},
//實現虛方法
oninit:function() {
alert(“Rect oninit”);
}
})
js公有,私有,靜態屬性和方法的區別
html
head
titleJavaScript 對象方法 類方法 原型方法的區別;私有屬性 公有屬性 公有靜態屬性的區別/title
script language=”javascript” type=”text/javascript”
//定義Person類
function Person(name){
//私有屬性MyTime、ID
var MyTime = ” 2010-12-12″;
var ID=”773C0D35-298A-4660-B803-9EADC250ED61″;
//公有屬性MyName
this.MyName = name;
//對象方法(實例化後才能調用) 位置:Person類的內部 語法格式:this.方法名稱 = function([參數…]){ 語句行; }
this.ShowMyName = function() {
alert(“My name is ” + this.MyName + MyTime );
}
//this.Init();
}
//類方法(實際是靜態方法直接調用) 位置:Person類的外部 語法格式:類名稱.方法名稱 = function([參數…]){ 語句行; }
Person.EnglishandFrench = function() {
//訪問靜態屬性 語法格式:類名稱.公有靜態屬性;或者使用語法格式:this.公有靜態屬性;
alert(Person.NAME + ” can speak ” + this.ENGLISH +” and “+ Person.prototype.FRENCH);
}
//原型方法(實例化後調用或者直接調用) 位置:Person類的外部 語法格式:類名稱.prototype.方法名稱 = function([參數…]){ 語句行; }
Person.prototype.ChineseandFrech = function() {
//編寫一個原型方法相當擴充了一個對象方法,稍作變化可複製到類的內部成為一個對象方法;
//訪問公有屬性 語法格式:this.公有屬性;
//訪問公有靜態屬性 語法格式:類名稱.公有靜態屬性;
alert(this.MyName + ” can speak ” + Person.CHINESE + ” and ” + this.FRENCH+”, “+ Person.prototype.FRENCH +” do better.”);
}
//只有原型方法執行後內部擴充到Person類的屬性才能生效
Person.prototype.Init = function() {
//定義公有屬性PersonNo
this.PersonNo = “”;
//定義公有數組屬性 [] 等價於 new Array();它現在是幾維數組或是混合數組要根據賦值後才知道
this.ArrInfo = [];
//定義一個json對象屬性
this.jsonData = {};
}
//公有靜態屬性 位置:Person類的外部
Person.NAME=”Jack”;
Person.ENGLISH=”in english”;
Person.CHINESE=”in chinese”;
//原型屬性(當作公有靜態屬性使用 語法格式:類名稱.prototype.公有靜態屬性;不能使用語法格式:this.公有靜態屬性;)
//原型屬性(當作公有屬性使用 語法格式:類名稱.prototype.公有屬性; 或者使用語法格式:this.公有屬性;)
Person.prototype.FRENCH=”in french”;
var p = new Person(“Rose”);//實例化
p.ShowMyName();
Person.EnglishandFrench();
p.ChineseandFrech();
//ChineseandFrech()當作靜態方法直接調用,請注意 MyName是對象屬性 原型方法內不能調用它
//當作靜態方法直接調用時內部成員必須都是靜態屬性,下面這樣調用是錯誤的;
Person.prototype.ChineseandFrech();
//使用this.Init();這行代碼放在定義Person類內部也一樣初始化
p.Init();
p.PersonNo = “A1B2C3”;
alert(p.PersonNo);
p.ArrInfo[0]=’123′;
alert(p.ArrInfo[0]);
p.ArrInfo[1]=[“111″,”222″,”333”];
alert(p.ArrInfo[1][2]);
p.jsonData = { flash_url : “../swfupload/swfupload.swf”,
custom_settings : {
upload_target : “divFileProgressContainer”
},
debug: false };
alert(p.jsonData.flash_url+” “+p.jsonData.custom_settings.upload_target);
/script
/head
body
divE-mail:zhengzizhi@yahoo.com.cn/div
div盡量將方法定義為原型方法,原型方法避免了每次調用構造函數時對屬性或方法的構造,節省空間,創建對象快./div
/body
/html
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/306997.html