Java基础知识(一)

目录

前言

1.数据类型

1.基本数据类型(primitive type):(从小到大及所占字节数)
bety(1)、short(2)、int(4)、long(8)、float(4)、double(8)、boolean、char。
2.除基本类型外,还包括枚举类型(enumeration ytype)、引用类型(reference type)

2.Java和JavaScript比较

1.开发公司

1.Java是由原Sun公司推出的面向对象的程序设计语言
2.JavaScript是由NetScape公司为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释型语言。

2.前身

JavaScript的前身是LiveScript;
Java的前身是Oak语言;

3.类型

Java是强类型语言;即Java中变量在编译之前必须做声明;JavaScript是弱类型语言;即在使用前不用做声明,解释器在运行时检查推断其数据类型;

4.动静态与面向和基于对象

1.Java是动态语言;是面向对象的程序设计语言
2.JavaScript是静态语言;是基于对象的解释性脚本语言。

一、面向对象和面向程序的区别

1)面向对象

关注事物主体。把事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个对事物在整个解决问题的步骤中的行为。
语言举例:Java、C++、C#、Python、Simula(第一个面向对象的语言)、Smalltalk(第一个支持动态类型的语言)
Simula – Simulation Language(模拟语言)
Smalltalk–Smalltalk程序语言

2)面向过程

分析出解决问题所需要的步骤和流程等,然后用函数把这些步骤依次实现,使用时依次调用函数。
语言举例:C语言、Fortran

二、面向对象的基本特征

3个(封装、继承、多态)
4个(抽象、封装、继承、多态)
1、说法一(三大基本特征)

1)封装

封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中读和修改的访问级别,将 抽象 得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和方法都是类的成员。
a、封装类举例:张三是人,人是一个封装类,张三是封装中的一个实例、一个对象。
b、对象的属性和行为举例:对象–兔子||属性–两只耳朵、一双眼、四条腿||行为–跑、跳、吃等。
c、目的:增强安全性和简化编程,因为使用者不必了解具体的实现细节,只是通过外部接口,以特定的权限来使用类的成员。

2)继承

从已有类得到信息创建新类的过程。
提供信息的类:父类、超类、基类。
得到信息创建的类:子类、派生类。
a、目的:提高代码的复用率、提高软件的可重用性与可扩展性

3)多态

不同子类型的对象(实例)对同一消息做出不同的响应。多态机制是具有不同内部结构的对象可以共享相同的外部接口。
a、多态的优点:消除类型之间的耦合关系、可替换性、可扩充性、接口性、灵活性、简化性。
b、多态存在的三个必要条件:继承、重写、父类引用指向子类对象(对象造型)。
继承、重写:子类继承父类并重写父类中已有的或抽象的方法。
父类引用指向子类对象:用父类引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为。
2、说法二(四大基本特征)

4)抽象

将一类对象的共同特征总结出构造类的过程,包括数据抽象和行为抽象,抽象只关注对象的行为和属性,不关注这些行为的细节。

三、面向对象的六原则一法则

1、单一职责原则

核心就是高内聚,即一个类只有一个职责,只做一件事。
“高内聚、低耦合”:提高模块的重用性与移植性。

2、开闭原则

关键就是抽象化,即软件实体应当对扩展开放,对修改关闭。软件实体应尽量在不修改原有代码的情况下进行扩展。
在代码编写时,先利用接口和抽象类构建好一个相对稳定的抽象层,而具体功能在实现层中编写,如果需要修改或扩充系统的行为,无需对抽象层进行改动,只需要增加新的具体类实现新的业务功能即可,达到在进行功能扩展时无需修改现有代码的效果。

3、依赖倒转原则

程序要依赖于抽象接口,不依赖于具体实现。
直白来说,面向接口编程。声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所代替。

4、里氏替换原则

任何时候都可以用子类型替换掉父类型。
里氏替换原则可以检查继承关系是否合理。违背里氏替换原则,继承关系一定错误,代码需要重构。

5、接口隔离原则

接口要小而专,绝不能大而全,不能把接口设计的过于臃肿和复杂。

6、合成聚合复用原则

优先使用合成或聚合关系复用代码。
组合和聚合都是对象建模中关联(Association)关系的一种,聚合表示整体和部分的关系,表示“含有”,整体有部分组合而成,部分可以脱离中体作为一个独立的个体存在。组合则是一种更强的聚合,部分组成整体,而且不可分割,部分不能脱离整体而单独存在。

7、迪米特法则

具体为“低耦合”,一个对象应该对其他的对象有尽可能少的了解,又叫最少知识原则。
由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
设计模式中,门面模式(Facade)和中介模式(Mediator),都是迪米特法则的例子。

四、类与类之间的关系

依赖关系(use-a)、关联关系(has-a)、继承关系(is-a)

五、设计模式

六、Jdk、jvm、jre的概述与关系

1.JRE

全称:JavaRuntime Environment(Java运行环境),jre 是java运行时环境,面向使用者,包含了jvm虚拟机(bin)、java基础类库(lib)。

2.JVM

全称:JavaVirtual Machine(Java虚拟机),它是是整个Java实现跨平台的最核心的部分,所有的java程序被编译为.class类文件,在虚拟机上执行。class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。

3.JDK

全称:JavaDevelopment Kit(Java开发者工具),JDK是Java开发工具包,面向开发者,使用Java语言编写程序的开发工具包提供给开发人员。JDK的包含文件
bin:最主要的是编译器(javac.exe)
include:java和JVM交互用的头文件
lib:类库jre:java运行环境

4.三者之间的关系

JDK是Java程序开发时用的开发工具包,其内部也有JRE运行环境。JRE是Java程序运行时需要的运行环境,就是说如果你光是运行JAVA程序而不是去搞开发的话,只安装JRE就能运行已经存在的JAVA程序了。JDK、JRE内部都包含Java虚拟机JVM,Java虚拟机内部包含许多应用程序的类的解释器和类加载器等等。

七、访问修饰符的区别

修饰符当前类同包子类其他包概括
Public(公共的)(全世界)
Private(私有的)×××(只有自己)
Friendly(友好的)××(同包可以访问)
Protected(保护的)×(同包和子类)

八、break与continue的区别

1.这两个语句都可以跳出循环;
2.break是终止循环,执行循环体以外的语句;continue是跳出本次循环,执行下一次循环。
3.在swtich判断中常用break表示结束循环。

九、switch 可以用哪些数据类型

1.可以是byte、short、int、char、枚举类型,从JDK1.7开始,支持String 类型。

十、char型变量中能否存储一个中文

Java里使用了Unicode编码格式,Unicode编码中一个char型占用2个字节,而汉字也是占用2个字节,所以可以存储中文汉字。

十一、静态变量与实例变量的区别

1.静态变量是被static修饰的变量,它属于类,不属于类的任何一个对象。
2.静态变量可以实现让多个对象共享内存。
3.实例变量必须依附于某个实例。必须先创建对象,通过对象才能访问它。

十二、int 与integer的区别

1.int是Java提供的八种原始类型之一,integer是Java为int提供的封装类。
2.int的默认值是0,integer的默认值是null。
3.integer提供了多种与整数相关的操作方法,int没有方法。

数据类型byteshortintlongfloatdoublebooleanchar
封装类ByteShortIntegerLongFloatDoubleBooleanCharacter

十三、Java中有没有goto

Java中goto是保留字,在目前版本中没有使用,还有一个是const。

十四、以下表达式是否有错误。

表达式判断原因
short s1 = 1;s1 = s1 + 1×1 是int类型,所以s1 + 1 也是int 类型,需要强制类型转换才能赋值给shrort型。
short s1 = 1;s1 = s1 + 1可以正常编译,s1 += 1,相当于s1 = (short)(s1 +1);其中有隐含的强制类型转换
float f = 3.4×3.4是双精度数(double)赋值给(float)属于向下转型会造成精度丢失,所以需要强制类型转换,

正确格式为:float f =(float) 3.4;float f = 3.4F;

十五、&和&&的区别

1.&运算符有两种用法:按位与、逻辑与。
2.&&运算符是短路与运算。
3.逻辑与和短路与虽然都要求“=”两端的布尔值都是true,整个表达式才是true。但是&&(短路与)如果左边的表达式为false,则右边的表达式会被直接短路掉,不会进行运算
4.逻辑运算符或(|)与短路或(||)的区别也是同样的。

十六、内存中堆、栈、静态区的用法

1.堆(heap):通过new关键字和构造器创建的对象放在堆中;
2.栈(stack):函数调用的现场保存都使用内存中的栈空间;
3.静态区(static area):程序中的字面量(literal)如:100、“hello”和常量都放在静态区中。
4.栈空间操作起来最快但是栈很小,通常大量的对象都放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用
例如:String str = new String(“hello”)
str存放在栈空间中,new 创建的字符串对象放在堆上,而”hello“这个字面量放在静态区。

十七、常用的数学方法

1.常用方法

方法含义应用结果
Math.ceil()向下取整Math.ceil(15.5);Math.ceil(-15.5)15;-16
Math.floor()向上取整Math.ceil(15.5);Math.ceil(-15.5)16;-15
Math.round()四舍五入向上取整Math.ceil(15.5);Math.ceil(-15.5)
Math.random()0-1的随机数Math.random()【0,1)左闭右开
Math.sqrt()开方
Math.PI()ΠSystem.out.println(“PI 常量的值:” + Math.PI);PI 常量的值:3.141592653589793
Math.pow()次方
Math.E对数System.out.println(“E 常量的值:” + Math.E);E 常量的值:2.718281828459045

注释:四舍五入时,float返回int型,double返回long型

十八、最有效率的计算2乘以8

位移运算符(2<<3左移相当乘以2的3次方;2>>3右移相当于除以2大的3次方)。

十九、数组和String 有没有length()方法

1.数组没有length()方法,有length属性;
2.String有length()方法;
3.在JavaScript中,获取字符串的长度通过length属性获得。

二十、在Java中,如何跳出当前的多重嵌套循环。

在最外层循环前加一个标记A,然后breakA;可以跳出多重循环。

A:for(int i = 0 ; i<10; i++){
		for(int j = 0;j<10;j++) {
		System.out.print(j);
		if(i==2){
		break A;
		}
		}
		}
}

输出结果:012345678901234567890

二十一、构造器(构造方法)是否可以被重写

构造器是生产对象的一个途径,构造器是不能被继承的,因为构造器名称与类名相同,因为构造器不能被继承,所以就不能被重写,但是在同一类中,构造器是可以被重载的。

二十二、重写与重载

英文汉语解释
Overload重载首先是一个类、多个方法;方法名称相同,参数的个数、类型、顺序不同而构成重载,返回值无所谓。
Override重写首先是两个类,子类覆盖父类的方法,当new出子类看作父类的时候,调用的是子类的方法;

方法的重载和重写都是实现多态的方式,区别在于重写实现的是编译时的多态性,重载实现的是运行时的多态性。
重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏替换原则)。重载对返回类型没有特殊的要求。

二十三、.equals比较与hash code

1.equals比较为真,则hash code 相同,对象相同;
2.hash code 相同,则值不一定相同。

二十四、类文件的加载过程

1.类文件的加载过程

类文件又称为 .java文件类的加载是指把类的 .class文件中数据读入到内存中,通常是创建字节数组读入.class文件,然后产生与所加载类对应的 Class对象,加载完成后就进入连接阶段,最后JVM 对类进行初始化。

2.连接阶段

2.1、验证:为了确保 .class文件的字节码中包含的信息符合当前虚拟机的要求,并不会危害虚拟机的自身安全。
2.2、准备:为静态变量分配内存并设置默认的初始值。
2.3、解析:将常量池中的符号引用替换为直接引用的过程。

3.初始化

3.1、如果本类存在直接的父类,并且这个类还没有被初始化,那么就先初始化父类;
3.2、如果类中存在初始化语句,那么就依次执行初始化语句。

二十五、值传递与引用传递

在Java中只有值传递;
1.值传递:在调用一个方法时,不管方法参数是基本数据类型,还是引用数据类型,传递给方法的就是对象的真实数据值。
2.引用传递:在调用一个方法时,传递的就是真正引用的内存地址。

二十六、String 类是否可以被继承

String 类是final类,不可以被继承。
对String类最好的重用关系是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。

二十七、String和StringBuilder、StringBuffer的区别

Java提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味String应用的字符串是不能被改变的。而StringBuffer/StringBuilder 类表示的字符串对象可以直接进行更改。StringBuilder是Java5中引入的,它和StringBuffer的方法完全相同,区别在于他是在单线程环境下使用的,因为他的所有方面都没有被synchronized修饰,因此他的效率也比StringBuffer高。

二十八、抽象类和接口有什么异同

抽象类(abstract class)和接口(interface)

抽象类接口
可以有构造方法不能有构造方法
可以有普通成员变量不能有普通成员变量(接口内都是静态常量)
可以包含非抽象的普通方法所有方法必须是抽象的
抽象方法的访问类型可以是public、protected、默认类型接口内的方法只能是public,并且默认为public static类型
可以包含静态方法不能包含静态方法
抽象类中的静态成员变量的访问类型可以任意接口中定义的变量只能是public static final,并且默认即为public static类型

一个类可以实现多个接口,但只能继承一个抽象类。
抽象类和接口都不能实例化,但可以定义抽象类和接口的引用。

二十九、静态嵌套类和内部类的区别

静态嵌套类(Static Nested Class)
内部类(Inner Class)
静态嵌套类是被声明为静态的内部类,它可以不依赖外部类实例被实例化。而通常的内部类需要在外部类实例化后才能被实例。

三十、Java中会存在内存泄漏吗

理论上不会,因为Java中存在垃圾回收机制(GC)不会存在内存泄漏问题;然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此会导致内存泄露的发生。
例如:hibernate 的Session(一级缓存)中的对象属于持久态,垃圾回收是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄漏。

三十一、在接口(API)中可以是否写方法体

在jdk1.8版本之后,接口中可以写方法体,但是必须是由static、default修饰。

public interface Mytest{
public void test();
void test();
public static void mymethod(){
System.out.println("是个人!!");
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值