Java基础知识之基本概念

  1. Java语言有哪些优点?

    1.Java是纯面向对象的语言
    2.平台无关性。Java解释性语言,编译器对Java代码进行编译,生成字节码文件,然后由JVM(Java 虚拟机)上解释执行。
    3.Java提供了需要内置的类库。例如对多线程的支持。
    4.具有较好的安全性和健壮性。Java中提供了一个防止恶意代码攻击的安全机制。另外,还提供了异常处理,垃圾回收器等来保证程序的健壮性。
    5.提供了对Web应用开发的支持。例如Servlet,JSP可以用来开发Web应用程序。Socket,RMI可以用来开发分布式应用程序的类库。
    6.去除了C++语言中,难以理解、容易混淆的特性。如指针,头文件,多重继承等。
  2. Java与C/C++有什么异同

    1.Java为解释性语言。而C/C++为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。
    2.Java为纯面向对象语言,C++兼具过程和面向过程编程的特点。
    3.Java没有指针的概念
    4.Java提供了垃圾回收器来实现垃圾的自动回收。C++语言中,需要开发人员去管理对内存的分配(包括申请与释放)。
    5.Java不支持运算符重载,没有预处理器,不提供goto语句(但在Java中goto是保留关键字),具有平台无关性。
  3. 为什么需要public static void main(String[] args)这个方法?

    ◦public static void main(String[] args)是java程序的入口方法,JVM在运行程序时,会先查找main()方法。通常来说,要执行一个类的方法,需要先实例化一个类的对象,通过这个对象来调用方法。
    鉴于此,main()的修饰符是public static ,静态方法,在程序加载时,便可以调用main方
  4. Java程序初始化的顺序是怎样的?

    ◦在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有所有类成员变量完成初始化之后,才会调用对象所在类的构造函数创建对象。
    ◦执行顺序如下:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数。
  5. Java中的作用域有哪些?

    • 首先说明Java中不存在全局变量或全局函数
    • 在Java语言中,变量的类型分三种:成员变量,静态变量,局部变量。
      • 成员变量的作用范围与类的实例化对象的作用范围相同。成员变量也有4种作用域,对应的修饰符有public(所有可见),private(当前类可见),protected(当前类,同一个package,子类可见),default(当前类,同一package可见)
      • 静态变量,不依赖于特定的实例,而是被所有实例所共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配存储空间。
      • 局部变量的作用域,在它所在的花括号内。
    • 需要注意的是,public,private,protected,default只能用来修饰成员变量,不能修饰局部变量。private与protected不能用来修饰类,只有public,abstract,fianl能用来修饰类
  6. 什么是构造函数?

    • 构造函数是一直特殊的函数,用来在对象实例化时,初始化对象的成员变量。
    • 在Java语言中,构造函数有以下特点
      • 构造函数必须与类的名字相同,并且不能有返回值(返回值也不能是void)。
      • 每个类可以有多个构造函数。
      • 构造函数可以有0个、1个或者1个以上的参数。
      • 构造函数总是伴随new操作一起调用,且不能由程序的编写者直接调用,必须要由系统调用。
      • 构造函数的主要作用是完成对象的初始化工作
      • 构造函数不能被继承, 因此不能被覆盖,但是构造函数能够被重载,可以使用不同的参数个数或者参数类型来定义多个构造函数。
      • 当父类和子类都没有构造函数时,编译器会为父类和子类生成一个默认的无参数的构造函数。
      • 子类可以通过super关键词来显式地调用父类的构造函数。
  7. 为什么Java中有些接口没有任何方法?

    • 首先说一下接口,在java中由于不支持多重继承,java引入接口这一概念。接口是抽象方法定义的集合(也定义一些常量),是一种特殊的抽象类。接口中的成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰。
    • 在java语言中,有些接口内部没有声明任何方法,这类接口叫做标识接口。标识接口对实现它的类没有什么语义要求,仅仅充当一个标识的作用,用来表明实现它的类属于一个特定类型。Java类库中已存在的标识接口有Cloneable和Serializable等。在使用时经常用instanceof来判断实例对象的类型是否实现了一个给定的标识接口。
  8. Java中clone方法有什么作用?

    • Java语言取消了指针的概念,但这只是Java语言中没有明确提供指针的概念与用法,而实质上每个new语句返回的都是一个指针的引用。
    • 在实际编程中,经常会遇到从某个已有的对象A创建出另外一个与A具有相同状态的对象B,并且修改B不会影响到A的状态。这仅仅通过简单的赋值操作显然无法实现,而Java中提供了clone()方法来满足这个需求。
    • Java中所有类都默认继承Object类,而Object类中提供了一个clone()方法,这个方法的作用是返回一个Object对象的复制。这个复制函数返回的是一个新的对象而不是一个引用。
    • 使用clone()方法的步骤:
      • 实现clone的类首先需要继承Cloneable接口。Cloneable接口实质上是一个标识接口,没有任何接口方法
      • 在类中重写Object类中的clone()方法
      • 在clone方法中调用super.clone()。
      • 把浅复制的引用指向原型对象的新的克隆体。(当类中包含一些对象时,就需要用到深复制)
    • 浅复制仅仅复制所考虑的对象,深复制把复制的对象所引用的对象都复制了一遍。
    • Prototype(原型)模式中,就需要clone一个对象实例
  9. 什么是反射机制?

    • 反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,也允许对其内部的成员进行操作。
    • 反射机制提供的功能主要有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法。
    • 在反射机制中,Class是一个非常重要的类。获取方法有三个:1)Class.forName("类的路径");2)类名.Class;3)实例.getClass()。
  10. 如何实现类似于C语言中函数指针的功能?

    • 回调函数,就是指函数先在某处注册,而它将在稍后某个需要的时候被调用
    • 回调函数一般用于截获消息,获取系统信息或处理异步事件。
    • 在Java中可以利用接口与类来实现同样的效果。
    • 策略模式 也是用到这样的思想。
    • 代码:
       1 interface IntCompare {
       2     public int cmp(int a, int b);
       3 }
       4 class Cmp1 implements IntCompare {
       5     public int cmp(int a, int b) {
       6         if (a > b)
       7             return 1;// a大于b
       8         else if (a < b)
       9             return -1;
      10         else
      11             return 0;
      12     }
      13 }
      14 class Cmp2 implements IntCompare {
      15     public int cmp(int a, int b) {
      16         if (a > b)
      17             return -1;
      18         else if (a < b)
      19             return 1;// a小于b
      20         else
      21             return 0;
      22     }
      23 }
      24 public class Test2018415 {
      25     public static void insertSort(int[] a, IntCompare cmp) {
      26         if (a != null) {
      27             for (int i = 1; i < a.length; i++) {
      28                 int temp = a[i];
      29                 int j = i;
      30                 if (cmp.cmp(a[j - 1], temp) == 1) {
      31                     while (j >= 1 && cmp.cmp(a[j - 1], temp) == 1) {
      32                         a[j] = a[j - 1];
      33                         j--;
      34                     }
      35                 }
      36                 a[j] = temp;
      37             }
      38         }
      39     }
      40     public static void main(String[] args) {
      41         int[] array1 = { 7, 3, 19, 40, 4, 7, 1 };
      42         insertSort(array1, new Cmp1());
      43         System.out.println("升序排序:");
      44         for (int i = 0; i < array1.length; i++) {
      45             System.out.print(array1[i] + " ");
      46         }
      47         System.out.println();
      48         int[] array2 = { 7, 3, 19, 40, 4, 7, 1 };
      49         insertSort(array2, new Cmp2());
      50         System.out.println("降序排序:");
      51         for (int i = 0; i < array2.length; i++) {
      52             System.out.print(array2[i] + " ");
      53         }
      54     }
      55 }

            

原文地址:https://www.cnblogs.com/weiziqiang/p/8835788.html