继电器(英文名称:relay)是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
ASCII编码 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
ANSI编码:
话说计算机是由美国佬搞出来的嘛,他们觉得一个字节(可以表示256个编码)表示英语世界里所有的字母、数字和常用特殊符号已经绰绰有余了(其实ASCII只用了前127个编码)。后来欧洲人不干了,法国人说:我需要在小写字母加上变音符号(如:é),德国人说:我也要加几个字母(Ä ä、Ö ö、Ü ü、ß)。于是,欧洲人就将ASCII没用完的编码(128-255)为自己特有的符号编码(后来称之为“扩展字符集”)。等到我们中国人开始使用计算机的时候,尼玛,256个编码哪够?我泱泱大中华,汉字起码也得N多万吧,就连小学生都得要求掌握两三千字。国标局最后拍板:一个字节不够,那我们就用多个字节来为汉字编码吧,但是,国情那么穷,字节那么贵,三个字节伤不起,那就用俩字节吧,先给常用的几千汉字编个码,等以后国家强盛了人民富裕了,咱再扩展呗---于是GB2312就产生了。台湾同胞一看,尼玛,全是简体字,还让不让我们写繁体字的活了,于是台湾同胞也自己弄了个繁体字编码---大五码(Big-5)。同时,其它国家也在为自己的文字编码。最后,微软苦逼了:顾客就是上帝啊,你们的编码我都得满足啊,这样吧,卖给美国国内的系统默认就用ASCII编码吧,卖给中国人的系统默认就用GBK编码吧,卖给韩国人的系统默认就用EUC-KR编码,...但是为了避免你们误会我卖给你们的系统功能有差异,我就统一把你们的默认编码都显示成ANSI吧。---本故事纯属虚构,但“ANSI编码”确实只存在于Windows系统。
注册表:是个数据库存放各种硬件初始化数据和其他操作痕迹
在CMD中设置编码方式和操作系统默认的编码方式的修改
拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响 ,而且具有能够在现有系统与虚拟镜像之间灵活切换的一类操作系统。虚拟系统和传统的虚拟机(Parallels Desktop ,Vmware,VirtualBox,Virtual pc)不同在于:虚拟系统不会降低电脑的性能,启动虚拟系统不需要像启动windows系统那样耗费时间,运行程序更加方便快捷;虚拟系统只能模拟和现有操作系统相同的环境,而虚拟机则可以模拟出其他种类的操作系统;而且虚拟机需要模拟底层的硬件指令,所以在应用程序运行速度上比虚拟系统慢得多。
流行的虚拟机软件有VMware(VMWare ACE)、Virtual Box和Virtual PC,它们都能在Windows系统上虚拟出多个计算机
凡是带树(tree)的都是有序的
10的2进制 接口 java的开发者视角 java的区间 java数组 java泛型 正则表达式
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)
Java编辑器 选择上一个元素 Alt+Shift+←
Java编辑器 选择下一个元素 Alt+Shift+→
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了
random math.random 线程池 ==与 equals 同步锁 乐观锁 悲观锁 为什么collections是静态的 throw throws final finally finalize
l乐观锁 悲观锁 转换流 底层传输
java 的final 可以修饰类 方法 变量 基本类型 和String 引用数据类型 不可以改变
java 抽象类 abstract 可以有
(1)对于public修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。
(2)对于protected修饰符,它主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西。
(3)对于default来说,有点的时候也成为friendly(友员),它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。
(4)对于private来说,它的访问权限仅限于类的内部,是一种封装的体现,例如,大多数的成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问。
下表为Java访问控制符的含义和使用情况
类内部 | 本包 | 子类 | 外部包 | |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
注意:Java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。其实,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。
区别:
(1)public:可以被所有其他类所访问。
(2)private:只能被自己访问和修改。
(3)protected:自身,子类及同一个包中类可以访问。
(4)default(默认):同一包中的类可以访问,声明时没有加修饰符,认为是friendly。
个人分类: java
LEETCODE 数据结构
算法的5个特性:确定性 有穷性 可行性 输入 输出
算法设计的要求:正确性 健壮性 可读性 高效率 低储存
时间复杂度:
空间复杂度:
接口本质上就是抽象类
final:
* 在方法前面声明的话,改方法只能被调用,不能重写。
* 在类前面声明的话,改方法只能直接调用,不能被继承接口的修饰符只能是public 默认
* 方法的属性:
* String name = "这是食品";
* public static final String name = "这是食品";
*
* 接口中的方法能不能用abstract修饰:
* 接口中的方法全部是抽象方法,抽象类中的方法,需要显式的使用abstract来声明当前方法是抽象方法
jdk提供了 很多类
•定义类(类的组成)
•属性 field
•方法 method
•构造方法 construtor
•其他:代码块 静态代码块 内部类
•创建对象
•类名 对象名 = new 类名();
•Person p1=new Person();
•调用类的属性和方法
•对象名.成员变量
•对象名.成员方法
•在定义成员变量时可以对其初始化
•如果不对其初始化,Java使用默认的值对其初始化。
boolean false char '\u0000'(null) byte (byte)0 short (short) 0 int 0 long (long) 0L folat 0(f) double 0d
•成员变量有默认值;局部变量没有默认值
•作用范围不同: 当前类的方法 当前方法
•不同的方法中即使有同名的局部变量,没有关系,互不影响,建议相同
•方法区:
•存放:类的信息(代码)、 static变量、字符串常量等.
•如果我们没有定义构造器,则系统会自动定义一个无参的构造方法。如果已定义则编译器不会添加无参数构造方法!
•与普通方法一样,构造方法也可以重载
•普通方法中使用this。
•区分类成员属性和方法的形参.
•调用当前对象的其他方法(可以省略)
•位置:任意
•构造方法中使用this。
•使用this来调用其它构造方法
•位置:必须是第一条语句
•用static声明的方法为静态方法
•不需要对象,就可以调用(类名.方法名)
•在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。
•静态方法不能以任何方式引用this和super关键字
•在子类中可以根据需要对从基类中继承来的方法进行重写。
• 重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
• 重写方法不能使用比被重写方法更严格的访问权限。(由于多态)
•super是直接父类对象的引用。
•可以通过super来访问父类中被子类覆盖的方法或属性。
•根据super的说明,构造方法第一句 总是:super(…)来调用父类对应的构造方法。
先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止
泛型只在编译阶段有效
•一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
Java的类只支持单继承,接口支持多继承
•接口中所有方法都是抽象的。
•即使没有显式的将接口中的成员用public标示,也是public访问类型的
接口中变量默认用 public static final标示,所以接口中定义的变量就是全局静态常量
个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的
•根据内部类定义,在外部类中不可访问内部类的属性,这样就在外部类中实现了比外部类的private还要小的访问权限。OuterClass.class 和OuterClass$InnerClass.class
•内部类分类
•成员内部类 静态内部类 方法内部类 匿名内部类
java 7 2011发布,Java 8 2014发布,java9发布于2017年9月21日。
许多语言已经具有交互式编程环境,Java 现在加入了这个俱乐部。您可以从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。
java的线程 并发 lock synchroized 线程池 乐观锁 悲观锁
2、接口中方法不能有方法体(jdk8之后,可以有静态方法和默认的方法-有方法体)
4、接口的方法:不能被private和protectd修饰
随机存取存储器
。随机存取存储器的基本结构可分为三个部分:存储矩阵,地址译码器,读写电路。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合
------数据结构:
是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
ArrayList 为什么是线程不安全的
mkdir() 如果你想在已经存在的文件夹(D盘下的yyy文件夹)下建立新的文件夹(2010-02-28文件夹),就可以用此方法。此方法不能在不存在的文件夹下建立新的文件夹。假如想建立名字是”2010-02-28”文件夹,那么它的父文件夹必须存在。
mkdirs() 如果你想根据File里的路径名建立文件夹(当你不知道此文件夹是否存在,也不知道父文件夹存在),就可用此方法,它建立文件夹的原则是:如果父文件夹不存在并且最后一级子文件夹不存在,它就自动新建所有路经里写的文件夹;如果父文件夹存在,它就直接在已经存在的父文件夹下新建子文件夹。
java.io.File.mkdir():只能创建一级目录,且父目录必须存在,否则无法成功创建一个目录。
java.io.File.mkdirs():可以创建多级目录,父目录不一定存在。
注意
* 1.一旦通信之后,没有明确的服务器端和客户端之分,双方代码类似
* 2.主动发送请求的是客户端,另外一端称为服务器端
* 3.UDP的通信和IO流没关系
* 4.常用API
* DatagramPacket 数据报 数据包 封装了用户发送的数据(数据,ip,port)
* DatagramSocket 发送和接收DatagramPacket
* GUI
abbr. 图形用户界面(Graphical User Interface)
new ActionListener() 是创建一个继承自ActionListener的匿名类对象,通过new表达式返回的引用自动向上转型为对ActionListener的引用。因为匿名类本身无名,也就不存在构造方法,需要显式调用父类的构造方法,并重写父类的方法。
*
还有一个特别空类型,表达式的类型为空(§3.10.7,§15.8.1),没有名字。
因为空类型没有名称,所以不可能声明空类型的变量或强制转换为空类型。
空引用是空类型表达式的唯一可能值。
空引用总是可以对任何引用类型进行扩展的引用转换。
在实践中,程序员可以忽略null类型,并假设null只是一个特殊的文字,可以是任何引用类型
一个null类型(null(空)引用是这种类型的唯一的一个值)的值,可以赋值给任意类型,将返回一个该类型对象的空引用(其实还是null)。
局部变量 和成员变量
•声明位置不同 类中 方法中
•作用范围不同: 当前类的方法 当前方法
•不同的方法中即使有同名的局部变量,没有关系,互不影响,建议相同
•内存存放的位置的:栈内存中 堆内存中
•成员变量有默认值;局部变量没有默认值
java的引用
类型:引用其值为地址的数据元素,java封装了的地址,可以转成字符串查看,长度可以不必关心。C++指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int。
计算:引用是不可以计算的。C++指针是INT,所以他可以计算,所以经常用指针来代替数组下标。
6.控制:引用不可以计算,所以他只能在自己程序里,可以被控制。C++指针是内存地址,也可以计算,所以他有可能指向了一个不归自己程序使用的内存地址,对于其他程序来说是很危险的,对自己程序来说也是不容易被控制的。
7.内存泄露:JAVA引用不会产生内存泄露。C++指针是容易产生内存泄露的,所以程序员要小心使用,及时回收
.所占内存: 引用声明时没有实体,不占空间
java中String是引用数据类型
为什么String str="scce";
String str2="scce";
str==str2返回true而String str2=new String("scce"); str==str2返回false
String str="scce"; //这是在静态数据区创建了一个对象
String str2="scce"; //创建静态数据对象是先在静态数据区查,如果存在则不创建新的,保证静态数据区中的数据只有一份,
str==str2返回true //指向同一个对象
String str2=new String("scce"); str==str2返回false //在堆中创建一个对象,引用值当然不同
Stirng特殊在如果静态数据区中存在,那么不创建新的对象,而是指向这个对象。
String a=new String("foo");
String b=new String("foo");
两条 new 语句创建了两个对象,然后用 a/b 这两个变量分别指向了其中一个对象,这是两
个不同的对象,它们的首地址是不同的,即 a 和 b 中存储的数值是不相同的,所以,表达
式 a==b 将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回
true。
如果没有明确的初始化数组元素,那么数组就会用默认的类型值初始化,例如假若没有初始化整型数组,元素都将默认值为0,没有初始化的boolean值是false,对象数组是null。
数组 可以很方便的转换为arrayList
计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制寄存器。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量
数据寄存器- 用来储存整数数字(参考以下的浮点寄存器)。 作为数学计算之用。
地址寄存器- 持有存储器地址,用来访问存储器。在某些简单/旧的CPU里,特别的地址寄存器是索引寄存器(可能出现一个或多个)。
通用目的寄存器(GPRs) - 可以保存数据或地址两者,也就是说它们是结合数据/地址 寄存器的功用。
浮点寄存器(FPRs) - 用来储存浮点数字
特殊目的寄存器- 储存CPU内部的数据,像是程序计数器(或称为指令指针),堆栈寄存器,以及状态寄存器(或称微处理器状态字组)。
常数寄存器- 用来持有只读的数值(例如0、1、圆周率等等)。
向量寄存器- 用来储存由向量处理器运行SIMD(Single Instruction, Multiple Data)指令所得到的数据
指令寄存器(instruction register)- 储存现在正在被运行的指令。
索引寄存器(index register)- 是在程序运行时用来更改运算对象地址之用。
有关从随机存取存储器提取信息的寄存器与CPU(位于不同芯片的储存寄存器集合)
存储器缓冲寄存器(Memory buffer register)
存储器数据寄存器(Memory data register)
存储器地址寄存器(Memory address register)
寄存器的基本单元是 D触发器,
基本寄存器逻辑图 [3]
按照其用途分为基本寄存器和移位寄存器
基本寄存器(见图)是由 D触发器组成,在 CP 脉冲作用下,每个 D触发器能够寄存一位二进制码。在 D=0 时,寄存器储存为 0,在 D=1 时,寄存器储存为 1。
在低电平为 0、高电平为 1 时,需将信号源与 D 间连接一反相器,这样就可以完成对数据的储存。 [3]
储器的主要功能是存储程序和各种
存储器(16张)
数据,并能在计算机运行过程中高速、自动地完成程序或数据的存取。存储器是具有“记忆”功能的设备,它采用具有两种稳定状态的物理器件来存储信息。这些器件也称为记忆元件。在计算机中采用只有两个数码“0”和“1”的二进制来表示数据。记忆元件的两种稳定状态分别表示为“0”和“1”。日常使用的十进制数必须转换成等值的二进制数才能存入存储器中。计算机中处理的各种字符,例如英文字母、运算符号等,也要转换成二进制代码才能存储和操作。
需要强调的是,目前大型数字系统都是基于时钟运作的,其中寄存器一般是在时钟的边缘被触发的,基于电平触发的已较少使用。(通常说的CPU的频率就是指数字集成电路的时钟频率)
移位寄存器按照移位方向可以分为单向移位寄存器和双向移位寄存器
寻址:由地址寻找数据,从对应地址的存储单元中访存数据。
//jdk9: 11月
//jdk8 之后: 接口逐步靠拢抽象类
//jdk8的新特性:
//接口中可以声明方法:有方法体,方法的需要static修饰,方法可以设置成default
//抽象类和接口的区别:
/*
* 抽象类:
* 1、类前面加一个abstract修饰
* 2、抽象类不能实例化对象
* 3、抽象类只能被继承
* 4、抽象类可以有普通方法(具有方法体的方法),也可以有抽象方法
* 5、抽象方法所属的类必须是抽象类
*
* 接口:
* 1、interface声明的接口
* 2、接口中方法不能有方法体(jdk8之后,可以有静态方法和默认的方法-有方法体)
* 3、接口中的属性不能被修改(final),可以通过实现类调用,如果需要通过接口直接调用,需要声明为static
* 4、接口的方法:不能被private和protectd修饰
*
* 类称之为继承: 继承一个抽象类
* 接口称之为实现: 实现一个接口
•抽象类可以包含属性、方法、构造方法。
•抽象类不能实例化,及不能用new来实例化抽象类,只能用来被子类调用。
•抽象类只能用来继承。
•抽象方法必须被子类实现。抽象类的子类必须覆盖所有的抽象方法才能被实例化,否则还是抽象类
final static int a=8;
for (; ; ) {}
匿名内部类就是没有名字的内部类;
注意:
匿名内部类不能定义任何静态成员、方法。
匿名内部类中的方法不能是抽象的;
匿名内部类必须实现接口或抽象父类的所有抽象方法。
匿名内部类访问的外部类成员变量或成员方法必须用static修饰;
匿名内部类的特点:
1,一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
2,只是为了获得一个对象实例,不需要知道其实际类型。
3,类名没有意义,也就是不需要使用到。
所以Java只支持单重继承,想扩展功能,去实现接口吧。很快Java的设计者就发现了他们犯了矫枉过正的错误,多重继承还是有一定用处的。比如每一个人都是同时继承父亲和母亲两个类,要不然你的身体里怎么能留着父母的血呢?Java内部类应运而生。
内部类是面向对象的闭包,因为它不仅包含创建内部类的作用域的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员。一般使用一个库或类时,是你主动调用人家的API,这个叫Call,有的时候这样不能满足需要,需要你注册(注入)你自己的程序(比如一个对象),然后让人家在合适的时候来调用你,这叫Callback。
以下操作中,数组比链表速度更快的是____
A原地逆序
B头部插入
C返回中间节点
D返回头部节点
E选择随机节点
正确答案:A C E
数组是随机存取,线性表是逻辑上连续但物理上分开存放,
因此查询、修改操作数组更快,数组表示线性表的好处在于能随机存取
但插入、删除等操作线性表更快
数组可以头尾交换,相当于处理n/2个数据,而链表至少得完整遍历一遍
关于时序
(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
实际工作中需视不同的情况采用不同的哈希函数,通常考虑的因素有:
· 计算哈希函数所需时间
· 关键字的长度
· 哈希表的大小
· 关键字的分布情况
String java中参数的传递 生产者消费者 工程模式
关键点 notify () notifyAll() wait() 都是object的方法 要 用同步监视器的wait(); 时间片 private 连续泛型
调制解调
制解调器是一种计算机硬件,它能把计算机的数字信号翻译成可沿普通电话线传送的模拟信号,而这些模拟信号又可被线路另一端的另一个调制解调器接收,并译成计算机可懂的语言。这一简单过程完成了两台计算机间的通信。
调制解调器是Modulator(调制器)与Demodulator(解调器)的简称,中文称为调制解调器(港台称之为数据机),根据Modem的谐音,亲昵地称之为“猫”。它是在发送端通过调制将数字信号转换为模拟信号,而在接收端通过解调再将模拟信号转换为数字信号的一种装置
调制就是用基带脉冲对载波波形某个参数进行控制,形成适合于线路传送的信号。
解调就是当已调制信号到达接收端时,将经过调制器变换过的模拟信号去掉载波恢复成原来的基带数字信号。
采用调制解调器也可以把音频信号转换成较高频率的信号和把较高频率的信号转换成音频信号。所以调制的另一目的是便于线路复用,以便提高线路利用率。
基于载波信号的三个主要参数,可以把调制方式分为三种:调幅、调频和调相
heap 堆
String c = new String("xyz");①
String d = new String("xyz");②
让我们来看看这两句代码在内存中发生了什么,①Class被CLassLoader加载时,你的"xyz"被作为常量读入,在constant pool里创建了一个共享的"xyz",然后当调用到new String("xyz")的时候,会在heap里创建这个new String("xyz");②由于constant pool中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。
对于String c = new String("xyz");的代码,与String a = "abc"不同的是一概在堆中创建新对象,不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
程序1
String s1 = new String("xyz"); //创建二个对象,一个引用
String s2 = new String("xyz"); //创建一个对象,并且以后每执行一次创建一个对象,一个引用
程序2
String s3 = "xyz"; //创建一个对象,一个引用
String s4 = "xyz"; //不创建对象,只是创建一个新的引
。
多个参数
return 关键字 和break
return 可以作用在 函数中, 遇到return 函数结束, void 函数中也可以 使用return 但是return 后面不能写代码,因为执行不到那里 ,java 不允许写废话
函数的重载: 在一个函数中存在一个或多个同名的函数但是参数的类型或者个数不同叫做函数的重载
String s=new Sting("sss"); 创建了 俩个对象 类加载的时候先在常量池里面 创建 sss 然后 new String();
因为静态部分是依赖于类,而不是依赖于对象存在的,所以静态部分的加载优先于对象存在。
当找到main方法后,因为main方法虽然是一个特殊的静态方法,但是还是静态方法,此时JVM会加载main方法所在的类,试图找到类中其他静态部分,即首先会找main方法所在的类。
开始
父类静态代码
子类静态代码
父类非静态代码
父类构造函数
子类非静态代码
子类构造函数
结束
注意:类加载过程中,可能调用了实例化过程(因为static可以修饰方法,属性,代码块,内部类),此时则会暂停类加载过程而先执行实例化过程(被打断),执行结束再进行类加载过程,上面阿里那道面试题就是典型的暂停类加载。
1-3:类加载过程,不涉及构造方法
1-5: 实例化过程,涉及构造方法
1.类中所有属性的默认值(一举而成)
2. 父类静态属性初始化,静态块,静态方法的声明(按出现顺序执行)
3. 子类静态属性初始化,静态块,静态方法的声明 (按出现顺序执行)
4. 调用父类的构造方法,
首先父类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)
然后父类构造方法
5. 调用子类的构造方法,
首先子类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)
然后子类构造方法
.在Java中,使用”{}”括起来的代码称为代码块,代码块可以分为以下四种
1. 局部代码块
2. 构造块
3.静态代码块
4.同步代码块
一.在Java中,使用”{}”括起来的代码称为代码块,代码块可以分为以下四种:
1.普通代码块:就是类中方法的方法体
public void xxx(){
//code
}
2.构造块:用{}裹起来的代码片段,构造块在创建对象时会被调用,每次创建对象时都会被调用,并且优先于类构造函数执行。 构造块中定义的变量是局部变量。
{
//code
}
3.静态块:用static{}裹起来的代码片段,只会被执行一次(第一次加载此类时执行,比如说用Class.forName("")加载类时就会执行static block),静态块优先于构造块执行。
static{
//code
}
4.同步代码块:使用synchronized(obj){}裹起来的代码块,在多线程环境下,对共享数据进行读写操作是需要互斥进行的,否则会导致数据的不一致性。常见的是synchronized用来修饰方法,其语义是任何线程进入synchronized需要先取得对象锁如果被占用了,则阻塞,实现了互斥访问共享资源。而synchronized也是有代价的。一个常见的场景是,一个冗长的方法中,其实只有一小段代码需要访问共享资源,这时使用同步块,就只将这小段代码裹在synchronized block,既能够实现同步访问,也能够减少同步引入的开销。 同步代码块须写在方法中。
synchronized(obj){
//code
}
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码
* 。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。
* 另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
因此,子类的构造器除了承担着初始化子类的新增变量和方法,还要初始化父类自身新增加的变量和方法。一般来说,如果在子类的构造器中没有使用super()调用父类相应的构造器,子类的构造器会自动调用父类默认的,也就是不带参数的构造器来初始化父类的东西。
而Java类的默认构造器,当你没有为你写的类建造构造器的时候,Java会自动帮你创建这个默认构造器,但是当你自己编写了构造器后,你自己编写构造器将会覆盖掉默认的构造器,就是说默认的构造器不存在。那么这个时候,你在继承的子类里面没有显示添加super()函数调用你在父类里编写的父类构造器,子类的构造器将不能自动找到父类的构造器。找不到父类的构造器意味着什么?意味着你的子类实例化的时候找不到父类的构造器来初始化父类的东西,不能完成类实例对象的初始化工作,你说你的子类能不出现错误?!
类实例销毁时候:首先销毁子类部分,再销毁父类部分
protected void finalize()
throws Throwable
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
•修饰类:final类是无法被任何类继承的。
内部回收机制
接口中的作用域不能是protected
/抽象类和接口的区别:
/*
* 抽象类:
* 1、类前面加一个abstract修饰
* 2、抽象类不能实例化对象
* 3、抽象类只能被继承
* 4、抽象类可以有普通方法(具有方法体的方法),也可以有抽象方法
* 5、抽象方法所属的类必须是抽象类
*
* 接口:
* 1、interface声明的接口
* 2、接口中方法不能有方法体(jdk8之后,可以有静态方法和默认的方法-有方法体)
* 3、接口中的属性不能被修改(final),可以通过实现类调用,如果需要通过接口直接调用,需要声明为static
* 4、接口的方法:不能被private和protectd修饰
*
* 类称之为继承: 继承一个抽象类
* 接口称之为实现: 实现一个接口
*/Animal是一个接口,接口中可以声明属性,但是属性是不能被修改,所以一般声明属性的时候,需要
//在属性声明的时候,设置属性的访问修饰: final static
//接口中同样可以声明一个属性
final static String name = "张无忌";//属性不能被修改: final
dk9: 11月
//jdk8 之后: 接口逐步靠拢抽象类
//jdk8的新特性:
//接口中可以声明方法:有方法体,方法的需要static修饰,方法可以设置成default
接口中使用,在接口种被default标记的方法为普通方法,可以直接写方法体
子类优先继承父类的方法, 如果父类没有相同签名的方法,才继承接口的默认方法 多重继承??
ip地址的计算 和子网掩码 ,路由算法
异常
调制解调器 正弦波 时间复杂度 计算
请检查/var/log/syslog或查看第四虚拟控制台已获得详细信息
线程池的锁定
哈希表
字符串逆序
计算数据怎么写到磁盘的机
数组
makedir
makedirs()
equals
java中创建对象时其实不是通过类直接创建的,如果你想要使用Test类,在java中JVM首先加载Test.java文件的字节码文件Test.class(也就是编译后的文件),当JVM(java虚拟机)加载字节码文件后,自动为该类创建自己的class对象,在通过class对象创建你以后要创建的对象
例如:Test t1=new Test(); Test t2=new Test(); 我们都知道java中 == 是比较两个对象的内存地址,t1.getClass()==t2.getClass();返回是true,证明他们是一个class对象创建出来的。那么可Class对象的意义就是标志一个类了,Class类为我们提供了很多方法,比如反射技术常用到的Class.forName("包.类");这样可以获取一个类的Class对象。
Toolkit 定义的方法是“胶合剂”,将 java.awt 包中与平台无关的类与 java.awt.peer 中的对应物连接起来。Toolkit 定义的一些方法能直接查询本机操作系统。
import java.awt.Rectangle;
import java.awt.event.*;
import javax.swing.JOptionPane;