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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 1,782评论 0 10
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 1,537评论 0 6
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,643评论 0 11
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,415评论 1 14
  • 好久未平静下来了,这也导致没法好好想一些问题。 记得周国平说过一句话,具体的已想不起来了,大意是人生的大问题往往是...
    夜安和柳阅读 172评论 0 2