java学习第一阶段——面向对象


 你聪明有人会说你心机重, 你靠的是努力有人会说你运气好, 你说自己天生乐观有人会说你虚假, 有时候, 你明明就是一杯白水, 却被人硬生生逼成了满肚子憋屈的碳酸饮料. 人一生要遇见太多人, 即使有些话字字诛心, 也没必要活在他们的眼神里, 只要内心澄明, 就永远不用讨好一个不懂你的人. 爱生活, 爱自己.


 

  1. 重写: 返回值类型、方法名、参数列表必须相同。子类重写的方法的访问修饰符必须大于等于父类的访问修饰符。
  2. super 在调用父类构造器的时候必须出现在有效代码的第一行。
  3. 继承的作用:

    1)继承的出现提高了代码的复用性。

    2)继承的出现让类与类之间产生了关系, 提供了多态的前提。
    3)不要仅仅为了获取其他类中某个功能而去继承。
  4. 子类不能直接访问父类中私有的(Private)的成员变量和方法。
  5. 关键字super
    1)使用
    super 可用于访问父类中定义的属性。
    super 可用于调用父类定义的成员方法。
    super 可用于在子类构造方法中调用父类的构造器(必须出现在第一行)。
    2)需要注意的几个点
    尤其当于父类出现同名成员时, 可以用super进行区分。
    super 追溯不仅限于直接父类。
    super和this的用法基本雷同, this代表本类对象的引用, super代表父类的内存空间的标识。
  6. 调用父类的构造器
    1)子类中所有的构造器默认都会访问父类中空参的构造器。
    2)当父类中没有空参的构造器时, 子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器, 且必须放在构造器的第一行。
    3)如果子类构造器既未显示调用父类或本类的构造器,且父类中又没有无参的构造器, 则编译出错。
  7. 一个构造函数里面this(...)与super(...)为什么不能并存?
    1)使用this()与super()必须要放在执行语句的第一行, 有冲突。
    2)在调用this()的时候, 里面也包含的有super(), 这样会造成java识别混乱。
  8. java类是单根性(单继承),可以多实现接口。
  9. 比较两个String字符串,“==” 和 “equals” 的区别?
    比较String 一定要使用 equals 或 equalsIgnoreCase方法, 不要使用 ==。
    “==” 比较的是两个引用变量是否指向了同一个对象,而不是比较的内容。
  10. 重载(overload)和重写(override)的区别?overload的方法是否可以改变返回值的类型?
    方法的重写和重载是Java多态性的不同表现。
    重写是父类和子类之间多态性的一种表现, 重载是一个类中多态性的表现。 如果在子类中定义某方法与其父类有相同的名称和参数, 我们就说该方法被重写。子类的对象使用这个方法的时候, 调用自己的方法, 父类的同方法被自动屏蔽。
    如果一个类中定义了多个同名的方法他们或有不同的参数个数或有不同的参数类型, 则称为方法的重载。
    重载的方法可以改变返回值的类型。
  11. 多态性
    在Java中的两种体现:
      1)方法的重载和重写
      2)对象的多态性, 可以直接应用在抽象类和接口上。
    Java引用变量有两个类型:编译时类型 和 运行时类型。
    编译时类型由声明该变量时使用的类型决定, 运行时类型由实际赋给该变量的对象决定。若编译时类型和运行时类型不一致,就出现多态。

    多态小结:
      前提:1)需要存在继承或者实现关系。
         2)要有覆盖操作。
      成员方法:
        编译时:要查看 引用变量所属的类 中是否有所调用的方法。
        运行时:调用实际 对象所属的类 中的重写方法。
      注意:父类引用指向子类对象, 调用成员方法的时候, 必须是子类重写父类的方法才能调用, 子类独有的不能够调用。
      成员变量:不具备多态性, 只看引用变量所属的类。(即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量。)

    子类继承父类:
      1)若子类重写了父类方法, 就意味着子类定义的方法彻底覆盖了父类里的同名方法, 多态调用的时候, 就是调用子类重写的方法。
      2)对于成员变量则不存在这样的现象, 即使子类里定义了与父类完全相同的成员变量, 这个成员变量依然不能覆盖父类的成员变量。
  12. JDK、JRE、JVM的作用及关系
    作用:
    JVM:保证Java语言跨平台
    JRE:Java程序的运行环境
    JDK:Java程序的开发环境
    关系
    JDK:JRE+工具
    JRE:JVM+类库
  13. 环境变量path和classpath的区别?
    path环境变量
      1)path环境变量的作用
        保证javac命令可以在任意目录下运行。
      2)path配置的方案:找到环境变量的位置, 在系统变量里面
        新建:
          变量名:JAVA_HOME
          变量值:D:\develop\Java\jdk1.7.0_60(你自己的jdk安装路径)
        修改:
          变量名:Path
          变量值:%JAVA_HOME%\bin
    classpath环境变量
      1)classpath环境变量的作用
    保证class文件可以在任意目录下运行
      2)classpath环境变量的配置
  14. switch的表达式
    表达式: 可以是byte, short, int, char
    JDK5以后可以是枚举
    JDK7以后可以是字符串
  15. 二维数组遍历
    外循环控制的是二维数组的长度, 其实就是一维数组的个数
    内循环控制的是一维数组的长度
    for(int i = 0;i<arr.length;i++){
        for(int j = 0;j<arr[i].length;j++){
            System.out.print(arr[i][j] + "  ");
        }
        System.out.println();
    }

     

  16. 代码执行的顺序
    父类的静态代码块--->子类的静态代码块--->父类的非静态代码块(还有成员变量)--->父类的构造方法--->子类的非静态代码块--->子类的构造方法。
  17. 谈谈final、finally、finalize的区别
    final:修饰符(关键字) 如果一个类被声明为final, 意味着它不能被继承。因此一个类不能即被声明为abstract的, 又被声明为final的。将变量或方法声明为final, 可以保证使用中只能读取, 不可修改,局部变量必须赋初值。 被声明为final的方法也同样只能使用, 不能重载和重写。
    finally:在异常处理时提供finally块来执行任何清除操作。 如果抛出一个异常, 那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。
    finalize:方法名。 Java技术允许使用finalize()方法在垃圾回收器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。 它是在Object类中定义的, 因此所有的类都继承了它。 子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。 finalize()方法是在垃圾回收器删除对象之前就对这个对象调用的。
  18. 非静态内部类中不可以定义静态成员。 内部类中如果定义了静态成员, 该内部类必须被静态修饰。***
  19. 静态变量和实例变量的区别
    无论创建多少个实例对象, 静态变量值分配一个staticVar变量, 而有多少个实例对象就有多少个实例变量。
    public class VariantTest{
    
            public static int staticVar = 0; 
    
            public int instanceVar = 0; 
    
            public VariantTest(){
    
                staticVar++;
    
                instanceVar++;
    
                System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
    
            }
    
    }

    写一个测试类, 创建三个对象输出的结果是staticVar = 1,2,3       instanceVar = 1,1,1

  20. 任意数字序列“123456”之类的,输出它们所有的排列组合
            String str = "123456";
        char[] arr1 = str.toCharArray();
        char[] arr2 = Arrays.copyOf(arr1, arr1.length);
        for (int i = 0; i < arr1.length - 1; i++) {
    
            for (int j = i + 1; j < arr2.length; j++) {
    
                System.out.println(arr1[i] + "," + arr2[j]);
    
            }
    
        }    

     

  21. 构造器(Constructor)是否可被override?
    构造器不能被继承, 因此不能被重写, 但可以被重载overload。
  22. 我们在使用clone()方法时, 通常都有一行代码, 是什么?
    super.clone()缺省, 因为首先要把父类的成员复制到位, 才能复制自己的成员。
  23. Java中实现多态的机制是什么?
    靠的是父类或接口定义的引用变量可以指向子类或者具体实现类的实例对象, 而程序调用的方法在运行时候才动态绑定, 就是引用变量所指向的具体实例对象的方法, 也就是内存里正在运行的那个对象的方法, 而不是引用变量的类型中定义的方法。
  24. 抽象类(abstract class)和接口(interface)有什么区别?
    抽象类中定义抽象方法必须在具体子类中实现, 所以, 不能有抽象构造方法或抽象静态方法。 如果子类没有实现抽象类中所有的抽象方法, 那么子类也必须定义为abstract类型。
    接口(interface) 可以说成是抽象类的一种特例, 接口中的所有方法都必须是抽象的。 接口中的方法定义默认为public abstract类型, 接口中的成员变量默认为public static final。

    区别:
    1.抽象类有构造方法,接口没有
    2.抽象类可以有普通成员变量,接口中只有常量
    3.抽象类中包含非抽象的普通方法,接口方法必须是抽象的
    4.抽象类中的抽象方法的访问类型可以是 public, protected, 但接口中的抽象方法必须是 public abstract
    5.抽象类中可以包含静态方法, 接口中不能包含静态方法(不能有抽象的静态方法,静态方法不能被重写)
    6.抽象类和接口都可以有静态的成员变量, 但抽象类中成员变量的访问修饰符可以是任何类型, 接口只能是public static final
    7.一个类只能继承一个抽象类, 但是一个类可以实现多个接口

  25. 为什么不能重写静态方法? 为什么抽象类中不能有抽象静态方法?
    重写:指的是根据运行时对象的类型来决定调用哪个方法, 而不是根据编译时的类型。
    1)静态方法是类的方法, 它们在编译的阶段就使用编译的类型进行绑定了。(静态绑定)
    2)抽象类不能实例化对象, 所以开始的时候, 内存不会分配空间, 但是静态的随着类的加载而加载, 分配的有空间, 所以冲突。

 

posted @ 2016-11-05 20:55  记忆沙漏  阅读(229)  评论(0编辑  收藏  举报