Java语言基础与面向对象编程实践问题总结

    1.描述Java的垃圾回收机制?
    答:在java编程中,当没有引用指向原先分配给某个对象的内存时,该内存便成为垃圾。同时Java虚拟机提供了一个系统级线程(垃圾回收器线程), 它自动追踪每块被分配出去的内存空间,自动释放被定义为垃圾的内存。
    2.为什么Java能实现目标代码级的平台无关性?
    答:-Java源代码被编译成字节码文件(.class后缀),这个字节码文件不是针对具体平台的,而是针对抽象的Java虚拟机的,在Java虚拟机上运行;
        -在不同的平台上会安装不同的Java虚拟机,这些不同的Java虚拟机屏蔽了各个不同平台的差异,从而使Java程序(字节码文件)具有平台无关性。
    3.Java语言的主要特点?
    答:-简单的;
        -面向对象的;
        -分布式的;
        -健壮的;
        -安全的;
        -平台无关的;
        -可移植的;
        -解释型的;
        -高性能的;
        -多线程的;
        -动态的。
    4.Java变量命名规则?
    答:Java对各种变量、方法和类等要素命名时使用的字符序列称为标识符;
          Java标识符有如下命名规则:
                -标识符由字母、数字、下划线"_"、美元符号"$"组成,并且首字母不能是数字;
                -不能把Java关键字作为标识符;
                -标识符没有长度限制;
                -标识符对大小写敏感。
               -对于变量和方法名,要求第一个单词应以小写字母作为开头,后面的每个单词则都要以大写字母开头,例如stuAge、sendMessage;
                -对于类名,它和变量名、方法名的区别在于,第一个单词的首字母也需要大写,如果类名称中包含单词缩写,则这个缩写词的每个字母均应大写,例如XMLModule;
                -常量标识符应该都使用大写字母,并且指出该常量完整的含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词,例如MAX_VALUE。
    5.Java有哪些基本数据类型?
    答:-基本数据类型:
            -数字型:
                -整数类型:(十进制、八进制以0开头和十六进制以0X或0x开头)-(默认是int型)
                    -byte:(8bit)
                    -short:(16bit)
                    -int:(32bit)
                    -long:(64bit)直接赋值时必须在数字后加上L或l;
                -浮点类型:(十进制形式(3.14)、科学计数法形式(3.14e2))-(默认是double型)
                    -float:(32bit)直接赋值时必须在数字后加上f或F;
                    -double:(64bit)
            -字符型:(使用单引号括起来的单个字符,'a'、'汉'、'\u0061'(十六进制)、特殊字符('\t'制表符,'\n'-换行符,'\r'-回车符等))
                -char:(16bit)使用Unicode编码(2个字节),可存汉字(一个汉字也是占2个字节);
            -布尔型:(不可用0或非0的整数替代true和false,这点和C语言不同)
                -boolean:true/false
        -引用数据类型:
            -类:
                -class:
            -接口:
                -interface:
            -数组:
    6.Java中的数据类型转换的注意事项?
    答:-基本数据类型转换:
                -boolean类型不可以和其他数据类型相互转换;
                -容量小的类型自动转换成容量大的数据类型;
                -byte、short、char之间不会互相转换,三者在计算时首先会转换为int类型;
                -容量大的数据类型转换为容量小的数据类型时,需要加上强制类型转换符,但可能造成精度降低或溢出,使用时需要格外注意;
                -有多种类型的数据混合运算时,系统首先自动进行容量大的数据转换,然后再进行计算。
        -字符串与其他数据类型转换:
        
        -其他实用数据类型转换:
        
    7.Java的字符型可以存放汉字吗?
    答:字符常量为用单引号括起来的单个字符,因为Java使用Unicode编码,一个Unicode编码占2个字节,一个汉字也是占2个字节,所以Java中字符型变量可以存放一个汉字。
    8.成员变量与局部变量的区别?(基本数据类型的默认初始值为0、0.0、'\u0000'和false)
    答:-成员变量是在类的内部、方法的外部(含语句块)外部定义的变量,其作用域从变量定义位置起到类结束(在Java中,声明的成员变量可以不赋初始值);
        -局部变量是在方法(含语句块)内部定义的变量(包括形参),其作用域从变量定义位置起到方法(含语句块)结束(如果声明局部变量必须赋初始值);
        -对于JAVA而言,类的外部不能有变量的声明。
    9.Java环境配置?
    答:-JAVA_HOME:JDK的安装路径(路径名);
        -PATH:Windows系统执行命令时要搜索的路径(在最前面加上%JAVA_HOME%\bin;);
        -CLASSPATH:编译和运行时要找的class路径(.%JAVA_HOME%\lib)(其中.代表当前路径)。
    10.Java关键字总结(关键字不能用作变量名、方法名、类名和包名):
    答:    abstract        assert        boolean        break        byte
            case            catch        char        class        continue
            default            do            double        else        enum
            extends            final        finally        float        for
            if            implements        import        instanceof    int
            interface        long        native        new            package
            private            protected    public        return        strictfp
            short            static        super        switch        synchronized
            this            throw        throws        transient    try
            void            volatile    while
    11.运算符和表达式?
    答:-表达式:符合一定语法规则的运算符和操作数的组合,单个操作数也是表达式;
            -表达式的值:对表达式中的操作数进行运算得到的结果;
            -表达式的类型:表达式的值的数据类型即为表达式的类型。
        -运算符:(单目运算符、双目运算符和三目运算符)
            -算术运算符:+、-、*、/、++、--、%
            -关系运算符:>、<、>=、<=、==、!=
            -赋值运算符:=、+=、-=、*=、、=等
            -逻辑运算符:!、&&、||等
            -位运算符:~、&、|、>>、<<、>>>(无符号右移)
        -运算符的优先级:(Java表达式按照运算符的优先级从高到低的顺序进行运算,优先级相同的运算符按照事先约定的结合方向进行运算)
            (1)    ()    []
            (2)    !    +(正)    -(负)    ~    ++    --
            (3)    *    /        %
            (4)    +(加)    -(减)
            (5)    <<        >>        >>>
            (6)    <        <=        >=        instanceof
            (7)    ==        !=
            (8)    &(按位与)
            (9)    ^
            (10) |
            (11) &&
            (12) ||
            (13) ?:
            (14) =    +=    -=    /=    *=    %    =    &=    ^=    ~=  <<=      >>=     >>>=
    12.break与continue语句的区别?
    答:-使用break语句是跳出循环执行循环之后的语句;
        -continue语句是中止本次循环继续执行下一次循环。
    13.请介绍"=="和"="的区别?
    答:-"=="是关系运算符,用来判断两边的操作数是否相同;
        -"="是赋值运算符,将该运算符右边的值或表达式赋值给运算符左边的变量。
    14.switch语句对应的表达式可以是哪些类型?
    答:byte、short、int和char(在JDK7.0中表达式的值可以是String)
    15.在使用switch语句时,如果在case语句后面忘了加break,会出现什么样的结果?
    答:当根据条件进入到某一个case分支后,没有break会继续向下执行语句而不用判断是否满足条件,直到执行break出现跳出switch代码块。
    16.什么是方法?使用方法的好处?方法声明的语法?方法的递归调用?递归调用的问题?
    答:-方法是Java中一个命名的代码块,通常是为了完成特定的功能,把程序中特定的代码块组合在一起而构成的。
            或是指为获得某种东西或达到某种目的而采取的手段与行为方式,即方法是定义某种行为(或功能);
         -其主要的好处是:一个是可以重用;另一个是使程序结构更加清晰。
         -Java中的方法的声明的语法形式如下:
                    [修饰符]  返回值类型  方法名([形参列表]){
                                方法体
                    }
                    -修饰符:用来规范方法的一些特征;
                    -返回值类型:表示该方法的返回值类型;
                    -方法名:必须符合标识符的命名规则,并且能够望文知义;
                    -形参列表:参数用来接收外界传来的信息,可以是一个或多个,也可以没有参数,但无论是否有参数,都必须有小括号;
        -方法的递归调用:指一个方法在它的方法体内调用它自身,在递归调用中,主调方法同时也是被调的方法。执行递归方法反复调用它自身,每调用一次就再次进入一次本方法;
        -递归调用的问题:如果递归调用没有退出的条件,则递归方法将无休止地调用其自身,这显然是不正确的。为了防止递归调用无休止地进行,必须在方法内终止递归调用的手段,通常的做法就是增加条件判断条件,满足某条件后就不再进行递归调用,然后逐层返回。
        -注意:多个方法不能相互嵌套,方法不能返回多个值,不能在方法外部直接写程序逻辑代码。
    17.编写一个方法static void bubbleSort(int[] a),使用冒泡排序算法对数组a进行排序?

    答:    static void bubbleSort(int[] a){

                        for(int i=1;i<a.length;i++){

                                for(int j=0;j<a.length-i;j++){

                                        if(a[j] > a[j + 1]){

                                                  int temp = a[j];

                                                  a[j] = a[j + 1];

                                                   a[j + 1] = temp; 

                                        }

                                }

                        }

                }

    18.请描述基本数据类型和引用数据类型在内存使用上的区别?(内存储存形式的不同是基本数据类型和引用数据类型本质的区别)
    答:-引用数据类型的名称实际代表的是存放引用数据类型的地址,不是引用数据类型本身,存放的是数据所在的地址;
           -基本数据类型的变量是在内存中直接存放数据的值。
    19.请描述值传递和引用传递的区别?
    答:-值传递:其传递的实质是数值的副本,所以在调用使用值传递交换数据的方法时,只是在方法内将值的副本的数据内容进行了交换,其原本的数据本身并没有发生变化;
          -引用传递:其传递的本质是所引用的地址,在调用使用引用传递交换数据的方法时,是对这个地址指向的数据进行了交换,即对原数组的值进行了交换。
    20.数组相关概念总结?(数组中的元素在内存中是连续存储的)
    答:-数组的定义:
                    把相同类型的若干变量按一定顺序组织起来,这些按序排列的同类型数据元素的集合称为数组。
        -数组的两个核心要素:
                    *相同类型的变量;
                    *按一定的顺序排列。
        -数组中的数据元素类型:
                    *基本类型;
                    *引用类型。
        -数组的声明、创建、赋值和使用:
                    *一维数组:
                        -数组的声明:数据类型[] 数组名;或 数据类型 数组名[];
                        -数组的创建:就是为数组分配内存空间,不分配空间是不能存放数组元素的:数组名 = new 数据类型[数组长度];
                        -数组的声明和创建的合并:数据类型[] 数组名 = new 数据类型[数组长度];
                       -数组元素赋值和使用:数组名[数组下标] = 数值;    //数组下标从0开始编号,数组下标的最大值为数组长度减1,如果下标值超过最大值会出现数组下标越界问题。
                         -数组在创建时初始化(赋值):数组类型[] 数组名 = {值1,值2,...};    //不可以分成两行写
                    *二维数组:
                            -数组的声明:数据类型[][] 数组名;或数据类型 数据名[][];
                            -数组的创建:分配空间才能存放数组元素的---数组名 = new 数据类型[第一维长度][第二维长度];
                            -数组的声明和创建合并:数据类型[][] 数组名 = new 数据类型[第一维长度][第二维长度];
                            -数组在创建时初始化(赋值):数据类型[][] 数组名 = {{},{},{}...};
                            -注意:可以只设置第一维长度,但不可以只设置第二维的长度。
    21.请描述一下程序编译、运行的结果,并说明原因?
    答:class TestA{
            public static void main(String args[]){
                int[][] arr = {{1,2,3},{1,5},{3,9}};
                for(int i=0;i<3;i++){
                    for(int j=0;j<=i;j++){
                        System.out.println(" "+arr[i][j]+" ");
                    }
                }
            }
        }
        -结果:
            
        -原因:
                
    22.怎样定义一个字符串?注意事项?
    答:-String()(构造方法):将创建一个空字符串;
           -String(String value):初始化一个新创建的String对象,使其表示一个与参数相同的字符序列;
           -String(char[] value):创建一个新的String对象,使其表示字符数组参数中当前包含的字符序列;
          -String(char[] value,int offset,int count):创建一个新的String对象,它包含取自字符数组参数的一个子数组的字符序列,offset参数时子数组第一个字符序列的索引(从0开始建立索引),count参数指定子数组的长度。
        *注意事项:
                -String字符串时常量,字符串的值在创建之后不能更改;
                -string类不是基本数据类型,它是一个类;
                -因为对象的初始化默认值是null,所以String类对象的初始化默认值也是null;
                -String是一个特殊的对象,具有其他对象没有的一些特征;
                -String类是最终类,不能被继承。
    23.Java API文档的使用?
    答:Java给程序员提供了Java API文档,供Java程序员随时查阅。API(Application Programming Interface)指应用程序编程接口。
        -API:Java语言提供了一些核心类库供Java程序直接调用,程序员无需关注类库中方法的实现细节,只需关注其输入、输出和功能等,这些类库统称为类库;
        -API文档:在一个文档中统一定义类库中方法的输入、输出和功能描述,这个文档就是API文档。
        *注意:
            -在使用Java API文档时,需要注意API文档的版本号与JDK的版本号一致,否则可能出现随着JDK版本的更新导致的API文档与实际类库之间存在差异。
    24.使用Java API文档查找String字符串类的方法,并使用找到的方法?
    要求:(1)判断一个字符串是否为空的方法;
            (2)将字符串转换为一个新的字符串数组;
            (3)按字典顺序比较两个字符串。
    答:
    
    25.使用String类的split方法,用","对字符串",Mary,F,1976"(第一个字符是',')和" ,Mary,F,1976"(第一个字符是空格,第二个字符是',')进行分隔,得到的字符串数组的结果分别是对少?
    答:[Mary F 1976]和[空格 Mary F 1976]。
    26.请描述String、StringBuffer和StringBuilder的区别以及联系?
    答:简单的说就是一个变量与常量的关系,并且StringBuffer的内部实现方式好String不同。
        -StringBuffer对象的内容可以修改,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类(实际使用中,如果经常对一个字符串进行修改时,使用StringBuffer要更加合适一些);
            *StringBuffer类可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符毕String使用 + 操作符添加字符到一个已经存在的字符串后面有效率地多;
            *因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无疑是一个非常消耗时间的操作;
            *添加多个字符也就意味着要一次又一次的对字符串重新分配内存,使用StringBuffer类就避免了这个问题。
        -String对象一旦产生后就不可以被修改,重新赋值其实是两个对象,在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的;
            *然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。
        -StringBuilder
    27.请描述"=="和"equals"的区别?
    答:"==":当两边的操作数都为基本数据类型时,如果两边的操作数的值相同时返回true,否则返回false;
            当两边的操作数都为引用数据类型时,判断的是所引用的数据的地址是否相同,相同返回true,否则返回false。
        "equals"是引用数据类型的变量用来判断这两个变量所指向的内容是否相同,相同返回true,否则返回false。
    28.什么是对象?什么是类?如何定义类,基本结构是怎样的?类和对象的区别?面向对象有哪些基本特征?创建对象?
    答:-对象:现实世界中,万物皆对象,对象是由类实例化而来;
        -类:类是对具有相同属性和相同行为的对象的抽象;
        *如何定义类:
            类定义的基本结构:
                    public class 类名{
                        //定义类属性
                        属性1类型:属性1名;
                        属性2类型:属性2名;
                        ...
                        //定义方法
                        方法1定义
                        方法2定义
                        ...
                    }
        *类的结构:[声明修饰符]后面跟class关键字和定义的类名,用大括号包含类的主要内容:第一部分是类的属性,也叫成员变量;第二部分是类的方法定义,描述类具体的行为,也叫成员方法。
        *类和对象的区别:类是对具有相同属性和相同行为的对象的抽象,而对象是由类实例化而来的。
        *面向对象的特征:封装、继承和多态。如果是四个答案的话可以增加一个抽象。
        *创建对象:类名 对象名 = new 类名();
    30.什么是构造方法?构造函数满足的语法规则?构造方法的作用?this怎样使用?
    答:构造方法负者对对象属性进行初始化工作,为实例变量赋予合适的初始值,用来描述对象的创建过程;
        *构造函数满足的语法规则(特点):
            -构造函数必须与类名相同;
            -没有返回值类型,也不能定义void,在方法名前不声明返回类型。
        *(注意:其实构造方法是有返回值的,返回的是刚刚被初始化完成的当前对象的引用);
        *(如果在定义时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造方法,这个构造方法不执行任何代码);
        *(如果在定义类时定义了有参的构造方法,没有显式地定义无参的构造方法,那么在使用构造方法创建类对象时,则不能使用默认的无参构造方法);
        *构造方法的作用:
            完成对象的初始化工作,它能够把定义对象时的参数传给对象。
        *this怎样使用:
            定义:可以将this理解为当前对象的另一个名字,代表对当前对象的一个引用。
            -调用属性(this.属性名);
            -调用方法(this.方法名())。
    31.成员变量初始化的几种情况?用new创建并初始化对象的步骤?
    答:*成员变量初始化的几种情况:
            -创建对象时默认初始化成员变量;
            -定义类时,给成员变量赋初值;
            -调用构造方法时,使用构造方法所带的参数初始化成员变量。
        *用new创建并初始化对象的步骤:
            -给对象的实例变量分配内存空间,默认初始化成员变量;
            -成员变量声明时的初始化;
            -代码块初始化;(初始化块就是在类中用一对大括号括起来的代码块)
            -构造方法初始化。
    32.什么是方法的重载,请举例说明?重载的特点有哪些?在什么场合使用?
    答:-重载的定义:在同一个类中,可以有两个或两个以上的方法具有相同的方法名,但他们的参数列表不同,该情况下的方法就被称为重载(overload)。
                其参数列表包括以下三种情形:
                    -参数的数量不同;
                    -参数的类型不同;
                    -参数的顺序不同。
            *必须注意,仅返回值不同的方法不叫重载方法。
        -举例说明:一个类可以定义多个构造方法的时候,就已经对构造方法进行了重载。
        *重载的特点:
            -类中有多个具有相同名称的方法;
            -方法具有不同的参数列表。
        *在什么场合使用:
            -在一个类中原先定义的方法不能满足现有需求时,会对该方法进行重载。
    33.重载的方法名相同,编译器怎么确定调用哪个方法呢?
    答:靠传入的参数的不同确定调用哪个方法。返回值是运行时才决定的,而重载方法的调用在编译时就决定了,
        所以当编译器碰到只有返回值不同的两个方法时,就"糊涂"了,认为他们是同一个方法,不知道调用哪个,所以就会出错。
    34.类的一个方法如何调用本类的另一个方法?
    答:this.方法名()
    35.什么是封装,你是怎么理解的?
    答:-封装就是将抽象的属性和行为结合起来,形成一个有机的整体,也就是类。类里面的一些属性和方法(尤其是属性)需要隐藏起来,
        不希望直接对外公开,但同时提供供外部访问的方法来访问这些需要隐藏的属性和方法。
          *封装是面向对象的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
          *封装是把过程和数据包围起来,对数据的访问只能通过已定义的方法。
          *封装就是控制用户对类的修改和访问数据的程度。
          *封装的目的:
                增强安全性和简化编程,使用者不必了解具体类的内部实现细节,而只是要通过提供给外部访问的方法来有限制地访问类需要隐藏的属性和方法。
          *良好的封装:
                就是使用private对属性进行封装,从而保护信息的安全。
          *使用public修饰方法时,外界可以调用该方法,通常将设置私有属性的值和获取私有属性值的方法称为setter和getter方法。
    36.请描述面向对象与面向过程的区别,并用自己的语言总结面向对象的优势和劣势?
        答:-处理问题方面:
                -面向过程:分析解决问题所需要的步骤,通过分别取实现对应的函数来完成每一个步骤,使用的时候一次去调用对应的函数即可;
                -面向对象:把所处理的问题先抽象起来,以对象为中心封装成不同的类,然后在实例化成具体的对象,来描述某个事物在整个解决问题中的行为。
            -优缺点比较:
                -面向过程:优点:性能相对优于面向对象,因为不需要向对象类的实例化开销那样消耗资源;缺点:难以维护,复用,扩展。
                -面向对象:优点:易维护、复用、扩展,系统使用灵活方便;缺点:性能低于面向过程。    
            -总结:
                *面向对象:将所描述的事物进行高度抽象化;
                *面向过程:采取自顶向下、逐步细化的方式。
    37.包是如何声明的,它有什么好处?引用不同包中的类的方法?
    答:-使用package关键字指明源文件中的类属于哪个具体的包,包的语法形式:package pkg1[.pkg2[.pkg3...]];
          用package关键字声明的包,该语句一定是源文件中的第一条可执行语句,它的前面只能有注释或空行;
          *包的名字有层次关系,各层之间以点分隔,包名全部使用小写字母,包名的命名规则:使用internet域名,并将其中的元素颠倒过来。
          *另外,一个文件中最多只能有一条package语句。
          *为什么需要包?好处?:
                -解决类的同名问题;
                -源代码便于管理;
                -保护类、属性和方法的访问。
        *引用不同包中类的两种方法:
            -使用完整类名引用类:包名.类名 变量名 = new 包名.类名();可以通过变量名调用该类的方法:变量名.方法名();
            -采用导入包的形式引用类:import  包名.类名;
    38.访问控制符有哪些?以及他们的使用范围?
    答:Java语言中的访问权限修饰符有4种,但却只有3个关键字。因为不写访问权限修饰符时,在Java中被称为默认权限(包权限),
          其他3个访问权限修饰符分别为private、protected和public:
                -私有权限private可以修饰属性、构造方法、普通方法(被private修饰的类成员只能在定义它们的类中使用,在其他类中不能访问);
                -属性、构造方法、普通方法都使用默认权限,即不写任何关键字(默认权限也称为同包权限-同包权限的元素只能在定义它们的类中以及同包的类中被调用);
                -受保护权限protected可修饰属性、构造方法、普通方法(能在定义它们的类中以及同包的类中调用被protected修饰的成员);
                    *如果有不同包中的类想要调用它们,那么这个类必须是这些成员所属类的子类。
                -公共权限public可以修饰属性、构造方法和普通方法(被public修饰的成员,可以在任何一个类中被调用,是权限最大的访问权限修饰符);
            *能修饰类的访问权限修饰符只有public和default,如果使用public修饰,则表示该类在任何地方都能被访问,如果不写访问权限修饰符,则该类只能在本包中使用。
            *了解为什么需要使用访问控制修饰符?
                    -一个商业的Java应用系统有很多类,其中有些类并不希望被其他类使用。每个类中都有属性和方法,但并不是所有的属性和方法都允许被其他类调用,这时就需要使用访问修饰符来控制访问权限。
            *信息隐藏式OOP最重要的功能之一,也是使用访问修饰符的原因。
            *访问权限修饰符的使用范围:
                -private:类内部;
                -default:类内部、同一个包中;
                -protected:类内部、同一个包中、子类;
                -public:类内部、同一个包中、子类、任何地方。
    39.static是什么意思?可以用它来声明什么?静态和非静态的分类?static关键字的作用?
    答:static是静态的意思;
          static可以声明:
                -用static修饰类的成员变量:修饰的成员变量是静态变量,对该类的所有实例来说,只有一个静态值存在,所有实例共用一个变量;
                        *(静态变量是指不管类实例化处多少个对象,系统仅在第一次调用该类的时候为静态变量分配内存)。
                -用static修饰类的代码块/初始化块:被执行且只执行一次;
                -用static修饰类的成员方法:被修饰的成员方法,被绑定于该类本身,而不是类的实例(在方法区分配内存,并不是被执行,所有方法都需要调用才能执行)。
          *用static修饰的成员变量、代码块/初始化块、方法时在类首次被装载的时候被初始化。
          *(静态方法可以操作静态变量,不能操作实例变量(非静态变量))。
          *(静态方法总是使用类名直接调用(类名.静态方法名();),在静态方法(类方法)中不能使用this关键字)。
          *该类的对象共享其静态成员变量的值;
          *静态成员变量可被该类的所有方法访问;
          *该类的静态方法能访问该类的静态成员变量;
          *静态成员变量不可能直接调用非静态成员,静态成员变量的值是可以修改的;
          *静态变量只能在类中主体中定义,不可能在方法中定义;
          *static块无论在哪里都先于其他方法执行(后于静态变量的初始化),是和类的加载在一起的,但要记住,只执行一次,且按顺序执行;
          *statice可以修饰方法、变量、代码块;由static修饰的方法是静态方法,静态方法不能访问非静态的成员变量;
          *静态和非静态的分类:
                -变量的分类:
                    静态变量(类变量):变量值被所有该类的对象共享;
                    非静态变量(实例变量):变量值只属于单个对象。
                -方法的分类:
                    静态方法(类方法):此种方法被所有该类的对象共享;
                    非静态方法(实例方法):此种方法对所有该类的对象都是独立的。
                -代码块:
                    静态代码块:static{代码......}//属于类,该类被第一次使用时执行一次
                    非静态代码块:{代码......}//属于对象,没创建一个对象都会执行一次
          *static的作用:
                作为程序员,有时需要定义一个类级别的变量,它的使用完全独立于该类的任何对象,可以直接通过"类名.变量名"的形式进行访问;
                即如果想让通过此类创建的对象共享一个属性就用static修饰需要共享的属性。
    40.Java程序工作原理?
    答:用Java编写的程序(.java后缀)经过编译器编译成字节码文件,这个字节码文件不是针对具体平台的,而是针对抽象的Java虚拟机的,在Java虚拟机上运行。
          而在不同的平台上,会安装不同的Java虚拟机,这些不同的Java虚拟机屏蔽了各个不同平台的差异,从而使Java程序(字节码文件)具有平台无关性。
          也就是,Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
          *(一个类模板只被装载一次,通过该模板创建N个对象)。
          *类装载器:
                其主要功能是为执行程序寻找和装载所需要的类,就是把字节码文件装到Java虚拟机中;
          *字节码校验器:
                其功能是对字节码文件进行校验,保证代码的安全性。字节码校验器负者测试代码段格式并进行规则检查,检查伪造指针、违反对象访问权限或试图改变对象类型的非法代码;
          *解释器:
                具体的平台并不认识字节码文件,最终起作用的还是这个最重要的解释器,它将字节码文件翻译成所在平台能识别的东西。
    41.JDK主要包含以下基本工具(部分)?
    答:javac:编译器,将源代码程序转换成字节码文件;
            java:执行器,运行编译后的字节码文件;
            javadoc:文档生成器,从源码注释中自动产生Java文档;
           *JDK包含以下常用库:
              java.lang:系统基础类,其中包含字符串类String等;
              java.io:输入/输出类库,例如进行文件读/写需要用到;
              java.net:网络相关类库,例如进行网络通信会用到其中的类;
              java.util:系统辅助类库,编程中经常用到的集合属于这个类库;
              java.sql:数据库操作类库,连接数据库、执行SQL语句、返回结果集需要用到该类库;
              javax.servlet:JSP、Servlet等使用到的类库,是Java后台技术的核心类库。
    42.什么是继承(extends)?重写?继承初始化过程?什么是多态?继承的好处?继承的语法是怎样的?super关键字?
    答:继承:使用已存在的类作为基础建立新类的技术,新类的定义可以增加新的属性或新的方法,也可以用父类的属性和方法。
            *属性和方法存在重复定义;
            *私有的属性和方法不能被继承;
            *方法的重写:方法名、参数、返回类型都要一致    范围修饰符:可大不可小;
            *子类可以在父类的基础上额外增加新的数据和行为;
            *类型上存在一定的联系,为编码提供一定的灵活性;
            *子类是不是能继承父类所有的属性和方法呢:
                -子类可以继承父类中访问权限修饰符为public和protected的属性和方法;
                -子类可以继承父类中默认访问权限修饰的属性和方法,但子类和父类必须在同一个包中;
                -子类无法继承父类中访问权限修饰符为private的属性和方法;
                -子类无法继承父类的构造方法;
        *重写:子类会从父类继承方法,有时,从父类继承的方法在子类中非常有必要被修改来适应新类的需要;
            *重写需要满足的条件:
                -重写方法与被重写方法方法名相同,参数列表也必须相同;
                -重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类;
                -重写方法不能缩小被重写方法的访问权限;
                -静态方法可以被继承,但却不能被重写;
                -final关键字修饰的方法不能被重写;
                -运行时属性的值取决于类型即编译时类型;
            -在继承关系中子类无法覆盖父类的属性。
        *继承层次结构中的类初始化步骤(实例化过程):
            -第一次实例化子类时,先调用父类的静态信息(静态属性和静态代码块)且只调用一次;
            -调用子类的静态信息(静态属性和静态代码块)且只调用一次;
            -父类的属性默认初始化+声明初始化;
            -调用父类的非静态属性、非静态块和构造方法;
            -子类的属性默认初始化+声明初始化;
            -调用子类的非静态属性、非静态块和构造方法。
            
            *老师总结的顺序:
                1.父类的静态代码块(只执行一次)
                2.子类的静态代码块(只执行一次)
                3.父类的属性默认初始化+声明初始化
                4.父类的普通代码块
                5.父类的构造方法
                6.子类的属性默认初始化+声明初始化
                7.子类的普通代码块
                8.子类的构造方法
        *多态:指子类对象可以直接赋值给父类变量(或父类的引用指向子类的对象);
            当使用父类变量调用自己的方法时依然表现出子类的特征。
                Father p = new Children();
                p.method();//子类的方法
                -要有继承;
                -要有方法重写;
                -父类引用指向子类对象。
        继承的好处:
            继承技术使得复用以前的代码非常的容易,能够大大缩减开发周期,降低开发费用。
        继承的语法:
            class A extends B{
                //类定义部分
            }
        super关键字:
            -调用父类构造方法且只在子类的构造中使用:super([参数列表]);
            -调用父类的其他方法:super.父类方法([参数列表]);
            -访问父类的属性:super.属性。
    43.类型转换?instanceof关键字?
    答:-在继承树中向上转型总是安全的;
        -向下转型(强制转换)是不安全的;
        *instanceof关键字:
            -instanceof是实例测试运算符;
            -instanceof关键字用来测试一个对象是否是某类的一个实例,测试结果是一个布尔值;
            -在强制类型转换之前痛过instanceof运算符检查对象的真实类型,可以避免类型转换异常,从而提高代码健壮性。
    44.抽象的概念?怎样声明一个抽象类?
    答:面向对象设计特征之一,是根据用户的业务需求抽象出类,并关注这些类的属性和方法,将现实世界中的对象抽象成程序设计中的类。
            -发现名词;
            -确定类和属性;
            -确定方法。
    45.方法重写与方法重载的区别?
    答:方法重写:
            -一个类M继承另一个类N,N中有一个方法A,这时你在M中写了一个方法B,方法B的名字、返回值以及参数都和A一样,此时B重写了A。
       方法重载:
            -一个类中有一个方法A,你又在这个类中创建了一个方法B,方法B的名字和A一样,返回值类型一样,但是参数的类型或个数不同,此时B重载了A。
    46.请描述Java包机制的主要作用?
    答:包是JAVA中文件的一种组织形式,类似Windows操作系统的文件夹结构,在Java当中,包也相当于文件夹。开发过程中涉及到过多的java文件,使用包把相关的Java文件放在一起管理;
        包的作用不仅仅是对类的封装管理,包的引用还可以避免命名冲突的问题。不同的程序员涉及不同的模块,这时命名冲突更加明显,而在java程序中几乎没有命名冲突的问题,其最大的原因就是包的作用。
    47.结合自己的理解,请描述为什么静态方法不能调用实例变量?
    答:静态方法时不需要初始化就可以调用的,例如Student类有一个静态方法study,可以Student.study,而不需要实例化一个Student对象。但是非静态的全局变量时需要实例化一个对象后,
        该变量和实例化的那个对象绑定在一起才能使用,所以就产生了矛盾,如果静态方法去调用非静态的变量,那么该变量可能还没有被实例化,所以是不能够调用的。
    48.请描述类变量和实例变量的区别?
    答:-类变量属于类所有,可以在类中直接使用,不需要通过创建对象调用;而实例变量属于对象所有,需要创建对象才能调用。
        -类变量可以不初始化,系统能给类变量赋予初始值,而实例变量必须初始化或者在使用过程中为其赋值,否则会出错。
        -类变量用static标识符修饰,亦成为静态变量,实例变量没有用static修饰。
        -类变量的访问方法:类名.类变量 或者对象句柄.类变量(后者多余,没必要使用),实例变量的访问方法:对象句柄.类型变量。
        -类变量(静态变量)不能在任何方法中声明,只能在方法外部声明---这说明类变量(静态变量)一定是全局变量,类变量不能成为局部变量;
                        而实例变量可以在任何方法中声明,也可以在方法外部声明---这说明全局变量可能是实例变量或类变量,局部变量一定是实例变量,实例变量可能是全局变量或局部变量。
    49.类方法与实例方法的区别?
    答:-类方法属于类所有,可以在类中直接使用,不需要通过创建对象调用;而实例方法属于不对象所有,需要创建对象才能调用。
        -类方法用static标识符修饰,亦成为静态方法,实例方法没有用static修饰。
        -类方法的访问方法:类名.类方法或者对象句柄.类方法(后者没必要使用),实例方法的访问方法:对象句柄.类型方法。
    50.short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错 ?
    答:short s1=1;s1=s1+1;(short在运算的时候回自动换换为int类型进行运算),出错的地方是不能把int类型的数据转换为short类型;
        short s1 = 1; s1 += 1;(+=能自动实现转型)没有错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值