接着上篇,虽然如是说 but这两篇耦合度还是蛮低的;OK、看了标题大家应该知道我要写什么了吧?不知道也没关系,因为接下来你就know了,静态与非静态,下面让我们一起走向静态的world。
静与动
静态语言(statically Typed Language):
在运行前编译时检查类型,写代码时没有声明变量、必须指定类型;在非静态内部类中不可以声明静态成员。
动态语言(Dynamicall Typed Language):
运行期间检查数据的类型语言。在赋值时得到数据类型,运行过程中可以改变数据类型的结构,对象的函数,变量可以被修改删除;
function add(a,b){//动态语言
return a+b;
}
add(1,2);
add('1',2);
//静态语言,<span style="font-family: KaiTi_GB2312;">指定类型</span>
public int add(int a,int b)
{
return a+b;
} </span></span></span></span>
动态语言不需要写很多类型安全代码,代码量少、设计巧妙;
静态语言结构清晰规范,方便调试,适用于新手开发,但是代码量大,不便于阅读、维护;
编译时:
动态编译
静态编译 :
编译时:
运行时:
变量:
静态变量:
静态局部变量:
静态全局变量:
动态变量:
动态局部变量:
动态全局变量:
方法:
静态方法:
类方法前加了static关键字,则该方法为静态方法,属于类本身;其与静态变量始终使用同一块内存,通常一些不经常变化而频繁使用的数据(连接字符串、配置信息)使用该尤物,原理就是共享代码段,共享代码段是给CPU作为“读取”用的,可以放心使用,除非进行恶意“修改”运行时的代码段;
静态方法其在内存中的代码段会随类的定义而被分配和装载,在引用静态方法时,可以使用对象名加前缀,也可以使用类名加前缀;静态内部类不能访问其外部类的非静态成员变量和方法;静态方法中main方法,作为程序运行的入口点,在每个程序中有且只能有一个——only one;静态方法不能被覆盖;
非静态方法
属于具体对象,当这个对象创建时,在对象内存中会拥有此方法的专用代码段;
可以访问静态数据成员,也可以访问非静态数据成员,也可以访问非静态方法,(向无私的静态方法致敬)
(转:)
public class Person{
public int age;
public static double height;
public static String Address(String x){
System.out.println("address:"+x);
}
public int Birthday(int x){
System.out.println("birthday is "+x+" month");
}
public static void main(String[] args){//静态方法
age=24; //引用了非静态数据成员
height=173;
Address("xi'an");
Birthday(5); //引用了非静态方法
}
}
编译时会出现无法从静态上下文中引用非静态变量age和非静态方法Birthday(int)的错误,解析上面红字标注之一。
class Parent{//基类
public void nonStaticMethod()//非静态方法
{
System.out.println("parent's Non-Static Method is Called");
}
public static void staticMethod()//静态方法
{
System.out.println("parent's static method is called");
}
}
class Child extends Parent{//派生类
public void nonStaticMethod()
{
System.out.println("child's non-static method is called");
}
public static void staticMethod()
{
System.out.println("child's static method is called");
}
}
public class Test
{
public static void main(String args[])
{
Parent p1 = new Parent();//实例
Parent p2 = new Child();/</span>/</span>实例
Child c = new Child();//实例
System.out.print("parent.static: "); Parent.staticMethod();
System.out.print("p1.static: "); p1.staticMethod();
System.out.print("p2.static: "); p2.staticMethod();
System.out.print("p1.nonStatic: "); p1.nonStaticMethod();
System.out.print("p2.nonStatic: "); p2.nonStaticMethod();
System.out.print("Child.static: "); Child.staticMethod();
System.out.print("c.static: "); c.staticMethod();
System.out.print("c.nonStatic: "); c.nonStaticMethod();
}
}
结果:
Parent.static: parent's static method is called
p1.static: parent's static method is called
p2.static: parent's static method is called
p1.nonStatic: Parent's Non-Static Method is Called
p2.nonStatic: child's non-static method is called
Child.static: child's static method is called
c.static: child's static method is called
c.nonStatic: child's non-static method is called
从结果中发现有什么不一样的地方吗?p2实际上是一个Child类型的引用 Parent p2 = new Child();在调用静态方法时执行的是父类的静态方法,调用非静态方法时执行的是Child非静态方法,
p2.static: parent's static method is called
p2.nonStatic: child's non-static method is called
总结:
thanks for your time(*^__^*)
感谢下面大牛们的分享:
静态编译
什么叫编译时和运行时
“静态语言”与“动态语言” 静态方法与非静态方法的区别