javaGuide 学习笔记1

开始时间:2021/9/21 13:41
学习源网址:JavaGuide

java基础概念与常识

JAVA特点:简单易学;面向对象(封装,继承,多态);平台无关性(通过Java虚拟机实现平台无关性);支持多线程;可靠,安全;支持网络编程;编译与解释共存;

JVM:java虚拟机,运行java字节码的虚拟机,针对不同系统的特定实现,使用相同的字节码,给出相同的结果。*字节码:JVM可以理解的代码就叫字节码,就是扩展名为.class的文件。
从源代码(.java)到运行程序一般有三步:

 

 JDK和JRE

jdk是Java Development Kit的缩写,拥有JRE所拥有的一切,还有编译器(javac)和工具(jdb)。能够创建和编译程序。JRE是java运行时环境,可以运行已编译过的java程序所有内容集合,包括Java虚拟机(JVM),Java类库,java命令和一些其他的基础构件。但是JRE不能用于运行创建新程序。如果你只是为了运行一下 Java 程序的话,那么你只需要安装 JRE 就可以了。如果你需要进行一些 Java 编程方面的工作,那么你就需要安装 JDK 了。

Java语言“编译与解释并存”

编程语言执行方式分为编译型和解释型两种。编译型是一次性翻译成可执行的机器码,解释型是指对源程序逐行解释成特定平台的机器码。Java语言既有编译型语言的特征,也有解释型语言的特征,因为Java程序要经过先编译,后解释两个步骤。

Java和C++的区别

都是面向对象的语言,都支持封装继承和多态;Java不提供指针来直接访问内存,程序内存更加安全;Java类是单继承的,C++支持多继承,虽然java类不可以多继承,但是接口可以多继承;Java有自动内存管理垃圾回收机制,不需要程序员手动释放无用内存。C++同时支持方法重载和操作符重载,但是java只支持方法重载,操作符重载增加了复杂性,这与Java最初的设计思想不符。

continue、break、return区别

continue:跳出当前这一次循环,继续下一次循环;
break:跳出整个循环体,去执行循环后的语句;
return:跳出所在方法,结束该方法的运行。

泛型

java泛型是JDK5中引入的一个新特性,本质是参数化类型。

==和equals()方法的区别

equals()方法的两种使用情况:
类没有覆盖equals方法时,等价于==比较这两个对象;
类覆盖了equals方法时,用方法中的属性判断是否相等。

hashCode()与equals()

为什么重写equals时必须重写hashCode方法?

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
哈希码通用约定:

1、在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回 同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。

2、如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。

3、如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。

如果两个对象相等,则哈希值一定也是相同的。但是两个对象哈希值相同时,它们不一定是相等的。因此,equals方法别覆盖过,则哈希值方法也必须被覆盖。

基本数据类型

java中有八种基本数据类型,分别为:
6种数字类型:byte,short,int,long,float,double
1种字符类型:char
1种布尔型:boolean

这八种数据类型默认值和所占空间如下:


 

 注意:

1、java里使用long类型的数据一定要在数值后加上L,否则自动转化为整型解析。

2、char a='h',char字符类型使用单引号;String a=“hello”:字符串类型使用双引号。

这八种基本类型都有对应的包装类分别为:ByteShortIntegerLongFloatDoubleCharacterBoolean 。

包装类不赋值就是Null,而基本类型有默认值而且不是Null。

基本数据类型都直接放在jvm栈内存的局部变量表中,而包装类型是对象类型,放在堆内存中。因此相比于对象类型,基本数据类型所占用的空间非常小。

装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类转化为基本数据类型;

8种基本类型的包装类和常量池

java基本类型的包装类的大部分都实现了常量池技术。
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在[0,127]范围的缓存数据,Boolean 直接返回 True Or False
如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。
两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。
注:所有整形包装类对象之间的比较,应全部使用equals方法比较。

Java的方法(函数)

在一个静态方法内调用一个非静态成员为什么是非法的?
这个需要结合JVM的相关知识,静态方法是属于类的,在类加载时就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才存在,然后通过类的实例对象去访问。在类的非静态成员不存在时静态成员就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。

静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不允许访问实例成员(即实例成员变量和实例方法),而实例方法不存在这个限制。

Java值传递

Java程序语言设计总是采用按值调用,也就是说,方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。

通过JavaGuide的三个例子可以看出,首先,一个方法不能修改一个基本数据类型的参数,而当对象的引用作为参数时就不一样。
当调用对象的引用时,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。如下图所示:

 总结:

  • 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
  • 一个方法可以改变一个对象参数的状态。
  • 一个方法不能让对象参数引用一个新的对象 

Java中重载和重写的区别

重载就是同一个方法,根据输入数据的不同,做出不同的处理;
重写就是当子类继承自父类的相同方法,输入数据一样,单要做出有别于父类的响应时,就需要覆盖父类方法。

重载

发生在同一个类,或者父类和子类之间,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
综上:重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。

重写

重写发生在运行期间,是子类对父类的允许访问的方法的实现过程进行重新编写。
1、返回值类型、方法名、参数列表必须相同,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
2、如果父类方法访问修饰符为private/final/static则子类就不能重写该方法,但是被static修饰的方法能够被再次声明。
3、构造方法无法被重写。
综上:重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变。

图表总结:

深拷贝和浅拷贝

  1. 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
  2. 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

面向对象与面向过程的区别

面向过程性能比面向对象高,因为类调用的时候需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素时,比如单片机、嵌入式开发、linux/unix等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。

面向对象易维护、易复用、易扩展。

成员变量与局部变量的区别

1、成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或者是方法的参数;成员变量可以被public,private,static等修饰符修饰,而局部变量不能被访问控制修饰符static所修饰;但是,成员变量和局部变量都能被final所修饰。
2、从变量在内存的存储方式来看,如果成员变量是使用static修饰的,那么这个变量是属于类的,如果没有static修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量存在于栈内存。
3、从变量在内存的生存时间上看,成员变量是内存的一部分,它随着对象的创建二存在,而局部变量随着方法的调用而自动消失。
4、从变量是否有默认值来看,成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种例外情况:被final修饰的成员变量也必须被显示地赋值),而局部变量不会被自动赋值。

Java中的堆与栈

在java中,声明的对象先是在栈内存中为其分配地址空间;在对其进行实例化(用new构建)后则在堆内存中为其分配地址。

在函数中顶一顶一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,
当超过变量的作用域后,Java会自动释放掉该变量的内存空间,该内存的空间可以立即被另作它用。

堆内存用来存放用new创建的对象和数组,在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理。

 创建一个对象用什么运算符?对象实体和对象引用有何不同?

new运算符,new创建对象实例(存储在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
一个对象引用可以指向0或者1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)。

对象的相等和指向他们的引用相等,两者有什么不同?

对象的相等,比的是堆内存中存放的内容是否相等。而引用相等,比较的是他们指向的内存地址是否相等。

一个类的构造方法的作用是什么?如果一个类没有声明构造方法,该程序能正确执行吗?为什么?

构造方法主要作用是完成对类对象的初始化工作。如果一个类没有声明构造方法,也可以执行!因为会默认不带参数的构造方法。如果我们自己添加了类的构造方法(无论是否有参),Java就不会再添加默认的无参数的构造方法了,这时候,就不能直接new一个对象而不传递参数了。如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩坑。

构造方法有哪些特点?是否可被override?

特点:

1、名字与类名相同。
2、没有返回值,但不能用void声明构造函数。
3、生成类的对象时自动执行,无需调用。

构造方法不能被override(重写),但是可以被overload(重载),所以你可以看到一个类中有多个构造函数的情况。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值