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. 从零搭建hadoop集群之克隆虚拟机

    1. 选中一台已关闭的虚拟机,在虚拟机名称上,右键点击,选择"管理",再选择"克隆", 出现如下画面: 2. 点击"下一步",出现如下画面: ...

  2. kali 更新到最新版(测试中...)

    # 确认源 (下面用阿里云的源举例) echo "deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib ...

  3. 安装ubuntu后的U盘(tf卡)恢复到之前的状态

    sudo fdisk /dev/sdasudo mkfs.vfat /dev/sda 注意: sda是 disk的名字.不同的电脑可能不一样.

  4. 本地JAR包如何上传私有仓库

    需求背景 有些第三方的jar包需要手动上传到maven私有仓库,以便通过maven来管理依赖. 为简化手动上传的jar包的操作步骤,所以整了个脚本,在使用时只需修改相应变量即可. 脚本示例 #!/bi ...

  5. oracle查看归档信息

    1.查看归档信息 show parameter recovery_file_dest #查看归档目录 show parameter recovery_file_dest_size #查看归档可以存储的 ...

  6. asp.net mvc api swagger 配置

    1.安装插件 Swashbuckle(版本5.6.0) 和 Swagger.Net.UI(版本1.1.0) 2.SwaggerNet类中注释掉一下代码: using System; using Sys ...

  7. OpenStack 虚拟机制作qcow2格式镜像

    虚拟机拍摄快照导出1.将虚拟机制作成镜像(即拍摄快照):2.利用该虚机的快照,创建一个快照卷,大小是根据快照的大小自动设置的:3.利用命令将快照卷 upload-to-image 到虚机的快照内 ci ...

  8. 同一系统开启两个ftp进程

    1.正常情况是yum 安装vsftpd服务 ,在/etc/vsftpd目录更改配置,起服务.这样启动是一个服务. 2.启动第二个vsftpd服务 #创建虚拟用户 useradd -d /home/vi ...

  9. spider_使用随机User-Agent库, 爬取笔趣阁万古天帝章节目录_(fake_useragent)

    """使用随机User-Agent库,爬取笔趣阁万古天帝章节目录"""import requestsfrom fake_useragent ...

  10. 配置windows server多个用户同时使用一个账户远程服务器

    首先,需要服务器开启远程桌面连接: 右键点击"这台电脑"弹出菜单栏,选择"属性"   弹出系统窗口,点击"远程设置"   弹出系统属性窗口, ...