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. 【TensorFlow】InternalError: Failed copying input tensor

    TensorFlow-GPU 执行模型训练时报错: InternalError: Failed copying input tensor from /job:localhost/replica:0/t ...

  2. C# snaps

    C# 启用 禁用 本地连接 1 static void Enable(string interfaceName) 2 { 3 System.Diagnostics.ProcessStartInfo p ...

  3. c原因学习---指针作为函数的形参

    指针作为函数的形参, 可以改变实参的值. #include<stdio.h> // 交换两个变量的值 int swap(int x, int y) { int k = y; y = x; ...

  4. 洛谷 P4454 [CQOI2018]破解D-H协议

    题目 https://www.luogu.com.cn/problem/P4454 杂题乱做ing... 思路 首先我们把式子列一下: \(g^a\equiv A(mod P)\) \(g^b\equ ...

  5. mac系统yarn使用报错:ERROR: add is not COMMAND nor fully qualified CLASSNAME.

    出现错误的过程: mac 系统上使用阿里的X6(@antv/x6) x6 快速上手: 1   npm install @antv/x6 --save 2   yarn add @antv/x6     ...

  6. 公共的common.scss (覆盖部分element组件主题色)

    公共的 common.scss (包含主题色 覆盖部分element组件主题色) $theme: #D50000; $litterTheme: #ec6059; .text-theme { color ...

  7. MacOS如何使用语音输入

    Siri是Apple旗下强大的语音助手,而Siri的语音输入是必不可少的的存在.目前的MacOS中都有语音听写功能,可以让它把我们的语音转化成为文字.如果你此时不想打字,或是不方便打字的情况下,这个功 ...

  8. etcd使用Cfssl生成自签证书(pem)

    CFSSL是CloudFlare开源的一款PKI/TLS工具,CFSSL包含一个命令行工具和一个用于签名,验证并且捆绑TLS证书的HTTP API服务,环境构建方面需要 Go 1.12+. 需要两套证 ...

  9. 替代学习物联网-云服务-02阿里云MQTT

     1.支付宝登录,进入物联网平台 https://iot.console.aliyun.com/product  2.新建产品  3.添加设备 4.设备连接参数  5.连接到阿里云

  10. win10下载jdk并配置环境变量

    win10下载jdk并配置环境变量 1. jdk下载 下载官网:Java SE开发套件15.0.2 2. jdk安装 一直点下一步就可以 3. 环境变量 配置 右键我的电脑--属性--高级系统设置-- ...