java-必须要知道的基本概念

最近准备面试与笔试有许多的东西,同时也是在看一本《java程序员面试笔试宝典》,想着就是自己看一个知识点小结然后记录一下。


前言

有的人学习了很久的java,但是对于java的很多基本的东西都不是很了解,我就是这样的一个人,以至于有一次被问到基本数据类型时,我说String也是基本数据类型一样。同时看了这本经典的书籍给我的感悟是东西要学精才能出众。


一、java语言优点有哪些?

一样东西,没有任何的优点那么人们为什么要去用这个东西呢?就像人一样你没有任何的优点别人就不会让你做事。

  1. java为纯面向对象的语言,《java编程思想》中提到java语言是一种“Everything is object”的语言,它能够直接反应现实社会生活中的对象,列如火车、动物等,因此通过它,开发人员编写程序更为容易。
  2. 平台无关性。java语言可以“一次编译,到处运行”。无论是在Windows平台还是在Linux、MacOs等其他平台上对java程序进行编译,编译后的程序在其它平台上都可以运行。由于java为解释型语言,编译器会把java代码变成“中间代码”,然后在java虚拟机(jvm)上解释执行。由于中间代码与平台无关,因此,java语言可以很好地跨平台执行,具有很好的可移植性。
  3. java提供了很多内置的类库,通过这些类库,简化了开发人员的程序设计工作,同时缩短了项目的开发时间,例如:java语言提供了对多线程的支持,提供了对网络通信的支持,最重要的是提供了垃圾回收器,这使得开发人员从对内存的管理中解脱出来。
  4. 提供了Web应用开发的支持,例如:Applet、Servlet和jsp可以用来开发Web应用程序;Socket、RMI可以用来开发分布式应用程序的类库。
  5. 具有较好的安全性和健壮性。java语言经常被用在网络环境中,为了增强程序的安全性,java语言提供了一个防止恶意代码攻击的安全机制(数组边界检测和Bytecode校验等)。java的强类型机制、垃圾回收器、异常处理和安全检查机制使得用java语言编写的程序有很好的健壮性。
  6. 去除了C++语言中难以理解、容易混淆的特点,例如头文件、指针、结构、单元、运算符重载、虚拟基础类、多重继承等,使得程序更加严谨、简洁。

C++语言是一种静态数据类型检查、支持多重编程范式的通用程序设计语言,它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。java语言是一种面向对象语言,从语法结构上看,与C++类似。

二、java与C/C++的异同

首先,我的C/C++的基础基本为零,这样的对比让我对C++有了一定的了解。

  • java与C++都是面向对象的语言,都使用了面向对象思想(例如:封装、继承、多态等),由于面向对象有许多非常好的特性(继承、组合【这个我反正是不理解没见过,后面会有】)因此二者都有很好的可重用性。下面主要介绍它们的不同点。
  1. java为解释性语言,其运行过程为:程序源代码经过java编译器编译成字节码,然后由jvm解释执行。而C/C++为编译型怨言,源代码经过编译和链接后生成可执行的二进制代码。因此java执行速度比C/C++慢,但是java能够跨平台执行,而C/C++不能。
  2. java为纯面向对象语言,所有代码(包括函数。变量等)必须在类中实现,除基本数据类型(包括int、float等)外,所有类型都是类。此外,java语言中不存在全局变量或者全局函数,而C++兼具面向过程编程的特点,可以定义 全局变量和全局函数。
  3. 与C/C++语言相比,java语言中没有指针的概念,这有效防止了C/C++语言操作指针可能引起的系统问题,从而使程序变得更加安全。
  4. 与C++语言相比,java语言不支持多重继承,但是java语言引入了接口的概念,可以同时实现多个接口。由于接口也具有多态性,因此在java语言中可以实现多个接口来实现与C++语言中多重继承类似的目的。
  5. 关于内存的分配,C/C++需要开发人员自己来分配,而java因为jvm的存在不需要自己来进行这样的操作。

关于jvm可以回去看上上篇关于jvm

三、main函数这个方法

  • 了解jvm的就应该知道吗,main方法这个函数方法的作用,在jvm的图解中有一个运行时数据区这样一个区域,在这个区域中有一个java栈的栈空间。栈管运行,堆管存储从这句话中可以知道每一方法函数都会被收入到java栈中进行存储,那么是所有的方法都进入吗?看来不是的,有一个入口叫做main函数由public修饰以及static修饰,在程序运行时这个main方法会首先进入栈中,然后后面的程序一次进入。这个main是jvm识别的特殊方法名。String[] args字符串数组参数args为开发人员在命令行状态下与程序交互提供的一种手段。

四、在main方法前输出“你好”

  • 大家都知道,在java语言中,mian()方法是程序的入口方法,在程序运行时,最先加载的就是main方法,但是mian方法不是程序运行时第一个被执行的模块。在java中,由于静态块在类的加载时就会被调用,因此可以在main方法执行前利用这个静态块进行输出。
public class Test{
static{
	System.out.print("你好");
	}
}
public static void main(String[] args){
	System.out.print("你好22");
}

五、java程序初始化顺序

  • 在java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
  • java程序的初始化一般遵循3个原则(优先级依次递减)

1.静态对象(变量)优先于非静态对象(变量)初始化,其中。静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。
2.父类优先于子类进行初始化。
3.按照成员变量的定义顺序进行初始化。基石变量定义散布于方法定义之中,他们依然在任何方法(包含构造函数)被调用之前初始化。

  • java程序初始化工作可以在许多不同的代码块中来完成(例如静态代码块、构造函数等),它们执行的顺序如下:

父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。

六、java中的作用域

  • 在计算机程序中,声明在不同地方的变量具有不同的作用域,例如局部变量、全局变量等。在java语言中,作用域是由花括号的位置决定的,它决定了其定义的变量名的可见性与生命周期。
  • java语言中,变量的类型主要有3种:成员变量、静态变量和局部变量。类的成员变量的作用范围与类的实例化对象的作用范围相同,当类被实例化时,成员变量就会在内存中分配空间并初始化,直到这个实例化对象的生命周期结束时,成员变量的生命周期才结束。被static修饰的成员变量被称之为静态变量或者全局变量,与成员变量不同的是,静态变量不依赖于特定的实例,而是被所有实例所共享,也就是说,只要一个类被加载,jvm就会给类的静态变量分配存储空间。因此,就可以通过类名和变量名来访问静态变量。局部变量的作用域与可见性为它所在花括号内。
  • 此外成员变量也有4中作用域,区别如下:
    在这里插入图片描述

public:表明该成员变量或者方法对所有类或者对象都是可见的,所有类或对象都是可以直接访问的。
private:表明该成员变量或者方法是私有的。只有当前类对其具有访问权限,除此之外的其他类或者对象都没有访问权限。(外部可以通过特定的方法进行访问get/set)
protected:表明该成员变量或者方法对自己以及其子类是可见的,即自己和子类具有权限访问。除此之外的其他类或者对象都没有访问权限。
default:表明该成员变量或者方法只有自己和其位于同一包内的类可见。若父类与子类位于同一个包内,则子类对父类的default成员变量或者方法都有访问权限;若父类与子类位于不同的package(包)内,则没有访问权限。

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

七、一个java文件中是否可以定义多个类

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

八、什么是构造函数

  • 构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。在java语言中,构造函数具有以下特点。
  1. 构造函数的名称必须与类名相同,并且不能有返回值(返回值也不能为void)
  2. 每个类可以有多个构造函数。当开发人员没有提供构造函数时,编译器在把源代码编译成字节码的过程中会提供一个没有参数默认的构造函数,但是该构造函数不会执行任何代码。如果开发人员提供了构造函数,那么编译器就不会再创建默认的构造函数了。
  3. 构造函数可以有0个、一个或者1个以上的参数。
  4. 构造函数总是伴随着new操作一起调用,且不能由程序的编写者直接调用,必须要由系统调用。构造函数在对象实例化时会被自动调用,且只运行一次;而普通的方法是在程序执行到它时被调用,且可以被该对象调用多次。
  5. 构造函数的主要作用是完成对象的初始化工作。
  6. 构造函数不能被继承,因此,它不能被覆盖,但是构造函数能够被重载,可以使用不同的参数或者参数类型来定义多个构造函数,
  7. 子类可以通过super关键字来显式地调用父类的构造函数,当父类没有提供无参数的构造函数时,子类的构造函数中必须显式地调用父类的构造函数。如果父类提供了无参数的构造函数,此时子类的构造函数就可以不显式地调用父类的构造函数,在这种情况下编译器会默认调用父类提供的无参数构造函数。当有父类时,在实例化对象时会先执行父类的构造函数,然后执行子类的构造函数。
  8. 当父类和子类都没有定义构造函数时,编译器会为父类生成一个默认的无参数的构造函数,给子类也生成一个默认的无参数的构造函数。此外,默认构造器的修饰符只能跟当前类的修饰符有关(例如:如果一个人类被定义为public,那么它的构造函数也是public)

引申:普通方法是否可以与构造函数同名。可以。

九、为什么java中有些接口没有任何方法

  • 由于java不支持多重继承,既一个类只能有一个父类,为了克服单继承的缺点,java语言引入了接口这一概念。接口是抽象方法定义的集合,是一种特殊的抽象类 。接口中只包含方法的定义,没有方法的实现。接口中的所有方法都是抽象的。接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final 修饰。由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接达到多重继承的目的。
  • 在java语言中,有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识接口对实现它事务类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型。这个标签类似于汽车的标识图标,每当人们看到一个汽车的标识图标时,就能知道这款汽车的品牌(这里就有点多态的味道了)。java类库中已经存在的标识接口Cloneable和Serializable等。在使用时会经常用instanceof来判断实例对象的类型是否实现了一个给定的标识接口。

十、java中的clone方法有什么作用

首先:我也不知道自己学了什么鬼,这个都不知道是什么

  • 在实际编程中

经常会遇到从某个已有的对象A创建出另外一个与A具有相同状态的对象B,并且对B的修改不会影响到A的情况,例如,Prototype(原型)模式中,就需要clone一个对象实例。在java语言中,仅仅通过简单的赋值操作显然无法达到这个目的,而java提供了一个简单有效的clone()方法来满足这个需求。

  • java中的所有类默认都继承自Object类,而Object类中提供了一个clone()方法。这个方法的作用是返回一个Object对象的复制。这个复制函数返回的是一个新的对象而不是一个引用。下面是使用clone()方法的步骤:

1、实现clone的类首先需要继承来自Cloneable接口。Cloneable接口实质上是一个标识接口,没有任何方法。
2、在类中重写Object类中的clone()方法。
3、在clone方法中调用super.clone()。无论clone类继承结构是什么,super.clone()都会直接或间接调用java.lang.Object类的clone()方法。
4、把浅复制的引用指向原型对象的克隆体。

  • 浅复制与深复制的区别?

浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有对其它对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的对象。换言之,深复制把复制的对象所引用的对象都复制了一遍。

十一、什么是反射机制

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

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

  • 在反射机制中,class是一个非常重要的类,那么如何才能获取class类呢?下面是三种方式:

1.class.forName(“类的路径”)
2.类名.class
3.实例.getClass

十二、package有什么作用

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

具体而言有两个作用:
1、提供多层命名空间,解决命名冲突。
2、对类按功能进行分类,使项目的组织更加清晰。


总结

这里是关于java基础的基本概念,是来自于《java程序员面试笔试经典》,看得是书,看一遍后自己对每个版块进行了大致的理解以及部分的总结。手敲与手写。感想很简单,精于一门吧。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值