• Java知识点总结1


    1.java的引用传递和值传递

              当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 

             答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。

           Java参数,不管是原始类型(char byte short int long float double boolean)还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。

            如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
            如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。   

    2.代码块的执行顺序

    (1)普通代码块:就是类中方法的方法体 
      public void xxx(){ 
          //code 
      } 
    (2)构造块:用{}裹起来的代码片段,构造块在创建对象时会被调用,每次创建对象 
            时都会被调用,并且优先于类构造函数执行。 


         //code 
      } 
    (3
    )静态块:用static{}裹起来的代码片段,只会被执行一次(第一次加载此类时执行,比如说用Class.forName("")加载类时就会执行 static  block),静态块优先于构造块执行。如果某些代码必须要在项目启动时候就执行的时候,我们可以采用静态代码块,这种代码是主动执行的。静态代码块可以用来初始化一些项目最常用的变量和对象。
      static{  
         //code 
      } 

    (4)同步代码块:使用synchronized(obj){}裹起来的代码块,在多线程环境下,对共享数据进行读写操作是需要互斥进行的,否则  会导致数据的不一致性。常见的是synchronized用来修饰方法,其语义是任何线程进入synchronized需要先取得对象锁 如果被占用了,则阻塞,实现了互斥访问共享资源。而synchronized也是有代价的。 

        一个常见的场景是,一个冗长的方法中,其实只有一小段代码需要访问共享资源,这时使用同步块,就只将这小段代码裹在synchronized  block,既能够实现同步访问,也能够减少同步引入的开销。 

        synchronized(obj){ 
           //code 
        } 

           执行顺序:静态代码块>静态函数(不调用时不显示,先加载进来)>主函数>构造代码块>构造函数>普通代码块对于继承关系而言。先执行构造链上的所有静态代码块,再依次按照非静态代码块的顺序,执行继承链上非静态代码块。

          对于类体内部生成对象的情况,静态代码块第一次加载时执行,即仅仅会在最外侧执行。

    <span style="font-size:18px;">public class  test
    {
        public static test t1 = new test();
        public static test t2 = new test();
        public test(){
        	System.out.println("构造块1");
        }
        {
            System.out.println("构造块2");
        }
        static
        {
            System.out.println("静态块");
        }
        public static void main(String[] args)
        {
            test t = new test();
        }
    }</span>

    输出如:

    构造块2
    构造块1
    构造块2
    构造块1
    静态块
    构造块2
    构造块1
    false


    3.向上转型和向下转型

    向上转型:子类对象给父类引用,类型提升,动物x=new猫;

    向下转型:父类的引用指向自己子类类型,强制转换;动物x=new 猫 ,猫y=(猫)x

    但是不能将父类的对象转换成子类类型,动物x=new 动物  猫 y=(猫)x

    多态自始至终都是子类对象在做改变。

    4.方法调用

    (1)super和this.

    Super:

    a:子类的普通方法可以调用父类的普通方法。

    b:子类的构造方法可以调用父类的普通方法。

    c:子类构造方法可以调用父类构造方法。

    This:

    a:全局变量和局部变量重名时,必须用。

    b:构造方法可以调用普通方法。

    c:普通方法可以调用普通方法。

    d.子类构造方法可以调用子类其他的构造方法。


    5.多态

             实现多态三个必要条件:继承(要不实现),重写、向上转型。当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

            对于成员变量和静态函数。无论编译和运行,都参考左边(引用变量所属的类)

            但是对于非静态函数成员函数。简单总结:成员函数在多态调用时编译看左边,运行看右边。编译时仅仅检查子类引用类型是否有该成员函数,并不检查所引用的对象是否具有。运行时才会具体检查。


    6.常用的数组赋值方法

    System.copy(source,sStart,dest,dStart,size);


    7.instanceof

           java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例


    8.变量赋值问题

          Java中的final变量只能由final变量的表达式赋值。非final变量不能由同时包含final和非final变量的表达式赋值。


  • 相关阅读:
    UnityShaderVariant的一些探究心得
    NGUI在使用AssetBubble 出现材质丢失错误的情况
    [转] unity调试lua工具和方法
    各种文件的mime类型
    Javascript 随机数
    jQuery文字上下滚动
    Asp.Net Color转换
    Asp.Net 清除Html标签
    jQuery Ajax实例
    Asp.Net Cookie用法
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5392983.html
Copyright © 2020-2023  润新知