---------------------- android培训、java培训、期待与您交流! ----------------------
Java源代码也通过java编译程序编译成字节码文件(class),然后通过jvm在不同的平台上运行,从而达到跨平台的目的;
(后补的实验:自己借助公司的电脑略微实验了一下,一个64位xp的class文件也可以在一个32位xp电脑上运行,不过尽可能用低版本的编译器,不然运行不起来;试过张老师书里的那个1.7做的聊天室程序就不能1.6的机子上运行,其实老师的那本书内容挺老,其中使用的API等都是1.5之前的,也许是新版本编译的方式不同吧,所以就java就不认识了。)
Java兼顾编译性语言和解释性语言的特点,编译性语言即编译后再运行的语言,比如c之类的,解释性的则在执行时才转换为机器码,比如js之类的;
bin文件一般存放可执行的二进制文件
在cmd中如果输入javac和java能够出现使用帮助,那么安装的jdk基本可以用于开发
(自注:要在path中添加jdk的目录- -,而且要在电脑右键里的那个环境变量中去设置才是永久的,后面用set的方法是暂时的)
操作系统的环境变量就是在操作系统中定义的变量,可以供所有程序访问。
其中系统变量所有用户都能用,用户变量是某个用户的。
%path%代表path变量的值
用java -verbose可以知道启动的是哪个jdk的java(主要在机子上如果安装了多个版本的java,有时候可能会出现想用1.6时,结果用来1.5或1.7)
用通配符*可以加快cd切换目录的速度
将文件拖入运行对话框或cmd中可以显示文件的具体路径
cmd下用set命令可以查看环境变量。
set 变量=值可添加 set 变量=空 可取消
javac+源程序名即可编译成字节码文件class(自注:如果是空文档则没有任何文件产生)
如果一个源程序中有多个class,则会编译出多个class,如果加个public,则源程序名称要与class名相同
如果要单独执行一个类,那么类中必须要有public static void main(String[] args)函数
java对程序中命令的大小写是敏感的,大小写不正确也会引发错误
println等于print+换行符。
环境变量path的作用:当我们要执行某个命令时,操作系统首先会在当前目录下查找这个命令,如果当前目录没有,那么操作系统就会在path中所指定的目录中去依次查找这个命令,以最先找到的为准。
当我们想执行不是当前目录的类class时,可以设置(set)Classpath的值为想执行的类的所在目录,然后就可以用java+class名来执行相应的class了,即指定java虚拟机(JVM)要查找的类名所在的目录。
classpath后面加;.后就包含当前目录了;不能有空格,中文字符。
有jdk帮助文档(sun公司自己html版本的和网友整理的chm版本)可学习java用
有jad程序来反编译class文件(命令行版本)或者frontend(窗口版本),所以说class文件并不安全。
整型常量 :十进制(12) ,十六进制 (0x12),八进制(012)
长整型常量 :13L
单精度浮点数 : 5.1f,.4f ,2e3f ,0f
双精度浮点数 :5.1,.4,2e-3,0d
布尔常量 :true和false
字符常量 : ‘\r‘表示接受键盘输入,相当于按下了回车键;
‘\b‘是退格键,相当于Back Space;
null常量 :null常量只有一个值,用null表示,表示对象的引用为空
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论了。
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分;
instanceof 检验是否是某类的对象:”hello” instanceof String 返回true或false;
自己做的例子:class testinstance
{
public static void main(String[] args)
{
String s1="abc";
if (s1 instanceof String)
System.out.println("oh,my god");
}
}
(李刚的书中说过instanceof的前操作符必须是后操作符的父类,同类,子类,比如String instanceof Math,编译器都过不去,不过可以采用赋值给父类引用变量来“欺骗编译器”,因为编译器不管实际的运行情况;)
“&”和“&&”的区别在于,如果使用前者连接,那么无论任何情况,“&”两边的表达式都会参与计算。如果使用后者连接,当“&&”的左边为false,则将不会计算其右边的表达式。“|”和“||”的区别与“&”和“&&”的区别一样。 (自注,不要跟c弄混了,c中只有短路运算)
“>>”和“>>>” 区别的实例分析:
public class ShiftTest
{
public static void main(String [] args)
{
int x=0x80000000;
int y=0x80000000;
x=x>>1;
y=y>>>1;
System.out.println(“0x80000000>>1 = ” + Integer.toHexString(x));
System.out.println(“0x80000000>>>1 = ” + Integer.toHexString(y));
}
}
运行结果如下:
0x80000000>>1 = c0000000
0x80000000>>>1 = 40000000
十六进制与二进的对比
0x8000000016 =1000,0000, 0000, 0000, 0000, 0000, 0000, 00002
0xc000000016=1100,0000, 0000, 0000, 0000, 0000, 0000, 00002
0x4000000016 =0100,0000, 0000, 0000, 0000, 0000, 0000, 00002
使用System.arraycopy()函数拷贝数组 ;用Arrays.sort 来排序数组
面向对象的三大特征
– 封装 (Encapsulation)
– 继承 (Inheritance)
– 多态 (Polymorphism)
“==”运算符与equals()方法的区别:前者在比较数组或实例对象时,比较的相当于c语言中的指针的地址,通常是不同的,而equals()则比较的是内容。
(自注,object的==和equals方法是相同的,所以严格说equals不是比较内容,就是一个自定义的方法,可以覆盖重写,而且很多对象自己写好了符合自身特点的equals,对它的结果不满意可以重写,这样理解equals才更正确,就好象打印对象其实调用对象的toString()方法一样,你对打印结果不满,同样可以自定义打印结果,这个在银行调度系统中也有体现,老师重写了枚举类的tostring方法,所以本来打印大写字母名称来,变成了对应的汉字名称,使程序更加灵活)
我们可以不定义实例对象,而直接调用这个对象的方法。这样的对象叫做匿名对象, 如:new Person().shout();如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象;(自我感觉这个在线程中的runnable对象和GUI中的new windowAdapter之类的情况下经常出现,因为往往这些对象设计的代码都不多,方法也很少,单独弄一个对象略显累赘,用匿名子类的方式反而能够是代码结构更紧凑)
我们经常将匿名对象作为实参传递给一个函数调用;
类的封装就是用private修饰成员变量,使其不能被外界直接调用,只能用类自带的public修饰的方法来修改成员变量;(比如get和set) ;这可以实现强内聚,弱耦合的效果;
封装类的优点:(李刚的那本java疯狂讲义中提过继承其实会破环父类的封装性,所以建议没有必要的时候其实应该采用组合的方法来达到借用父类方法的作用,就是在子类中定义一个父类的实例作为属性,然后在自己的同名方法中调用父类的同名方法,这样在外界看来和继承的效果一模一样;而且没有多出任何系统开销,因为继承父类的子类,系统也会隐式的创建一个父类实例;感觉这个办法真的很棒,不知张老师视频为何没提到,可能是怕内容过多无法吸收)
隐藏类的实现细节;(知识产权的角度)
让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;(即强内聚,弱耦合)
便于修改,增强代码的可维护性;(修改时只改类的方法即可,不然主体中凡是涉及到的都要修改,这样想来,这恐怕是封装类的最重要的理由)
只有public类要求类名和文件名相同,所有一个源程序文件中只能有一个public类
使用this关键字的三个场合:
1、This.name=name(类的方法的形参和成员变量名相同,看起来清楚直观);
2、容器类部件类时,不太懂,先记着。。。;
3、构造函数调用另一个构造函数时(为了省代码,比如有段代码是几个构造函数共有的,都写上太麻烦了,把共有的部分写入一个构造函数中,然后其他的通过this(参数列表的形式调用它就好了))(自注:挺有意思的一个想法,如果一个类初始化的变量内容很多的话,确实这样省事多了)
(在张老师的聊天室程序中,将接受信息的线程的代码放到了chat类的构造函数中,这样确保接受程序可以先启动;)
---------------------- android培训、java培训、期待与您交流! ----------------------