Java从入门到入坑(基础篇)

2019-02-27  本文已影响0人  小小弓长张

01:面向对象

1:什么是面向对象

面向对象,面向过程

面向对象的三大基本特征和五大基本原则

三大特性:封装,继承,多态。

五大基本原则:

1:万物皆对象,2:程序是对象的集合,他们通过发送消息来告知彼此所要做的,3:每个对象都有自己的由其他对象所构成组成,4:每个对象都有其类型,5:某一特定类型的所有对象都可以接受同样的消息。

对象具有状态,行为和标识。

2:Java的垮平台性

Java如何实现垮平台性

Java是通过Java虚拟机(jvm)实现跨平台性的。jvm是一个软件,不同的平台有不同的版本,我们编写的Java源码,编译后会生产.class的Java源文件(字节码文件),jvm就是负责将字节码文件翻译成特定平台下的机器码然后运行。不同的平台需要安装不同的jvm。而在这个过程中我们的Java程序没有任何改变,通过jvm实现了一次编译,多处运行的目的。

跨平台的是Java程序,不是jvm,jvm是用c/c++开发的,使用来将字节码文件编译成机器码的。机器码不能快平台,不同的平台需要安装不同版本的jvm。

JVM还支持那些语言(kotlion ,Groovy ,JRuby ,Jython,Scala)

还有:Java,clojure,Ceylon,Eta,Haxe

3:值传递

值传递,引用传递

值传递:在方法调用过程中,实际参数把他的值传递给对应的形参,此传递过程中就是将实参的值复制一份传递到函数中,这样在函数中对该值进行改变,就不会影响到实参的值,

引用传递:在方法的调用的时候,将对象地址的值传递过去,函数接受的是原始值的首地址值。在方法调用过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的都是源数据,所以方法的执行将会影响到实际对象。

基本数据类型的传值,对形参的修改不会影响到实际参数;引用传递,形参和实参指向同一内存地址同一对象,对参数指向对象内容修改时会影响到实际对象,String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。

为什么说Java中只有值传递。

https://blog.csdn.net/bjweimengshu/article/details/79799485

4:封装,继承,多态

什么是多态,方法重载和重写

多态是具有表现多种形态的能力的特征,同一个实现接口,使用不同的实例而执行的不同操作。

多态的作用就是消除类型之间的耦合关系。

重载:同一个类的同名方法,要求方法名相同,参数列表不同,与返回值类型无关。

重写:子类和父类之间的同名方法,要求方法名相同,参数列表相同,返回值类型相同(或者是其子类)。

Java的继承与实现

继承通过extends关键字来实现,不可以使用private和protected修饰类。Java中只支持单继承,每个类只有一个父类,所有的类都直接或间接的继承了Java。lang。object类

继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里。

继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。

无法继承private修饰的属性和方法。

无法继承父类的构造方法。

构造函数与默认构造函数

创建对象时初始化对象,为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中,一个类可以有多个构造函数,可以根据参数类型和参数个数的不同来区分他们,就是构造函数的重载。如果类里面没有构造函数,那么编译器会默认加上一个无参且方法体为空的构造函数。

构造函数必须与类名相同,包括大小写。

构造函数没有返回值,也不能用void修饰,如果给构造函数前面添加了返回值类型,那么这个构造函数就是一个普通方法,在运行时会产生找不到构造方法的错误。

一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。

类变量,成员变量与局部变量

类变量:

归属类的变量,在定义类的属性时,增加static修饰符,所以又称之为静态变量,类变量可以通过类名+点+变量名来操作

成员变量:

1:成员变量定义在类中,在整个类中都可以被访问。

2:成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象的堆内存中。

3:成员变量有默认初始化值。

局部变量:

1:局部变量只定义在局部范围内。(如:函数内,语句内,只在所属区域内有效)

2:局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。

3:局部变量没有默认初始化值。

成员变量和方法作用域

在Java中,变量的作用域分为四个级别:类级、对象实例级、方法级、块级。

类级变量又称全局级变量或静态变量,需要使用static关键字修饰。类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化。 对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问。 方法级变量就是在方法内部定义的变量,就是局部变量。

说明:

方法内部除了能访问方法级的变量,还可以访问类级和实例级的变量。

块内部能够访问类级、实例级变量,如果块被包含在方法内部,它还可以访问方法级的变量。

方法级和块级的变量必须被显示地初始化,否则不能访问。

02:Java基础

1:基本数据类型

8种基本数据类型

byte,short,int,long,boolean,double,float,char

整形中byte,short,int,long的取值范围

byte(字节型)默认值是0,最大值:127(2^7-1),最小值:-128(-2^7)

short(短整型)默认值是0,最大值:32767(2^15 - 1),最小值:-32768(-2^15)

int(整形)默认值是0,最大值:2,147,483,647(2^31 - 1),最小值:-2,147,483,648(-2^31)

long(长整型)默认值是0L,最大值:9,223,372,036,854,775,807(2^63 -1),最小值:-9,223,372,036,854,775,808(-2^63)

什么是浮点型,什么是单精度和双精度

float(单精度)double(双精度)

为什么不能用浮点型表示金额

金额计算要使用BigDecimal

会产生丢失精度的问题,我们在程序里写的是10进制的小数,计算机内部无法用二进制的小数来精确表达。

正确的做法是:统一用字符串保存,然后在工具类里面将字符串进行格式化为BigDecimal

2:自动装拆箱

什么是基本类型,什么是包装类型,什么是自动装拆箱

基本类型就是Java的八种基本类型byte,short,int,long,boolean,double,float,char

包装类型就是与基本类型所对应的包装类Byte,Short,Integer,Long,Boolean,Double, Float,Character

将基本数据类型转换为包装类型称之为装箱。

将包装类型装换为基本类型称之为拆箱。

Integer的缓存机制

3:String

字符串的不可变性

一但一个字符串在堆内存创建,它是不能被改变的,我们应该注意所有的关于String类的方法不是改变一个字符串本身,而是重新返回一个新的字符串。如果我们需要一个频繁的改变一个字符串对象,我们可以使用StringBuffer或者StringBuilder,否则将会浪费大量时间进行垃圾回收,因为每次创建一个新的字符串。

JDK6和JDK7中的substring的原理及区别,

replaceFirst,replaceAll,replace区别,

String对+的重载,字符串的几种拼接方式和区别

String.valueOf和String和.toSting的区别

string是标准类型的转换,将对象强制转换为String类型,前提是该对象必须能保证转成String类型,否则将抛出ClassCastException异常

。toString方法返回对象本身,在Java。lang。Object类中也有toString()方法,所以Java对象都可以调用此方法,但使用时必须保证要转换的对象不为null,否则将抛出NullPointerException异常。

String。valueOf()不用担心Object为null,但是用的时候也要小心,当Object为Null时,它的返回值时”null“。而不是null,有区别。

switch对String的支持

字符串池,常量池(运行时常量池,Class常量池),intern

4:熟悉Java中的各种关键字

transient, instanceof, final, Static , volatile , synchronized , const原理及用法

5:集合类

常用集合类的使用,ArrayList和LinkedList和vector的区别,synchronizedList和vector的区别,

HashMap,HashTable,ConcurrentHashMap的区别

Set和List区别,Set如何保证元素不重复

Java8 中stream相关用法,Apache集合处理工具类的使用,不同版本JDK中的HashMap的实现区别及原因

Collection 和 Collections 区别

Arrays.asList 获得的 List 使用时需要注意什么

Enumeration 和 Iterator 区别

fail-fast 和 fail-safe

CopyOnWriteArrayList、ConcurrentSkipListMap

6:枚举

枚举的用法、枚举的实现、枚举与单例、Enum 类

Java 枚举如何比较

switch 对枚举的支持

枚举的序列化如何实现

枚举的线程安全性问题

7:IO

字符流、字节流、输入流、输出流、

同步、异步、阻塞、非阻塞、Linux 5 种 IO 模型

BIO、NIO 和 AIO 的区别、三种 IO 的用法与原理、netty

8:反射

反射与工厂模式、反射有什么用

Class 类、java.lang.reflect.*

9:动态代理

静态代理、动态代理

动态代理和反射的关系

动态代理的几种实现方式

AOP

10:序列化

什么是序列化与反序列化、为什么序列化、序列化底层原理、

序列化与单例模式、protobuf、为什么说序列化并不安全

11:注解

元注解、自定义注解、Java 中常用注解使用、注解与反射的结合

Spring 常用注解

12:JMS

什么是 Java 消息服务、JMS 消息传送模型

13:JMX

java.lang.management.*、 javax.management.*

14:泛型

泛型与继承、类型擦除、泛型中 KTVE? object 等的含义、泛型各种用法

限定通配符和非限定通配符、上下界限定符 extends 和 super

List<Object> 和原始类型 List 之间的区别? 

List<?> 和 List<Object> 之间的区别是什么?

15:单元测试

junit、mock、mockito、内存数据库(h2)

16:正则表达式

java.lang.util.regex.*

17:常用的Java工具库

commons.lang、commons.*...、 guava-libraries、 netty

18:API  &  SPI

API、API 和 SPI 的关系和区别

如何定义 SPI、SPI 的实现原理

19:异常

异常类型、正确处理异常、自定义异常

Error 和 Exception

异常链、try-with-resources

finally 和 return 的执行顺序

20:时间处理

时区、冬令时和夏令时、时间戳、Java 中时间 API

格林威治时间、CET,UTC,GMT,CST 几种常见时间的含义和关系

SimpleDateFormat 的线程安全性问题

Java 8 中的时间处理

如何在东八区的计算机上获取美国时间

21:编码方式

Unicode、有了 Unicode 为啥还需要 UTF-8

GBK、GB2312、GB18030 之间的区别

UTF8、UTF16、UTF32 区别

URL 编解码、Big Endian 和 Little Endian

如何解决乱码问题

22:语法糖

Java 中语法糖原理、解语法糖

语法糖:switch 支持 String 与枚举、泛型、自动装箱与拆箱、方法变长参数、枚举、内部类、条件编译、 断言、数值字面量、for-each、try-with-resource、Lambda 表达式

03:阅读源代码

String、Integer、Long、Enum、

BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、

ArrayList & LinkedList、 

HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSet

04:Java并发编程

1:并发与并行

什么是并发、什么是并行

并发与并行的区别

2:什么时线程,与进程的区别

线程的实现、线程的状态、优先级、线程调度、创建线程的多种方式、守护线程

线程与进程的区别

3:线程池

自己设计线程池、submit() 和 execute()、线程池原理

为什么不允许使用 Executors 创建线程池

4:线程安全

死锁、死锁如何排查、线程安全和内存模型的关系

5:锁

CAS、乐观锁与悲观锁、数据库相关锁机制、分布式锁、偏向锁、轻量级锁、重量级锁、monitor、

锁优化、锁消除、锁粗化、自旋锁、可重入锁、阻塞锁、死锁

6:死锁

什么是死锁

死锁如何解决

7:synchronized

synchronized 是如何实现的?

synchronized 和 lock 之间关系、不使用 synchronized 如何实现一个线程安全的单例

synchronized 和原子性、可见性和有序性之间的关系

8:volatile

happens-before、内存屏障、编译器指令重排和 CPU 指令重

volatile 的实现原理

volatile 和原子性、可见性和有序性之间的关系

有了 symchronized 为什么还需要 volatile

9:sleep和wait

10:wait和notify

上一篇下一篇

猜你喜欢

热点阅读