Java基础知识(一)——基本概念篇

目录

1、Java语言有哪些优点

1)Java为纯面向对象的语言。

2)平台无关性。

3)Java提供了很多内置的类库

4)提供了对Web应用开发的支持,

5)具有较好的安全性和健壮性。

6)去除了C++语言中难以理解、容易混淆的特性,

2、Java与C/C++有什么异同

1)Java为解释性语言,其运行过程为:

2)Java为纯面向对象语言

3)Java语言中没有指针的概念

4)Java语言不支持多重继承

5)在C++语言中,需要开发人员去管理对内存的分配(包括申请与释放)

3、为什么需要public static void main(String[]args)这个方法

引申:main()方法是否还有其他可用的定义格式?

同一个.java文件中是否可以有多个main()方法?

4、如何实现在main()方法执行前输出“Hello World”

5、Java 程序初始化的顺序是怎样的

6、Java中的作用域有哪些

7、一个Java文件中是否可以定义多个类

8、什么是构造函数

9、为什么Java中有些接口没有任何方法

10、Java中的 clone方法有什么作用

11、什么是反射机制

12、package有什么作用

13、如何实现类似于C语言中函数指针的功能


在生活中我们总是面临很多抉择,当我们不知大该怎么做,该做什么的时候,其实很简单那就做好现在正在做的事情就好了。人嘛毕竟都不是完美的,点滴积累才能够由弱变强。其实学习又何尝不是如此呢!在开发的几年中做过Python+Django+Mysql,最终流年不利,阴差阳错认识了Java,开发几年了,大大小小的项目都做了不少,但是回过头来可能人家问你一个简单的初级的Java问题你也不一定明了。最近公司不算忙,也为自己的下一步做打算这里正好学习整理一下Java的知识点,方便自己以后查阅。

1、Java语言有哪些优点

Sun Microsystems公司对Java 语言的描述如下:“Java is a simple,object-oriented,distribu-ted,interpreted,robust,secure,architecture neutral,portable,high-performance,multithreaded,and dynamic language”。具体而言,Java语言具有以下几个方面的优点:


1)Java为纯面向对象的语言

《Java编程思想》提到Java语言是一种“Everything is ob-ject”的语言,它能够直接反应现实生活中的对象,例如火车、动物等,因此通过它,开发人员编写程序更为容易。


2)平台无关性

Java语言可以“一次编译,到处运行”。无论是在Windows平台还是在Linux、Mac0S等其他平台上对Java程序进行编译,编译后的程序在其他平台上都可以运行。由于Java为解释型语言,编译器会把Java代码变成“中间代码”,然后在Java虚拟机(Java Virtual Machine,JVM)上解释执行。由于中间代码与平台无关,因此,Java语言可以很好地跨平台执行,具有很好的可移植性。


3)Java提供了很多内置的类库

通过这些类库,简化了开发人员的程序设计工作,同时缩短了项目的开发时间,例如,Java语言提供了对多线程的支持,提供了对网络通信的支持,最重要的是提供了垃圾回收器,这使得开发人员从对内存的管理中解脱出来。


4)提供了对Web应用开发的支持

例如,Applet、Servlet和JSP可以用来开发Web应用程序;Socket、RMI可以用来开发分布式应用程序的类库。


5)具有较好的安全性和健壮性。

Java语言经常被用在网络环境中,为了增强程序的安全性,Java语言提供了一个防止恶意代码攻击的安全机制(数组边界检测和Bytecode校验等)。Java 的强类型机制、垃圾回收器、异常处理和安全检查机制使得用Java语言编写的程序有很好的健壮性。


6)去除了C++语言中难以理解、容易混淆的特性,

例如头文件、指针、结构、单元、运算符重载、虚拟基础类、多重继承等,使得程序更加严谨、简洁。

面试题解析

答案:B。Ada语言是美国军方为了整合不同语言开发的系统而发明的一种语言,其最大的特点是实时性,在Ada95中已加入面向对象内容。Pascal语言是为提倡结构化编程而发明的语言BASIC语言为了让大学生容易地控制计算机开发的语言,其特点是简单易懂,且可以用解释和编译两种方法执行C++语言是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言,它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。Java语言是一种面向对象语言,从语法结构上看,与C++类似。
 

2、Java与C/C++有什么异同

Java与C++都是面向对象语言,都使用了面向对象思想(例如封装、继承、多态等),由于面向对象有许多非常好的特性(继承、组合等),因此二者都有很好的可重用性。


需要注意的是,二者并非完全一样,下面主要介绍它们的不同点


1)Java为解释性语言,其运行过程为:

程序源代码经过Java编译器编译成字节码,然后由JVM解释执行。而C/C++为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。因此,Java的执行速度比C/C++慢,但是Java能够跨平台执行,而C/C++不能


2)Java为纯面向对象语言

所有代码(包括函数、变量等)必须在类中实现,除基本数据类型(包括int、float等(有八大基本数据类型,但是Java为了将面向对象进行到底,还为每一个基本数据类型建立了相应的包装类))外,所有类型都是类。此外,Java语言中不存在全局变量或全局函数,而C++兼具面向过程和面向过程编程的特点,可以定义全局变量和全局函数


3)Java语言中没有指针的概念

与C/C++语言相比,Java语言中没有指针的概念,这有效防止了C/C++语言中操作指针可能引起的系统问题,从而使程序变得更加安全。


4)Java语言不支持多重继承

与C++语言相比,Java语言不支持多重继承,但是Java语言引入了接口的概念,可以同时实现多个接口。由于接口也具有多态特性,因此在Java语言中可以通过实现多个接口来实现与C++语言中多重继承类似的目的

5)在C++语言中,需要开发人员去管理对内存的分配(包括申请与释放)

在C++语言中,需要开发人员去管理对内存的分配(包括申请与释放),而Java语言提供了垃圾回收器来实现垃圾的自动回收,不需要程序显式地管理内存的分配。在C++语言中,通常都会把释放资源的代码放到析构函数中,Java语言中虽然没有析构函数,但却引入了一个finalize()方法,当垃圾回收器将要释放无用对象的内存时,会首先调用该对象的finalize()方法,因此,开发人员不需要关心也不需要知道对象所占的内存空间何时会被释放。C++语言支持运算符重载,而Java语言不支持运算符重载C++语言支持预处理,而Java 语言没有预处理器,虽然不支持预处理功能(包括头文件、宏定义等),但它提供的import机制与C++中的预处理器功能类似C++支持默认函数参数,而Java不支持默认函数参数。C/C++支持goto语句,而Java不提供goto 语句(但Java中goto是保留关键字)。C/C++支持自动强制类型转换,这会导致程序的不安全;而Java不支持自动强制类型转换,必须由开发人员进行显式地强制类型转换。C/C++中,结构和联合的所有成员均为公有,这往往会导致安全性问题的发生,而Java根本就不包含结构和联合,所有内容都封装在类里面。Java具有平台无关性,即对每种数据类型都分配固定长度,例如,int类型总是占据32位,而C/C++却不然,同一个数据类型在不同的平台上会分配不同的字节数。
Java提供对注释文档的内建支持,所以源码文件也可以包含它们自己的文档。通过一个单独的程序,这些文档信息可以提取出来,并重新格式化成HTML。

Java包含了一些标准库,用于完成特定的任务,同时这些库简单易用,能够大大缩短开发周期,例如,Java提供了用于访问数据库的JDBC库,用于实现分布式对象的RMI等标准库。C++则依靠一些非标准的、由其他厂商提供的库。

3、为什么需要public static void main(String[]args)这个方法

public static void main(String[]args)为Java程序的入口方法,JVM在运行程序时,会首先查找main()方法。其中,public是权限修饰符,表明任何类或对象都可以访问这个方法,static表明main()方法是一个静态方法即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名.main()直接访问,JVM在启动时就是按照上述方法的签名(必须有public与static修饰,返回值为void,且方法的参数为字符串数组)来查找方法的入口地址,若能找到,就执行;找不到,则会报错。void表明方法没有返回值,main是JVM识别的特殊方法名,是程序的入口方法。字符串数组参数args为开发人员在命令行状态下与程序交互提供了一种手段。

因为main是程序的入口方法,所以当程序运行时,第一个执行的方法就是main()方法。通常来讲,要执行一个类的方法,先必须实例化一个类的对象,然后通过对象来调用这个方法。但由于main是程序的入口方法,此时还没有实例化对象,因此在编写main()方法时就要求不需要实例化对象就可以调用这个方法,鉴于此,main()方法需要被定义成public与static。
下例给出了在调用main()方法时传递参数的方法。

在控制台下,使用javac Test.java指令编译上述程序,使用java Test argl arg2arg3指令运行程序,程序运行结果为:

引申:
main()方法是否还有其他可用的定义格式?


1)由于public与static 没有先后顺序关系,因此下面的定义也是合理的。
static public void main(String[]args)


2)也可以把main()方法定义为final
public static final void main(String[]args)


3)也可以用synchronized来修饰main()方法。
static public synchronized void main(String[]args)

不管哪种定义方式,都必须保证main()方法的返回值为void,并有static与public关键字修饰。同时由于main()方法为程序的入口方法,因此不能用abstract关键字来修饰。

同一个.java文件中是否可以有多个main()方法?

虽然每个类中都可以定义main()方法,但是只有与文件名相同的用public修饰的类中的main()方法才能作为整个程序的入口方法。如下例所示,创建了一个名为Test.java的文件。

面试题:

4、如何实现在main()方法执行前输出“Hello World”

众所周知,在Java语言中,main()方法是程序的入口方法,在程序运行时,最先加载的就是main()方法,但这是否意味着main()方法就是程序运行时第一个被执行的模块呢?

答案是否定的。在Java语言中,由于静态块在类被加载时就会被调用,因此可以在main()方法执行前,利用静态块实现输出“Hello World”的功能,以如下代码为例。

由于静态块不管顺序如何,都会在main()方法执行之前执行,因此,以下代码会与上面的代码有同样的输出结果。

5、Java 程序初始化的顺序是怎样的

在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。

Java程序的初始化一般遵循3个原则(优先级依次递减)①静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。②父类优先于子类进行初始化。③按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化。

Java程序初始化工作可以在许多不同的代码块中来完成(例如静态代码块、构造函数等),它们执行的顺序如下:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。下面给出一个不同模块初始化时执行顺序的一个例子。

6、Java中的作用域有哪些

在计算机程序中,声明在不同地方的变量具有不同的作用域,例如局部变量、全局变量等在Java语言中,作用域是由花括号的位置决定的,它决定了其定义的变量名的可见性与生命周期

在Java语言中,变量的类型主要有3种成员变量、静态变量和局部变量。类的成员变量的作用范围与类的实例化对象的作用范围相同,当类被实例化时,成员变量就会在内存中分配空间并初始化,直到这个被实例化对象的生命周期结束时,成员变量的生命周期才结束。被static修饰的成员变量被称为静态变量或全局变量,与成员变量不同的是,静态变量不依赖于特定的实例,而是被所有实例所共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配存储空间因此,就可以通过类名和变量名来访问静态变量局部变量的作用域与可见性为它所在的花括号内

此外,成员变量也有4种作用域,它们的区别见下表。

1)public。

表明该成员变量或方法对所有类或对象都是可见的,所有类或对象都可以直接访问。
2)private。

表明该成员变量或方法是私有的,只有当前类对其具有访问权限,除此之外的其他类或者对象都没有访问权限。
3)protected。

表明该成员变量或方法对自己及其子类是可见的,即自己和子类具有权限访问。除此之外的其他类或对象都没有访问权限。
4)default。

表明该成员变量或方法只有自己和与其位于同一包内的类可见若父类与子类位于同一个包内,则子类对父类的default成员变量或方法都有访问权限;若父类与子类位于不同的package(包)内,则没有访问权限

需要注意的是,这些修饰符只能修饰成员变量,不能用来修饰局部变量private与protected不能用来修饰类(只有public、abstract 或final能用来修饰类)。
 

笔试题:

7、一个Java文件中是否可以定义多个类

一个Java文件中可以定义多个类,但是最多只能有一个类被public修饰,并且这个类的类名与文件名必须相同若这个文件中没有public的类,则文件名随便是一个类的名字即可。需要注意的是,当用javac指令编译这个.java文件时,它会给每一个类生成一个对应的.class文件,示例如下。

8、什么是构造函数

构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。在Java语言中,构造函数具有以下特点。

1)构造函数必须与类的名字相同,并且不能有返回值(返回值也不能为void)

2)每个类可以有多个构造函数。当开发人员没有提供构造函数时,编译器在把源代码编译成字节码的过程中会提供一个有参数默认的构造函数,但该构造函数不会执行任何代码。如果开发人员提供了构造函数,那么编译器就不会再创建默认的构造函数了。

3)构造函数可以有0个、1个或1个以上的参数。

4)构造函数总是伴随着new操作一起调用,且不能由程序的编写者直接调用必须要由系统调用。构造函数在对象实例化时会被自动调用,且只运行一次;而普通的方法是在程序执行到它时被调用,且可以被该对象调用多次。

5)构造函数的主要作用是完成对象的初始化工作

6)构造函数不能被继承,因此,它不能被覆盖,但是构造函数能够被重载,可以使用不同的参数个数或参数类型来定义多个构造函数。

7)子类可以通过super关键字来显式地调用父类的构造函数,当父类没有提供无参数的构造函数时,子类的构造函数中必须显式地调用父类的构造函数。如果父类提供了无参数的构造函数,此时子类的构造函数就可以不显式地调用父类的构造函数,在这种情况下编译器会默认调用父类提供的无参数的构造函数。当有父类时,在实例化对象时会先执行父类的构造函数,然后执行子类的构造函数。

8)当父类和子类都没有定义构造函数时,编译器会为父类生成一个默认的无参数的构造函数,给子类也生成一个默认的无参数的构造函数。此外,默认构造器的修饰符只跟当前类的修饰符有关(例如,如果一个类被定义为public,那么它的构造函数也是public)。
引申:普通方法是否可以与构造函数有相同的方法名?
可以,示例如下。

9、为什么Java中有些接口没有任何方法

由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念。接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类。接口中只包含方法的定义,没有方法的实现接口中的所有方法都是抽象的。接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰
由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接达到多重继承的目的。

在Java语言中,有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识接口对实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型。这个标签类似于汽车的标志图标,每当人们看到一个汽车的标志图标时,就能知道这款汽车的品牌。Java类库中已存在的标识接口有CloneableSerializable等。在使用时会经常用instanceof来判断实例对象的类型是否实现了一个给定的标识接口。


10、Java中的 clone方法有什么作用

由于指针不仅会给开发人员带来使用上的不便,而且也是造成程序不稳定的根源,为了消除C/C++语言的这些缺点,Java语言取消了指针的概念,但这只是在Java语言中没有明确提供指针的概念与用法,而实质上每个new语句返回的都是一个指针的引用,只不过在大部分情况下开发人员不需要关心如何去操作这个指针而已

由于Java取消了指针的概念,因此开发人员在编程中往往忽略了对象和引用的区别,示例如下。
 

11、什么是反射机制

反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部的成员进行操作。虽然这个特性在实际开发时使用得不多,但是像Pascal、C和C++等语言根本就没有提供这样的特性。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,也会严重影响系统的性能

具体而言,反射机制提供的功能主要有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法。

其实,反射机制非常重要的一个作用就是可以在运行时动态地创建类的对象,示例如下。

在反射机制中,class是一个非常重要的类,那么如何才能获取class类呢?总共有如下3种方法可以获取到class类:
1)class.forName(“类的路径”),如上例所示。
2)类名.class。
3)实例.getClass()。

笔者整理了一篇关于反射的文章,假如有感兴趣的小伙伴可以去参考学习一下: 

Java创建对象的方式有几种?答案:共有4种创建对象的方法
1)通过new 语句实例化一个对象。
2)通过反射机制创建对象,见上述讲解。
3)通过clone()方法创建一个对象。
4)通过反序列化的方式创建对象。

 

12、package有什么作用

package的中文意思是“包”,它是一个比较抽象的逻辑概念,其宗旨是把.java文件(Java源文件)、.class文件(编译后的文件)以及其他resource文件(例如.xml文件、.avi文件、.mp3文件、.txt文件等)有条理地进行一个组织,以供使用。它类似于Linux文件系统,有一个根,从根开始有目录和文件,然后目录中嵌套目录。

具体而言,package主要有以下两个作用第一,提供多层命名空间,解决命名冲突,通过使用package,使得处于不同package中的类可以存在相同的名字第二,对类按功能进行分类,使项目的组织更加清晰。当开发一个有非常多的类的项目时,如果不使用package对类进行分类,而是把所有类都放在一个package下,这样的代码不仅可读性差,而且可维护性也不好,会严重影响开发效率。
 

13、如何实现类似于C语言中函数指针的功能

在C语言中,有一个非常重要的概念——函数指针,其最重要的功能是实现回调函数。什么是回调函数呢?所谓回调函数,就是指函数先在某处注册,而它将在稍后某个需要的时候被调用。在Windows系统中,开发人员想让系统动态链接库(Dynamic Link Library,DLL)调用自己编写的一个方法,于是利用DLL当中回调函数的接口来编写程序,通过传递一个函数的指针来被调用,这个过程就称为回调。回调函数一般用于截获消息、获取系统信息或处理异步事件。举个简单例子,程序员何吴编写了一段程序a,其中预留有回调函数接口,并封装好了该程序。程序员薛鹏要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调属于自己的程序b中的那个方法。

函数指针一般作为函数的参数来使用,开发人员在使用时可以根据自己的需求传递自定义的函数来实现指定的功能,例如,在实现排序算法时,可以通过传递一个函数指针来决定两个数的先后顺序,从而最终决定该算法是按升序还是降序排列。

在Java语言中没有指针的概念,那么如何才能在Java语言中实现类似于函数指针的功能呢?可以利用接口与类来实现同样的效果。具体而言,应先定义一个接口,然后在接口中声明要调用的方法,接着实现这个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数的功能,示例如下。
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 13
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值