0%

对象是什么

Java是一个面向对象的语言,在Java中可以使用new关键字来产生一个对象,但这个对象到底是什么,应该具有哪些属性?

首先跟我们自己先想下,Java对象已经有以下几个属性:

  1. 属于哪个类
  2. 有哪些字段和类型
  3. 对象的值
    ….

    在HotSpot虚拟机中,真实的Java对象是分成三个部分:

  4. 对象头

  5. 对象的值
  6. 对象的填充字节 (在JVM中,要求对象占用内存的大小应该是8bit的倍数,这个信息是用来补齐8bit的,无其他作用

对象头

对象头是Java中对象都具有的属性,是jvm在编译和运行阶段读取的信息。对象头包含三个部分:

  1. mark word
  2. 指针向类的指针
  3. 数组的长度(只有数组的对象用到)

    这3个中最复杂的是MarkWordMarkWord用于存储对象自身的运行时数据,
    如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等。在32bit的环境中,Java头存储的信息如下

    Java对象头

对象头的应用

————————————————————————-

偏向锁

阅读全文 »

字节

用于计量存储容量的一种计量单位,通常情况下一字节等于八位, 也表示一些计算机编程语言中的数据类型和语言字符。

在计算机中,我们知道,所有的一切都是归根到底都是二进制的字节形式,包括文件,字符串等等。所以在写程序的时候,尝尝需要和字节打交道。

例如:我们需要把一个字符串写入到文本文件中,我们就需要借助字节这个中间的单位来进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

@Test
public void stringToFile() throws Exception {
String name = "Test";
byte[] bytes = name.getBytes();
FileOutputStream fileOutputStream = new FileOutputStream("D:/test.txt");
fileOutputStream.write(bytes);
fileOutputStream.close();
}

```
当然同样的,从文件到字符串也是离不了字节这个单位:

``` Java

@Test
public void fileToString() throws Exception {
FileInputStream fileInputStream = new FileInputStream("D:/test.txt");
byte[] inByte = new byte[100];
fileInputStream.read(inByte);
String str=new String(inByte);
System.out.println(str);
}

以上我们可以用下面的模型图来表示:

Java Stream模型

流是什么?

从上面的代码中,我们可以看到,有一个 FileInputStreamFileOutputStream这两个流的对象,对于这个对象我们怎么理解?

流是一个字节转移的介质,如同用吸管喝水,水是字节的集合的文件,吸管就是流。

阅读全文 »

BeanUtils.copyProperties引发的血案

在一次使用BeanUtils.copyProperties的方法是,莫名其妙的报错,产生的代码分解如下:

Java反射超越泛型

1
2
3
4
5
6
7
8
9
10
11
12

EntityA entityA = new EntityA();
List<UniteA> uniteAList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
UniteA uniteA = new UniteA();
uniteA.setAge(i);
uniteA.setName("name" + i);
uniteAList.add(uniteA);
}
entityA.setKey(10);
entityA.setUniteList(uniteAList);

把EntityA的值赋值给EntityB:

1
2
3
4
5

EntityB entityB = new EntityB();
BeanUtils.copyProperties(entityA, entityB);
System.out.println(entityB.getUniteList().get(0).getClass());

在运行这段代码的时候,发生了异常的信息:

Java反射超越泛型

对于这个异常,我观察了很久,在调试的时候发现,EntityA中的UniteA中的字段竟然能够赋值给 EntityB中UnitB中的字段!! 类型不一样,竟能够存储!!

Java反射超越泛型

阅读全文 »

为什么使用lambda

在Java中我们很容易将一个变量赋值,比如int a =0;int b=a;

但是我们如何将一段代码和一个函数赋值给一个变量?这个变量应该是什么的类型?

lambda

在Javascript中,可以用一个对象来存储。

1
2
3
4
5
6
7
var t=function()
{
int a=1;
a=a+1;
alert(a);
}

在Java中,直到Java8的lambda的特性问世,才有办法解决这个问题

————————————————————————-

什么是lambda

什么是lambda? lambda在程序中到底是怎样的一个存在? 首先看代码:

阅读全文 »

在高中开始学习哲学的时候,就知道哲学有两大阵营,唯物主义和唯心主义。唯物主义认为世界的本源是物质,物质是客观存在的,物质决定意识,中国古代代表的是朱熹的格物致知。唯心主义认为世界的本质是意识,心外无物,像佛学,道教和王阳明的心学都是唯心主义的代表。

在《度阴山》这本书上,说了一个很有趣的例子 :

王阳明游南镇,一友指岩中花树问曰:“天下无心外之物,如此花树在深山中自开自落,于我心亦何相关?”先生曰:“你未看此花时,此花与汝心同归于寂;你来看此花时,则此花颜色一时明白起来;便知此花不在你的心外。”

翻译过来就是: 王阳明于朋友游南镇,看到岩石上面友一朵花,他的朋友指着岩石花说:“你常说心外无物,这个花在这个深山中花开花落,和我的心有什么关心呢?” 王阳明说:“你没有看到这个花的时候,这个花与你的心一同沉寂,当你看到此花时,花的颜色在你的心中明白了起来,看来这个花并没有在你的心外。”

王阳明朋友的理解是唯物主义的角度去理解,我想大多数人也都会认为第一种说法更为合理,因为花确实是客观存在,不受任何人的影响,即使你人的意识没了,花依然存在,所以是先有了花,才能谈生出人们对花的意识。

从王阳明的心学角度考虑,当你看到花的时候,花的颜色,花的形状,”花”的这个名字,都已经在你的心中了,只不过在你看到的那个时刻,产生了一个碰撞,在你看到花之前就已经有了花的意识,从反面角度来说,如果一个人失去了意识,就不可能感受到物质的存在,如果所有的人和生物都失去了意识,那么整个宇宙就没有了意义。

对于上面的两种结识,我更喜欢王阳明的心学,这个也是我写这篇博客的目的。唯物主义固然是对的,也是现代科学的基础,但唯物主义只能教会我们更好认识世界,确没有告诉我们认识自己,而再完美的科学也不能脱离人的意识而存在。而王阳明的心学追求的是”知行合一”,认为我们的良知无所不能,良知能做到一切,让我们跟随自己的良知去做事,良知认为什么是对的就做什么,不对的就想办法把他克服掉。

有人会问,王阳明的心学和佛学有很多类似的地方,都认为心外无物,这个书中也给了我们的答案,心学于佛学最大的不同是佛学是灭了人的七情六欲,所以心经里面就有照见五蕴皆空等等的句子。心学认为人的七情六欲是正常的,我们只要管理好他就行了。虽然说起来很简单,这个正是心学高明的地方。

奉唯物观点为经典,存天理去人欲,人生在宇宙,犹如沧海一粟,生命的脆弱带来的只是意志的脆弱和人性的虚伪,所以我们不仅需要唯物观点认识世界,也需要心学来充实内心,社会的浮躁,恰恰是只在乎了前者,而忽略缺乏了内心的修养。

阅读全文 »

一直想写一个Vuejs的系列的博客,苦于一直没有时间,今天的这个博客也是思考了很久,打算随便写点东西,今天说说Vuejs的模版的使用。

Vue模版的使用方法

  1. 直接用Html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    <div id="container">
    <mytemp></mytemp>
    </div>

    <script src="vue.min.js"></script>
    <script>
    Vue.component('mytemp', {
    template: ' <h1>Hello I am Temple</h1>',

    })
    new Vue().$mount("#container");

    </script>

  2. 使用标签

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    <div id="container">
    <mytemp></mytemp>
    </div>
    <script id="temp1" type="x-template">
    <h1>Hello I am Temple</h1>
    </script>
    <script src="vue.min.js"></script>
    <script>
    Vue.component('mytemp', {
    template: '#temp1'
    })
    new Vue().$mount("#container");

    </script>


  3. 使用template标签

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    <div id="container">
    <mytemp></mytemp>
    </div>
    <template id="temp1">
    <h1>Hello I am Temple</h1>
    </template>
    <script src="vue.min.js"></script>
    <script>
    Vue.component('mytemp', {
    template: '#temp1'
    })
    new Vue().$mount("#container");

    </script>

局部模版

上面我们使用的全局模版,这个模版可以在所有的vue对象中使用,如果我们仅仅想让在当前的vue中生效,就要用局部的模版注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <div id="container">
<mytemp></mytemp>
</div>
<template id="temp1">
<h1>Hello I am Temple</h1>
</template>
<script src="vue.min.js"></script>
<script>
new Vue({
components: {
'mytemp': {
template: '#temp1'
}
}
}).$mount("#container");

</script>

模版的传值


单项传递

对于我们的传值,我们可以看成父模版向子模版传值,其中vue是父对象,template是子对象,这里我们需要使用props属性,修改我们的额demo如下:

阅读全文 »

关于linux的截图功能一直觉得没有比较好用的,不过也能凑合使用,不能于QQ等截图功能相提并论。 下面说说如何设置linux下的截图快捷键,个人使用的是Ubuntu。

使用命令:


  gnome-screenshot

我们使用 gnome-screenshot -h 来查看下对应的命令:

Usage:
  gnome-screenshot [OPTION…]

Help Options:
  -h, --help                     Show help options
  --help-all                     Show all help options
  --help-gapplication            Show GApplication options
  --help-gtk                     Show GTK+ Options

Application Options:
  -c, --clipboard                Send the grab directly to the clipboard
  -w, --window                   Grab a window instead of the entire screen
  -a, --area                     Grab an area of the screen instead of the entire screen
  -b, --include-border           Include the window border with the screenshot
  -B, --remove-border            Remove the window border from the screenshot
  -p, --include-pointer          Include the pointer with the screenshot
  -d, --delay=seconds            Take screenshot after specified delay [in seconds]
  -e, --border-effect=effect     Effect to add to the border (shadow, border, vintage or none)
  -i, --interactive              Interactively set options
  -f, --file=filename            Save screenshot directly to this file
  --version                      Print version information and exit
  --display=DISPLAY              X display to use

根据个人的需要,我觉得使用 -a -i 两个参数就能够满足我的个人需求:


   gnome-screenshot -a -i

后面的工作就是把这个功能添加到快捷键列表中去,进入设置,添加对应的快捷键如下:    

竖排选择快捷键

阅读全文 »

前段时间一直在找如何使用Sublime text 3使用竖排编辑的文字的快捷键,一直都在傻傻的使用右键+Shift的组合方式使用。 今天找的了使用方法:

  1. 先全选要编辑的文本

  2. Ctrl+Shift+L进入竖排编辑

  3. 使用Home 和End来移动光标的位置

竖排选择快捷键

阅读全文 »

最近有一个需求,是配置新电脑的环境,步骤很简单,停止windows update 服务和禁止windows update服务,把登陆的ctrl+alt+delete的方式去除,最后要安装radmin。

经过几台的安装实在是对繁杂的安装过程不感冒,决定用DOS写一个脚本来完成这些工作,禁用服务和去除Ctrl+Alt+Delete两个步骤用DOS很简单完成,静默安装软件花了点时间,因为不同的安装包对使用的命令不同。静默安装的方式

当然也可以用最简单的方式查看,静默安装的方式:

1
2
3

xxx.exe /?

最终我的脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13

@echo off
echo wait....
net stop wuauserv //停止服务
sc config wuauserv start= disabled //禁止windows更新服务
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v disablecad /t REG_DWORD /d 1 /f //去除ctrl+alt+delete
rem gpupdate /force
echo install radmin
radmin.exe /S /v/qn //静默安装
start /wait keymaker.exe //启动注册机
C:\Windows\SysWOW64\rserver30\rserver30.exe /setup //启动设置界面
echo SUCCESS!!
pause

再提供一个msi包的静默安装方法

1
2
3
4
5
6
7
8
9
10
11
12
13

@echo off
echo wait....
net stop wuauserv
sc config wuauserv start= disabled
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v disablecad /t REG_DWORD /d 1 /f
rem gpupdate /force
echo install radmin
radmin.msi /quiet
start /wait keymaker.exe
C:\Windows\SysWOW64\rserver30\rserver30.exe /setup
echo SUCCESS!!
pause
阅读全文 »

最近一段时间准备整理下Maven相关的知识,受前面几次野心太大的教训,这次没写一篇就发一篇,不再一直憋着等到后面一起发布。本篇文章是一个使用入门的教程(至于安装和配置,已经有很多教程了,这里就不再赘述了)

什么是Maven

对于这个话题,官方有很多解释,但很多的解释都不是很好理解,既然这里是个人的博客,我就怎么容易理解怎么写。

从简单的角度去理解maven,可以简单的理解成一种项目的管理方式(如同vs中的项目文件,不过vs封装的更好一点),从一个项目的角度来考虑,项目主要包含源代码,资源文件,配置文件他其他的相关引用,如何管理这些文件呢? 我们很自然的可以想到把项目的文件和引用放到一个文本中,当编译器再次加载项目的时候就不用再重新扫描文件目录。

对于这个文本格式,我们很自然的想到用json或者xml格式去存储,这样就很容易明白为什么我们要使用Maven了。 讲到这里也不得不把官方的解释拿过来:

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.

翻译过来就是:

Apache Maven是一个软件项目管理和逻辑工具。基于项目对象模型(POM)的概念, 可以用来管理项目的构建, 信息中心的报告和文件 。

Maven的在windows和Linux下的安装,这里就不多说了,网上有很多图文并茂的教程,这里就不多说了,也不做推荐了

Maven的快速入门

阅读全文 »