他是静态还是动态?

    接着上篇,虽然如是说 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>
 

   动态语言不需要写很多类型安全代码,代码量少、设计巧妙;

   静态语言结构清晰规范,方便调试,适用于新手开发,但是代码量大,不便于阅读、维护;


编译时

    动态编译

      动态编译的可执行文件要附带动态链接库,在执行时需要调用对应动态链接库中的命令,这样一方面缩小了可执行文件本身的体积、加快了编译速度、节省系统资源,另一方面很简单的程序,即使只用到了链接库中一两条命令也要附带一个相对庞大的链接库,如果没有安装对应的运行库,则该文件不能运行。

   静态编译 :

     编译器在编译可执行文件的时候就将可执行文件需要调用的部分(动态链接库(.so或.lib)中的部分)提取出来 链接到可执行文件中去,这样可执行文件在运行时就不依赖于动态链接库了,优缺点和动态编译的可执行文件互补。
PS:

    编译时:

     编译器把源代码翻译成机器能识别的代码,就想老师检查学生作业有没有错别字和病句一样,如果发现错误则提示(编译时错误)

    运行时:

     代码跑起来被装载到内存中去,运行时检查则是在内存只能做些操作、判断

变量:

   静态变量:

     在定义时有static修饰,静态变量原理是共享数据段,只要没有进行“写入”操作一般是不会产生问题的,但是数据通常是用于“读写”操作,所以使用静态变量要注意。

      静态局部变量

          无显式初始化时默认初始化值为0;
          作用域当前函数,定义位置到所在{}结束位置;
          生命周期从程序运行到程序退出,贯穿整个运行期间;
          当下次函数调用时,该变量不会被再次初始化,沿用上次函数退出时的值;

      静态全局变量:

         无显式初始化时默认初始化值为0;
         作用域为当前文件,从定义/声明位置到文件结尾; 
         生命周期从程序运行到程序退出,贯穿整个运行期间;
         只在定义该变量的源文件内部有用,同一程序其他文件不能使用;
         只初始化一次,防止其他源文件调用 PS全局变量可以在其他源文件中初始化;
              

  动态变量:

     没有static修饰(是不是废话~~)

     动态局部变量

         作用域当前函数
         生命周期从函数调用到函数退出
         无显式初始化时默认初始值为随机值

     动态全局变量:

         作用域整个项目,最终编译成可执行文件的所有文件中均可以使用
         生命周期从程序运动到退出,贯穿整个运行时间,无显式初始化时默认初始值为0;

方法:

   静态方法

      类方法前加了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
 
     
     静态方法在编译时把静态方法和类的引用类型进行匹配,而不是在运行时 与类引用进行匹配(这里不是很明白?最关键的地方掉了链子(⊙﹏⊙)b)——在子类中创建的静态方法 并不会覆盖父类中相同名字的静态方法,这个和上一篇 想了想 应该是不一样的 

总结:

   上个酸菜

                                       

            

                  thanks for your time(*^__^*)  

感谢下面大牛们的分享:

变量

静态编译
什么叫编译时和运行时
“静态语言”与“动态语言”
 静态方法与非静态方法的区别 
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值