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经典知识复习的更多相关文章

  1. JAVA基础知识复习小结

    集合 Set集合 Set集合的基本特征是元素不允许重复.HashSet不保存元素顺序,LinkedHashSet用链表保持元素的插入顺序,TreeSet可定制排序规则. HashSet的底层是用Has ...

  2. java基础知识复习

    String  http://blog.csdn.net/uyu2yiyi/article/details/6275808 1. 首先String不属于8种基本数据类型,String是一个对象. 因为 ...

  3. Java基础知识复习(二)

    Java 重写(Override)与重载(Overload) 重写 是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变,属于编译时多态.即外壳不变,核心重写! 重写的好处在于子 ...

  4. Java基础知识复习(一)

    - JVM内存区域 程序计数器:一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的. Java虚拟机栈:Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接, ...

  5. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  6. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  7. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

  8. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  9. <数据结构与算法分析>读书笔记--数学知识复习

    数学知识复习是<数据结构与算法分析>的第一章引论的第二小节,之所以放在后面,是因为我对数学确实有些恐惧感.不过再怎么恐惧也是要面对的. 一.指数 基本公式: 二.对数 在计算机科学中除非有 ...

  10. java相关知识集锦

    java语言基础知识: Java8 Stream语法详解 不用循环 java 8系列之Stream的基本语法详解 java8 stream filter等功能代替for Java中try catch ...

随机推荐

  1. oracle之如何获取执行计划方法

    1.什么是执行计划 为了执行sql语句,Oracle在内部必须实现许多步骤,这些步骤可能是从数据库中物理检索数据行,或者用某种方法来准备数据行等,接着Oracle会按照一定的顺序一次执行这些步骤,最后 ...

  2. 根据pid定时监控CPU使用率和内存使用率并输出到文件 (windows和linux跨平台可用)

    有时服务器运维中,某些程序员的应用发布后完全不管CPU和内存的使用率,只觉得代码能运行就行了,这样给我们运维人员经常造成困扰: 比如我在zabbix平台中就经常监测到凌晨1~3~5点时候突然CPU飙升 ...

  3. sql使用!=查询时会忽略null数据

    table_a有3条数据 column1值分别为1,0,null 那么 select * from table_a where column1!='1' 只会查到clumn1为0的数据,null的数据 ...

  4. UML各种图实践题

    1. 用状态图描述一部电梯的运行

  5. GSLB工作原理

    参考文档: http://chongit.github.io/2015/04/15/GSLB%E6%A6%82%E8%A6%81%E5%92%8C%E5%AE%9E%E7%8E%B0%E5%8E%9F ...

  6. SAP物料类型

    1.物料主数据界面设置行业领域默认值并隐藏行业领域 2.物料类型设置:主要控制视图需要维护的部门,是否可以采购,及是否进行数量或者价值更新等操作 spro --> 后勤常规--> 物料主数 ...

  7. 大规模人脸分类—allgather操作(2)

    腾讯开源人脸识别训练代码TFace 中关于all_gather层的实现如下.接下来解释为什么backward要进行reduce相加操作. https://github.com/Tencent/TFac ...

  8. vue仿QQ聊天室|vue聊天实例,直播聊天室

    图片压缩 百亿站点 基于vue2.0+vue-cli+vuex+vue-router+webpack+es6+wcPop等技术开发的仿微信聊天界面|仿微信聊天室vue-chatRoom,实现了微信聊天 ...

  9. 基于.NET Core3.1的SQLiteHelper增删改帮助类

    安装驱动包 install-package Microsoft.Data.Sqlite -version 3.1.7 install-package System.Data.SQLite.Core - ...

  10. 杭电oj 素数判定

    Problem Description 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数.   I ...