美文网首页
Java从入门到入坑(基础篇)

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

作者: 小小弓长张 | 来源:发表于2019-02-27 17:14 被阅读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

    相关文章

      网友评论

          本文标题:Java从入门到入坑(基础篇)

          本文链接:https://www.haomeiwen.com/subject/mrihyqtx.html