20.05.08

1.

输出结果:**foobar**
线程的启动方式只能通过start这种方式启动才能真正的实现多线程的效果,如果是手动调用run方法和普通方法调用没有区别,所以这个还是按照顺序执行首先执行run方法之后,执行输出语句所以最终得到结果foobar。
调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。
1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;
2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码, 这样就没有达到写线程的目的。

2.关于一个.java文件会生成几个.class文件:

一个.java文件中:
(1)public权限类只能有一个(也可以一个都没有,但最多只有一个);
(2)这个.java文件名只能是public 权限的类的类名;
(3)倘若这个文件中没有public 类,则它的.java文件的名字是随便的一个类名;
(4)当用javac命令生成编译这个.java 文件的时候,则会针对每一个类生成一个.class文件;定义几个类和接口(接口可以理解为类的一种),则编译该文件后生成几个以.class为后缀的字节码文件
(5)如果类中有内部类,会产生类名$内部类名.class,如果有匿名类则会产生 类名$1.class.。所以类编译不一定会产生1个class文件

3.

public static void main(String[] args) {
    String a = "tao" + "bao";
    String b = "tao";
    String c = "bao";
    **//true, taobao在字符串常量池已经存在,因此String a = "tao" + "bao";执行后,a也指向常量池中该字符串,因此引用相同**
    System.out.println(a == MESSAGE);
    /*
     *** false
     * 1. Java对String的相加是通过StringBuffer实现的,先构造一个StringBuffer里面存放"tao",然后调用append()方法追加"bao",然后将值为"taobao"的StringBuffer转化成String对象。
     * 2. 很明显新返回的对象和MESSAGE不是指向同一个地方,返回的对象指向堆中String对象,MESSAGE指向常量区中字符串,即两者引用不同
     */**
    System.out.println((b + c) == MESSAGE);
}

4.

  • native修饰方法,native修饰的方法简单来说就是:一个Java方法调用了一个非Java代码的接口。 定义navtive方法时,并不提供实现体,因为其实现体是用非Java语言在外面实现的。native可以和任何修饰符连用,abstract除外。因为native暗示这个方法时有实现体的,而abstract却显式指明了这个方法没有实现体。
  • java的访问权限有public、protected、default和private的,default不能修饰变量;
  • abstract修饰方法和类 ,也不能修饰变量;
  • final修饰的方法不能被重写。而abstract定义的方法没有实现,必须被子类重写,明显不能一起使用。

5.File类

File类能够存储文件属性;
File类能够建立文件;
File类能够获取文件目录信息;
File类能够读写文件 ,File类能操作文件本身,但不能对文件内容进行修改 ,能够读写文件的是数据流(OutputStream和InputStream)
在这里插入图片描述

6.

Spring提供了AOP方式的日志系统
Spring并没有为我们提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。

7.

假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时执行下面的代码,最终 a 的结果不可能是:1,可能是:-1、-2、0

 boolean isOdd = false;
for(int i=1;i<=2;++i)
{
if(i%2==1)isOdd = trueelse isOdd = false;
a+=i*(isOdd?1:-1)} 

易知:每个线程对a 均做了两次读写操作,分别是 “ +1 ” 和 “ -2 ”
在这里插入图片描述

8.

使用transient修饰的变量不会被序列化;
对象序列化的所属类需要实现Serializable接口。

9.虚函数

什么是虚函数?简单地说,那些被virtual关键字修饰的成员函数,就是虚函数,java中普通成员函数就是虚函数
1.Java虚函数

虚函数的存在是为了多态。
Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为。如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数

PS: 其实C++和Java在虚函数的观点大同小异,异曲同工罢了。

2.Java抽象函数(纯虚函数)

抽象函数或者说是纯虚函数的存在是为了定义接口。
Java中纯虚函数形式为:abstract void print();
PS: 在抽象函数方面C++和Java还是换汤不换药。

虚函数必须在子类中实现;
在C++中,基类的析构函数建议为虚析构函数;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值