Java经典知识复习
1、自增变量
int i = 1;
i = i++;
int j = i++;
int k = i + ++i * i++;
问i、j、k分别等于?
针对这类题目,
1. 赋值操作=,最后计算;
2. = 右边的从左到右依次压入操作数栈中;
3. 实际先算哪个看符号的优先级;
4. 自增、自减操作都是直接修改变量的值,不需要经过操作数栈;
5. 最后赋值之前,临时结果也是存储在操作数栈中。
所以,本题答案为:i = 4;j = 1;k = 11
逐步分析:
int i = 1;
i = i++; // 先执行=右边的i++,i=1压入操作数栈,i自增为2,再执行赋值操作,将操作数栈的1赋值给i,最终i=1
int j = i++; //同上,j=1, 但是i没有被重新赋值,故i执行自增i=2;
int k = i + ++i * i++;
// i = 2 压入操作数栈中,
// ++i 先自增后赋值,i=3压入操作数栈中;
// i++ 先赋值后自增,i=3先压入操作数栈中,再赋值自增i=4;
// k = 2 + 3 * 3 = 11;
ps:我们可以将前自增和后自增理解为2个不同的函数:
i++:先返回值,i再自增
++i:i自增后再返回
2、单例模式(Singletion)
Singletion:单例设计模式,即某个类在整个系统中只能有一个实例对象可以被获得和使用的代码模式,是软件开发中最常用的设计模式之一。
例如:代表JVM运行的Runtime类
要点:
· 某个类只能有一个实例;
- 构造器私有化
· 必须自行创建这个实例;
- 含有一个该类的静态变量来保存这个唯一实例
· 必须自行向整个系统提供这个实例;
- 对外提供该类获取该对象实例的方法:直接暴露、用静态变量的get方法获取
常见形式:
· 饿汉式:在类初始化时直接创建对象,不存在线程安全问题
- 直接实例化饿汉式(简单直观)
- 枚举式(最简洁)
- 静态代码块饿汉式(适合复杂实例化)
//直接实例化饿汉式
public class Singleton{
public static final Singletion INSTANCE = new Singleton();
private Singleton(){
}
}
//枚举式
public enum Singleton{
INSTANCE
}
//静态代码块式
public class Singleton{
public static final Singleton INSTANCE;
private String info; //info存储在配置文件或资源文件中
static{
try{
Properties pro = new Properties();
pro.load(Singleton.class.getClassLoader().getResourceAsStream("xxx.xxx");
INSTANCE = new Singleton(pro.getProperty("info"));
}catch(IOException e){
throw new RuntimeException(e);
}
}
private Singleton(String info){
this.info = info;
}
public String getInfo(){
return this.info;
}
}
· 懒汉式:延迟创建对象
- 线程不安全(单线程)
- 线程安全(多线程)
-静态内部类形式(多线程)
//非线程安全
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
instance = new Singleton();
}
return instance;
}
}
//线程安全
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronzied(Singleton.class){
if(instance == null){
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
instance = new Singleton();
}
}
}
return instance;
}
}
//静态内部类式
/*
在内部类被加载和初始化时,才创建INSTANCE实例对象;
静态内部类不会随着外部类的加载和初始化而初始化,它需要单独地去加载和初始化;
因为是在内部类加载和初始化时,才创建实例,所以是线程安全的。
*/
public class Singleton{
private Singleton(){}
private static class Inner{
private static final Singletion INSTANCE = new Singletion();
}
public Singleton getInstance(){
return Inner.INSTANCE;
}
}
3、类初始化和实例化
/*
父类的初始化:
1)j = method()
2)父类的静态代码块
父类实例初始化:
1) super()
2)i = test()
3)父类的非静态代码块
4)父类无参构造器(最后)
非静态方法前面其实有一个默认对象this
this在构造器表示的是正在创建的对象,这里正在创建的是Son对象,所以运行的是Son.test()---面向对象多态
创建第二个Son实例对象,类初始化只执行一次,实例化初始化在执行一次
*/
public class Father{
private int i = test();
private static int j = method();
static{
sout("1");
}
Father(){
sout("2");
}
{
sou("3");
}
public int test(){
sout("4");
return 1;
}
public static int method(){
sout("5");
return 1;
}
}
/*
子类的初始化:
1)j = method()
2)子类的静态代码块
先初始化父类 (5)(1)
再初始化子类 (10)(6)
子类实例初始化:
1) super() (9)(3)(2)
2)i = test() (9)
3)子类的非静态代码块 (8)
4)子类无参构造器(最后) (7)
*/
public class Son extends Father{
private int i = test();
private static int j = method();
static{
sout("6");
}
Son(){
sout("7");
}
{
sou("8");
}
public int test(){
sout("9");
return 1;
}
public static int method(){
sout("10");
return 1;
}
public static void main(String[] args){
Son s1 = new Son();
sout();
Son s2 = new Son();
}
}
//out
5 1 10 6 9 3 2 9 8 7
9 3 2 9 8 7
要理清这类考题,需要弄清3个考点:
1. 类初始化过程
1. 一个类要创建实例需要先加载并初始化该类
· main 方法所在的类需要先加载和初始化;
2. 一个子类需要初始化需要先初始化父类
3. 一个类初始化就是执行<clinit>()方法
2. 实例初始化过程
1. 实例初始化就是执行<init>()方法
3. 方法的重写
1. 哪些不能被重写
· final方法
· 静态方法
· private 等子类不可见方法
2. 对象的多态
子类如果重写了父类的方法,通过子类调用的一定是重写后的方法;
4、方法的参数传递机制
1. 形参是基本数据类型
传递数据值
2. 实参是引用数据类型
传递地址值
特殊的类型:String、 包装类(Integer)等对象不可变性
Java经典知识复习的更多相关文章
- JAVA基础知识复习小结
集合 Set集合 Set集合的基本特征是元素不允许重复.HashSet不保存元素顺序,LinkedHashSet用链表保持元素的插入顺序,TreeSet可定制排序规则. HashSet的底层是用Has ...
- java基础知识复习
String http://blog.csdn.net/uyu2yiyi/article/details/6275808 1. 首先String不属于8种基本数据类型,String是一个对象. 因为 ...
- Java基础知识复习(二)
Java 重写(Override)与重载(Overload) 重写 是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变,属于编译时多态.即外壳不变,核心重写! 重写的好处在于子 ...
- Java基础知识复习(一)
- JVM内存区域 程序计数器:一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的. Java虚拟机栈:Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接, ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- Java基础知识系列——String
最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- <数据结构与算法分析>读书笔记--数学知识复习
数学知识复习是<数据结构与算法分析>的第一章引论的第二小节,之所以放在后面,是因为我对数学确实有些恐惧感.不过再怎么恐惧也是要面对的. 一.指数 基本公式: 二.对数 在计算机科学中除非有 ...
- java相关知识集锦
java语言基础知识: Java8 Stream语法详解 不用循环 java 8系列之Stream的基本语法详解 java8 stream filter等功能代替for Java中try catch ...
随机推荐
- ES得分
一.概念 1.ES主要用于搜索 2.搜索要把更有相关性的结果展示出来 3.对一个文档评分,相关性越大,评分越高 4.打分的本质是排序 二.评分规则 1.ES5之前,默认评分规则是TF-IDF,这是信息 ...
- POWER BI - 根据条件,改变数值的颜色Conditional formatting
在visual块,右键Column选择Conditional formatting 举例,比如difference > 0 显示红色,否则<0显示绿色 如何根据 measure 写特定条件 ...
- 不安全的权限 0644,建议使用 0600 虚拟机无法分配内存 virtual memory exhausted: Cannot allocate memory
我都不知道我写了啥,自己都很混乱 aoteman@aoteman-virtual-machine:/tmp$ sudo -s #进入root用户模式 [sudo] aoteman 的密码: 12对不起 ...
- IDEA通过Spring Initalizr新建SSM (2)
之前的方式是通过官网初始化demo(URL:https://start.spring.io/)现在记录一下通过IDEA自带的初始化器新建SSM框架 1.打开IDEA,点击新建,出现如下图菜单,点击Sp ...
- 多线程学习(第二天)Java内存模型
一.内存模型基础 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明. 如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可 ...
- mac sourcetree required password
coding c85Ao 解决办法,用http拉取,使用命令行clone 每次push需要密码解决方法 sourcetree 不停的让输入密码,报 password required1.在终端(t ...
- select,poll和epoll使用场景和区别
阻塞I/O至I/O多路复用 阻塞I/O指进程发起调用后会被挂起(阻塞),直到收到数据再返回.如果调用一直不返回,进程就一直被挂起.因此,使用阻塞I/O需要利用多线程来处理多个文件描述符. 引入非阻塞I ...
- 织梦dedecms网站迁移搬家图文教程
织梦dedecms网站迁移搬家图文教程 2014-07-31 dedecms教程 文章介绍 织梦作为国内使用最多的程序之一,难免很多新手在接触dede时不知道怎么转移也就是搬家dede的程序,而且 ...
- centos7 部署 DNS 主从
centos7 部署 DNS 主从 环境 名称 ip地址 cpu 内存 yz-dns-master 10.148.100.81 4c 8G yz-dns-slave 10.148.100.82 4c ...
- AD笔记总结
原理图要点: 1.新建工程, 新建的project是要以后缀PrjPCB2.新建原理图.PCB, 右键project,进行New添加3.新建原理图库.PCB库,右键project, 进行new添加 改 ...