weekend3-1

IDEA开发工具无法检测到单元测试@Test关键字的原因:

不仅是类名,包名如果是Test,就会无法识别@Test,
Test2都是可以正常检测到@Test的,之后即可通过IDEA扩展提示导入Junit4包.

######################################################################

单元测试 运行 线程 不输出业务内容就结束的问题:

根据部分Junit4 TestRunner源码就知道了

在TestRunner中可以看出,如果是单线程,当测试【主线程】执行结束后,不管【子线程】是否结束,都会回调TestResult的wasSuccessful方法

然后判断结果是成功还是失败,最后调用相应的System.exit()方法。大家都知道这个方法是用来结束当前正在运行中的java虚拟机,
jvm都自身难保了,所以子线程也就对不住你咧…

解决办法:
1 简单粗暴地让主线程休眠一段时间,然后让子线程能够运行结束。但是这个方法的弊端是,你不知道子线程的运行时间,
所以需要看脸=_=Thread.sleep();

2 使用CountDownLatch工具类,让主线程阻塞,直到子线程运行结束或者阻塞超时,这个方法要比第一个方法好点。
countDownLatch.await(5, TimeUnit.MINUTES);

一句话:单元测试主线程太快

######################################################################

CPU多线程的意义:

将一个进程 分为 多个进程 ,确保 整个 进程 不会因为其中某一步的问题 而整个卡死
一个暂时调不了资源,就暂时挂起,其他线程继续跑,
尽可能地 将CPU资源利用充分.

######################################################################

		->try/catch

alt+enter既可以快速输出

     ->throws Exception

new 调用构造方法的同时,在堆里开辟新的空间

equals比较的是值

java对象池commons-pool
对象的创建和销毁在一定程度上会消耗系统的资源,虽然jvm的性能在近几年已经得到了很大的提高,对于多数对象来说,没有必要利用对
象池技术来进行对象的创建和管理。
但是对于有些对象来说,其创建的代价还是比较昂贵的,比如线程、tcp连接、rpc连接、数据库连接等对象,因此对象池技术还是有其存在
的意义。

有重复的就从池里取出来.

就像 String有 常量池

综上:池–>第一次录一个进池,之后重复的直接从池取

子类 继承 父类 的 元素
可以在子类函数中 使用 super.父类元素名 来赋值.

ctrl+/注释后再来一次可以取消注释

######################################################################

子类的对象可以向上造型为父类的类型。即父类引用子类对象,这种方式被称为向上造型。

java向上造型的意义?

向上转型是子类对象当成父类对象来使用,也就可以这样理解,父类引用指向子类对象。

那么比如有一个方法m,它传的参数是父类的类型,m(father f),执行的父类中已有的某个方法
而你实际传的是它的子类son,如果子类中有重写父类的方法,那么java机制就会自动的执行子类的那个方法。

想象下,如果你不用父类对象引用,那么你实现每个动物的m方法的时候都要去写一次,而用了这个,java自动判断实际上是哪个
对象就用哪个的方法。
而且你如果添加别的子类,也只需要重写出这个类和重写的父类方法就可以了,否则你还要去改m方法。
也就是说,向上转型体现了面向对象的特点,也增加了程序的扩展性。

java向上造型有什么作用?为什么要造型,有什么效果????

向上造型:父类的引来用指向源子类的对象。
向上造型可以大大提高程序的可扩展性。利于代码维护。
面向对象的三大特性:封装;继承;多态。向上造型可以看做多态的一种体现。即允许一种类型有不同的实现
(可以理解为事物存在的多种体现形态)。
典型应用:接口。
没有什么效果,只是是代码精简而已

java向上造型有何意义

同一个事件发生在不同的对象上会产生不同的结果。
接口开发。

######################################################################

1.1 栈

栈是一个内存数组,是一个LIFO(Last-In First-Out,后进先出)的数据结构。

栈存储几种类型的数据:

		某些类型变量的值;(基本类型)

		程序当前的执行环境;

		传递给方法的参数。

栈有如下几个特征:

		数据只能从栈的顶端插入和删除。

		把数据放到栈顶称为入栈(push)。

		从栈顶删除数据称为出栈(pop)。

		栈是在编译期,由编译器分配好内存空间。

1.2 堆

堆是一块内存区域,在堆中可以分配大块的内存用于存储【某类型的数据对象】。

与栈不同,堆里的内存能够以任意顺序存入和删除。

堆是在运行期,根据程序运行情况动态分配内存空间。

栈-引用地址,堆-引用对象

1.对象和对象引用的差别:

(1).对象:

万物皆对象。对象是类的实例。

在Java中new是用来在堆上创建对象用的。

一个对象能够被多个引用所指向。

(2).对象引用:

相似于C++中的地址。通过对象引用能够找到对象。

一个引用能够指向多个对象。操纵的标识符实际上是指向对象的引用。

就像:对象存放在屋子里,对象的引用就相当于屋子的钥匙。

######################################################################

3.堆和栈的差别:

(1).栈:在函数中定义的一些基本类型的变量。和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,
Java就在栈中为这个变量分配内存空间。当超过变量的作用域后。Java会自己主动释放掉为该变量所分配的内存空间。

该内存空间能够马上被另作他用。

引用变量就相当于是为数组或对象起的一个名称。以后就能够在程序中使用栈中的引用变量来訪问堆中的数组或对象。

(2).堆:堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自己主动垃圾回收器来管理。

(3).生命周期:

A.引用变量的生命周期:程序执行一直到变量的作用域之外就被释放

B.数组和对象的生命周期:
程序执行到使用new产生数组或者对象的语句所在的代码块之外,数组和对象本身占领的内存不会被释放。
数组和对象在没有引用变量指向它的时候,才变为垃圾,不能再被使用。

但仍然占领内存空间不放,在随后的一个不确定的时间被垃圾回收器收走。

这也是Java比較占内存的原因,实际上栈中的变量指向堆内存中的变量,这就是Java中的指针。

4.Java中的内存机制:

Java把内存分为两种:一种是栈内存。 一种是堆内存。

栈内存:在函数中定义的一些基本类型的变量和对象的引用变量。

堆内存:由new创建的对象和数组。在堆中产生了一个数组或者对象之后,还能够在栈中定义一个特殊的变量。
让栈中的这个变量的取值等于数组或对象在堆内存中的首地址。

栈中的这个变量就成了数组或对象的引用变量。
以后就能够在程序中使用栈中的引用变量来訪问堆中的数组或者对象,引用变量就相当于是为数组或对象起的一个名称。
引用变量是普通的变量,定义时在栈中分配。

######################################################################

向上造型:
父类引用指向子类对象(子类型,实例也是子类的实例化);
向上造型也叫做向上类型转换或自动类型转换,即父类的引用指向子类的对象。将子类对象的类型转换成父类的类型。

向下造型:
子类引用指向父类对象(父类型,实例是子类的实例化);
向下造型也叫做向下类型转换或强制类型转换,即子类的引用指向父类的对象。将父类对象的类型转换成子类的类型。

######################################################################

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值