java的一些特性
-
简单性
-
面向对象
-
分布式
-
健壮性
-
安全性
-
体系结构中立
-
可移植性
-
解释型
-
高性能
-
多线程
-
动态性
对于布尔类型的笔记:
布尔类型有两个值,true和false。用来判断逻辑条件。,整型和布尔型之间不能相互转换,也就是说在对于c和c++来说,0等于false,1等于true。但对于java来说如果这样做,就会报错,如果要把false转换从0,true转换成1,可以使用条件语句,
boole1?1:0;
面向对象
对于面向过程的程序原来说,他们的工作方式首先要确定如何操作数据,然后再决定如如何组织数据,也便于数据的操作。这也是为什么说,程序=算法+数据结构,把算法放在第一位。儿对于面向对象(OOP)来说却调换了这个顺序,将数据放在对一位,然后在考虑操作这个数据的算法。
对象
对于Java对象来说,如果没有mew出来的话,效果就类似与指针,是一个堆内存的引用。一定要认识到:一个Java对象并没有包含一个实际的对象,而仅仅是引用了一个对象。在java中任何对象变量的值都是对存储在另一个地方的对象的引用。new操作符的返回值也是一个引用
Date birthday = new Date(); Date birthday1 = birthday;
上面语句有两部分,表达式new Date()构造了一个Date类型的对象,并且它的值是对新创建对象的引用,这个引用存储在birthday中。这是java核心卷的说法,我的理解是new Date()创建了一个Date类型的对象,并把它存储在堆内存中,然后把这个对象在堆想的地址存储在date中。Date birthday1 = birthday,birthday也指向了相同的内存,当执行
birthday=null;
时并没有把真正的当时创建了Date类型对象删除,只是把date引用的地址编程了null,不引用任何类型,而Date类型还在堆内除在,等待Java的垃圾回收器。
java局部变量是不会初始化为null的。而必须通过new或将它们设置为null进行初始化。
c++注解:很多人错误的认为java对象变量与c++的引用类型类似。然而,在c++中没有空引用,并且引用不能被赋值。可以将java的对象看作c++的对象指针。列如:
Date birthfay;//java
实际上,等同于
Date* birthday;//c++
一旦理解了这一点,一切问题都迎刃而解。当然,一个Date*指针只能通过调用new进行初始化。这一点来说,c++与Java的语法几乎是一样的。
Date* birthday = new Date();//c++
如果吧一个变量的值赋值给另一个变量,两个变量就指向同一个日期,或者可以说两个变量所引用的对象地址相同,都指向同一个堆内存。即是同一个对象的指针。在java中的null引用对应c++的NULL指针。
所有的java对象都存储在堆中,当一个对象包含另一个对象变量时,这个变量依然包含着指向另一个堆对象的指针。
方法参数
总结一下Java中参数的使用情况
- 一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让一个对象参数引用一个新的对象
关于利用static的的共享,完成对员工id的自增操作
在java中static修饰的变量只有一个,会被类创建的所有对象共享,利用代码块对static的变量就是自增操作,因为每次在new操作时都会执行代码块中的程序,这样被static标记的变量每次在创建新的对象是都会自增。
package hsj.alalgorithm;
import javax.xml.transform.sax.SAXTransformerFactory;
import java.util.*;
/**
* Hello world!
*
*/
public class App<E>
{
public int id;
public static int nextid=1;
{
id = nextid;
nextid++;
}
public int getId(){
return id;
}
public static void main( String[] args )
{
App app = new App();
App app1 = new App();
System.out.println(app.getId());
System.out.println(app1.getId());
}
}
关于继承的一些笔记
动静态绑定
弄清楚java方法的调用过程,对我们理解程序十分重要,下面假设要调用x.f(args),隐式参数x声明为C类的一个对象。接下来我们来讨论调用的细节过程:
1)编译器参看对象声明的类型和方法,假设调用x.f(param),且隐式参数声明为X的对象,此时编译器会参看方法f(),是否有重载的方法,如果有重载的方法,编译器会再通过参数来判断调用哪个方法。通过参数来确定调用那个方法时称为重载解析,由于存在自动类型转换,这个确定的过程可能会比较复杂。如果编译器没有找到与之匹配的方法,或者是经过类型转换后,有多个与之匹配的方法,这是编译器就会报错。这个过程称为动态绑定。
*注意:方法的名称和方法的参数称为方法签名,如果在超类中有和子类相同方法签名的方法,那么子类中的方法就会覆盖超类中的方法,但由于返回类型不是签名中的一部分,随意要保证放回类型的一致性。
如果是private方法,static方法,final方法或者构造器,那么编译器可以准确的知道调用呢个方法,我们将这种方法称为静态绑定
每次调用方法都要搜索,时间开销很大。因此,虚拟机预先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法。这样调用方法的时候只需要查表就可以了。
记录一下Java读取文件的简单方法
首先需要对流的概念需要有理解:
在Java API中可以从其中读入一个直接序列的对象称作输入流,而可以向其中写入一个字节对象的称为输出流。(在Java中输入输出是对于内存来说的,相对于内存输入内存称为读入或输入,而从内存写到文件称作写出或输出。)这些字节序列的来源和目的地可以是文件,而且通常都是文件。但也可以是网络连接,甚至是内存块。抽象类InputStream和OutputStream是I/O类家族的基础类。在这里可以把输入和输出的过程看作是对一个水池的操作
输入:
对于输入,我们的目标是要把文件或者其他地方的内容输入到内存中或者是程序中。这个过程可以分成三部分。
-
首先就是我们的目标文件,可以把目标文件看作是一个装这我们需要读取内容的池子。这个池子可能是字节也可能是字符,这样产生的流就分为字节流和字符流。我们需要做的就是打开这个文件
FileInputStream file = new FileInputStream("D:\\qq\\a.txt");//或者 /************************************************************************/ File file = new File("D:\\qq\\a.txt"); FileInputStream file = new FileInputStream(file);
这个过程就好像给个装这目标序列的池子装上一个水龙头。接下来要做的就是把这个水龙头装上水管,让这些直接流(相当于水流)可以流向内存。
-
怎么装水管,
InputStreamReader input = new InputStreamReader(file, "GBK"); //GBK是字节编码的方式,有时候会出现乱码,需要给出指定的编码方式。GBK是简体中文的编码。
反射
反射库提供了非常丰富且精心设计的工具集,目的是为了以编写能够动态操作java代码的程序。使用反射,特别是在设计或运行中添加新类时,能够快速地应用开发工具,动态的查询新添加类的能力,能够分析类能力的程序称为反射。
反射机制可以用来:
-
在运行时分析类的能力
-
在运行时查看对象,例如编写一个toString()方法供所有类使用
-
实现通过数组操作代码(这条还不是很懂)
-
利用Method对象,这个对象很像c++中的函数指针。
在程序运行期间,java运行时系统始终为所有对象都维护一个被称为运行时的类型标志。这个信息跟踪着每个对象所属的类。虚拟机利用运行时的类型选择相应的方法执行。
我们可以通过java的类访问这些信息,保存着这些信息的类被称为Class。Object类中的getClass()方法可以返回一个Class实例。
内部类
简单介绍一下内部类,内部类分为成员内部类,局部内部类,匿名内部类,静态内部类。内部类是定义在另一个类中的类,主要原因有以下三点:
1、内部类可以访问该类所在的作用域中的数据,包括私有的数据。
2、内部类可以对同一个包中的其他类隐藏起来。
3、想要定义一个回调函数,但不想写大量代码是可以使用匿名内部类比较便捷
成员内部类:
成员内部类相当于是外部类的一个成员变量,我们在对成员操作时有点类似于对成员变量得的操作。接下来我们来具体分析内部类的执行。
lambda表达式
了解如何是使用lambda表达式写出简洁的代码。
**为什么要引入lambda表达式:**lambda表达式是一个可传递的代码块,可以在以后执行一次或者多次。
接下来是lambda的格式
(String frist,String second)->frist-length()-second.length
()->,这就是lambda的基本表达式,->后面接的是表达式,如果一行表达式写不下也可以用{}括起来。lambda可以根据上了文件推断出返回值,也可以显示的给出表达值。但是如果lambda表达式只是子在某些分支上返回一个值,而在另外一些分支不返回值,这是不合法的
java泛型
泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。
在java出现泛型之前,泛型程序设计是用继承来实现的,