java 学习笔记之二
来源:互联网 发布:mac怎么设置分辨率 编辑:程序博客网 时间:2024/04/29 10:09
位运算
lesson2a
一、计算机中数据的表示方法
计算机是一种 电子设备 ,由复杂的电子元器件组合而成,一个电子元器件 有带电和 不带电 两种状态,通常我们将 带电状态 表示为 数值1,不带电状态 表示为 数值0,多个这样的 元器件 的组合可以表示更多状态,也就是可以表示更多的数据,如 000表示0,001表示1,010表示2,011表示3,依此类推,111表示7,一个元器件可表示 一位(bit)数据,这种表示数据的方式就叫 二进制。在实际的电子设备中,我们将 8个 这样的 元器件 形成一个单元,这样的单元叫 一个字节(byte),一个字节能表示多少个数呢?表示数值的范围是0-255。
一个字节由8个二进位组成,其中最右边的一位称为“最低有效位”或“最低位”,最左边的一位称为“最高有效位”或“最高位”。每一个二进位的值是0或1。
二进制计数的缺点: 书写太长,容易出错,一般计算机的数据位数都是4的整数倍,所以,在计算机里通常采用 16进制计数法 。用数字可以表示各种信息,计算机里只有数值,当你在内存中看到一个数值时,这个数值可能代表各种意义,生活中的数值也可以代表其他意义,如1234可以代表 密码,存款额,电报信息,根据上下线索,我们就能够知道这数值代表的意义。
原码、反码和补码
1. 原码
将 最高位 作为 符号位 (以0代表正,1代表负),其余各位 代表数值本身的绝对值(以二进制表示)。为了简单起见,我们用1个字节来表示一个整数。
+7的原码为:00000111
-7的原码为:10000111
问题:
+0的原码为:00000000
-0的原码为:10000000
2. 反码
一个数如果为正,则它的反码与原码相同;
一个数如果为负,则符号位为1,其余各位 是对原码取反。
为了简单起见,我们用1个字节来表示一个整数。
+7的反码为:00000111
-7的反码为:11111000
问题:
+0的反码为:00000000
-0的反码为:11111111
3. 补码利用溢出,我们可以将减法变成加法。
对于十进制数,如果从9得到结果5,可以用减法:
9-4=5
因为4+6=10,我们将6作为4的补数,将上式的减法改写为加法:
9+6=15
去掉高位1(也就是减去10),得到结果5。
对于16进制数,如果从c得到结果5,可以用减法:
c-7=5
因为7+9=16,我们将9作为7的补数,将上式的减法改写为加法:
c+9=15
去掉高位1(也就是减去16),得到结果5。
在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为:
1 00000000
进位1被丢弃
已知一个负数的补码,将其转换为十进制数,步骤:
1、先对各位取反;
2、将其转换为十进制数;
3、加上负号,再减去1。
例如:
11111010,最高位为1,是负数,先对各位取反得00000101,转换为十进制数得5,加上负号得-5,再减1得-6。
位运算符
为了方便对二进制位进行操作,java给我们提供了 四个 二进制位操作符:
&按位与
|按位或
^按位异或
~按位取反
1. 按位与
一个房间里有两个开关控制房间的灯的明暗。当两个开关同时处于打开状态时,灯才能亮。
开关1开关2灯的状态
关关暗
开关暗
关开暗
开开亮
按位与
01101101
00110111
00100101
结论:按位与,只有壹(1)壹(1)为1。
lesson2b
2.按位或
一个房间里有两个开关控制房间的灯的明暗。s当任何一个开关处于打开状态时,灯就能亮。
开关1开关2灯的状态
关关暗
开关亮
关开亮
开开亮
按位或
01101101
00110111
01111111
结论:按位或,只有零(0)零(0)为0。
3.按位异或
一个房间里有两个开关控制房间的灯的明暗。当两个开关处于不同状态时,灯就能亮。
开关1开关2灯的状态
关关暗
开关亮
关开亮
开开暗
按位异或
01101101
00110111
01011010
结论:按位异或,只有零(0)壹(1)或壹(1)零(0)为1。
4.按位取反
~01101101
10010010
结论:对二进制数按位取反,即0变成1,1变成0。
5.移位运算符
java中有三个移位运算符
左移:>
无符号右移:>>>
数xx>2x>>>2
170001000100 0100010000000100 0100000100 01
-171110111111 1011110011111011 1100111011 11
leeson3c
1. 对类库作了简单介绍和怎样使用。
2. java.lang.integer : static string tohexstring( int i )//将一个十进制数转换成十六进制数
移位操作举例
1class test
2{
3public static void main(string[] args)
4{
5int i=0xffffffff ;//i= -1 ;
6//int c=i//c= -4 ?低八位 fc
7//int c=i>>2;//c= -1;
8int c=i>>>2;//c= 3f(高八位)
9system.out.println(i);
10system.out.println(integer.tohexstring(c));
11
12}
13}
3. 练习:将一个整数110从右端开始的4~7位变为0。
方法:左移3位取反
key:00001111------> 01111000------> 10000111------->再与110进行与运算
4. 左移一位相当于乘以2,反之,右移一位相当于除以2。
java的面向对象编程
class point : int x; int y; void output(){ println(x/y) };
面向对象编程概述
简单的说,面向对象编程(object oriented programming,简称oop)描述的是对象之间的相互作用。
面向对象编程与面向过程编程的区别:
过程化程序设计先确定算法,再确定数据结构;
面向对象编程先确定数据结构,再确定运算。
面向过程编程的程序员,习惯于建立数据结构存放数据并定义方法(函数)来操作数据;
面向对象编程的程序员则构造一个对象模型,将数据与方法组织在一起。
lesson2d
1. 对象对象的状态对象的行为
我们可以把现实世界的事物抽象成对象。
对象一般都有两个特征:状态(state)和 行为 (behavior)。
软件的对象概念是由现实世界对象抽象而来 。把现实世界对象的状态保存在软件对象的变量中;现实世界对象的行为通过软件对象的方法(函数)来实现。
2.类和对象
1) 把相似的对象划归成一个类。
2) 在软件中,类,就是一个模板,它定义了通用于一个特定种类的所有对象的状态(变量)和行为(方法)。
3) 类是创建对象的模板,对象是类的实例。
3.面向对象程序设计
1) 从程序设计的角度看,类是面向对象程序中最基本的程序单元。类实质上定义的是一种数据类型,这种数据类型就是对象类型 。所以我们可以使用类名称来声明 对象变量。
2) 声明对象变量之后,还不能使用对象。必须用运算符new创建对象实体之后,才能使用对象。
class point : main(): new pt; pt.x=10;pt.y=5;pt.output();
4.面向对象编程的难点
掌握面向对象的困难之处在于思路的转换。
我们通常习惯于考虑解决问题的方法,而不是考虑将问题抽象成对象再去解决它。
一个简单的例子:编写一个驾驶汽车的方法
1) 面向过程的程序设计:
编写一个方法,void drivecar();
2) 面向对象的程序设计:
将一辆汽车看成一个对象,将所有汽车对象的共性抽取出来,设计一个类car,类中有一个方法void drive(),用car这个类实例化一个具体的对象car,调用:car.drive()。
5.类的构造方法
?1) 构造方法的名字和类名相同,并且没有返回值。
?2) 构造方法主要用于为类的对象定义初始化状态。
?3) 我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例。
注意:java的类都要求有构造方法,如果没有定义构造方法,java编译器会为我们提供一个缺省的构造方法,也就是不带参数的构造方法。
class point : point(){初始化};
point(int a,int b){……};//构造对象时,系统自动调用。
6.反编译工具:(针对字节码)javap point (加载的是一个类)
lesson2e
java会给用户提供一个 无参 构造函数,一旦用户定义了一个构造函数,则…….
1.new关键字的作用
?1)为对象分配内存空间。
?2)引起对象构造方法的调用。
?3)为对象返回一个引用。
2.缺省构造方法
?当我们用 缺省的构造方法 初始化对象时,系统用 默认值 初始化对象的成员变量。
3.各种数据类型的默认值为:
数值型0
booleanfalse
char‘"0’
对象null
说白了,就是构造方法可以重载,但构造对象时又去调用哪一个构造方法呢?想一想?
4.方法的重载(overload)
重载构成的条件:方法的名称相同,但参数类型或参数个数不同,才能构成方法的重载。
class point: void output(){println(x/y};||void output(int x,int y){…};
caution: 当方法中的 形参 与 成员变量 相同时,成员变量 在该方法体内不可见,想可见,用this变量或将参数名改为其它名字。
5.特殊变量this
1) this变量代表对象本身
2) 当类中有两个同名变量,一个属于类(类的成员变量),而另一个属于某个特定的方法(方法中的局部变量),使用this区分成员变量和局部变量。
3) 使用this简化构造函数的调用。例:point(){ this(1,1); }
6.关于实例方法和 实例数据成员 的进一步说明
一个类所有的实例(对象)调用的成员方法在内存中只有一份拷贝,尽管在内存中可能有多个对象,而数据成员在类的每个对象所在内存中都存在着一份拷贝。
lesson2f
1.this变量允许相同的实例方法为不同的对象工作。每当调用一个实例方法时,this变量 将被设置成引用该实例方法的特定的类对象。方法的代码接着会与this所代表的对象的特定数据建立关联。
class point: static void output(){….}; //静态方法,只属类本身,又称类方法。
main(): point.output(); //直接用类名去调用静态方法。
2.在静态方法中不能访问非静态的方法和成员变量 。但可访问静态的成员方法和变量。
caution: 编程时,脑海中要有内存模型的概念。-----孙鑫老师言
想一想在一个非静态的方法中是否可以访问静态的方法和变量呢?(从内存模型的角度去考虑)。
3.关键字static
?1)静态方法和静态变量是属于某一个类,而不属于类的对象。
?2)静态方法和静态变量的引用直接通过类名引用。
?3)在静态方法中不能调用非静态的方法和引用非静态的成员变量。反之,则可以。
eg: 可以用类的对象obj去调用静态的方法method(),如:obj.method()。
main(): new pt; pt.output(); //static void output(){….};
4.main()方法也是静态方法,不属于任何一个类。为了解决程序运行的问题。要区分类方法和实例方法,虽然他们都只有一份拷贝(在内存中)。
5.静态成员变量之应用:用于统计计数。
6.常量的定义
final double pi=3.1415926; //必须声明的同时进行初始化。但实际上,可以将初始化工作放在构造函数中。
lesson2g
1. point(){ this(1,1);}//语句this(1,1)前面不能有任何语句
2. 常量的定义
?使用关键字final定义常量,例如:final double pi=3.1415926;
注意: 作为一种约定,在定义常量时,通常采用大写形式。
3. final常量可以在声明的同时赋初值,也可以在构造函数中赋初值。为了节省内存,我们通常将常量声明为静态的(static)。
注:static final double pi=3.1415926; 声明同时必须进行初始化(因为有了static修饰)。
class animal : int height, weight;| void eat(){…}; void breathe(){…};void sleep(){…}
class fishextends animal:
class integration: main(): new an; new fh;||an.breathe(); fh.breathe();fh.height=30;
4. 类的继承
?1) 理解继承是理解面向对象程序设计的关键。
?2) 在java中,通过关键字extends 继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。
?3) 在java中,不允许多继承。
class fish extends animal: void breathe(){ super.breathe(); 重写这个方法};
5. 方法的覆盖(override)
?1) 在 子类 中 定义一个与父类同名、返回类型、参数类型均相同的一个方法,称为方法的覆盖。
?2) 覆盖发生在 子类 与 父类 之间。
3) 用super.breathe()来访问被子类覆盖的父类方法
6. 特殊变量super
?1) 特殊变量super,提供了对父类的访问。
?2) 可以使用super访问父类被子类隐藏的变量或覆盖的方法。
?3) 每个 子类构造方法 的第一条语句,都是隐含地调用super( ),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
lesson2h
class animal : animal(){print(animal);};
class fish extends :fish(){super(); …. };//没有父亲,哪有孩子呢?
若类animal中有自定义构造函数(带参数),则…….
注:构造方法是不能继承的,所以只能用super来代替。
class integration: static void fn(animal an);
main(): new fh; animal an; an=fh; integration.fn(an);
1.多态性
1) 通过覆盖父类的方法来实现,在运行时根据传递的 对象引用,来调用相应的方法。
2) 子类对象的引用赋给父类的变量,子类有的方法就调用子类的方法,若子类没有的方法就调用父类的方法。
2. 操作符instanceof的使用:
main(): new an; new fh; if(an instanceof animal){..is…} | if(fh instanceof fish){…is…}.
if(an instanceof fish){….is…} else{…isn’t…}
if(fh instanceof animal){…is…} else{…isn’t….}.//子类对象是父类的一个实例
于是,将an = fh;再去判断以上操作?
lesson2i
面向对象的程序设计
?问题:求一个长方形的周长和面积。
1. 以面向过程的程序设计方式思考:
1) 确定长方形周长和面积的算法。
2) 编写两个方法(函数)分别计算长方形的周长和面积。
3) 求周长的方法(函数)和求面积的方法(函数)需要两个参数,分别是长方形的长和宽。
面向过程的程序设计代码:
class rectangle
{
static int perimeter(int length,int width)
{
return 2*(length+width);
}
static int area(int length,int width)
{
return length*width;
}
public static void main(string[] args)
{
system.out.println("perimeter = “ + rectangle.perimeter(5,4));
system.out.println("area = “ + rectangle.area(5,4));
}
}
2. 以面向对象的程序设计方式思考:
1) 一个长方形可以看成一个长方形对象。
2) 一个长方形对象有两个状态(长和宽)和两个行为(求周长和求面积)。
3) 将所有长方形的共性抽取出来,设计一个长方形类。
4) 通过长方形对象的行为,就可以求出某个具体的长方形对象的周长和面积。
class rectangle : int l; int w; |int perimeter(){……}; int area(){… …}
main(); new rect1; new rect2; rect1.l=10;rect1.w=5; println(…………);
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
- java 学习笔记之二
- JAVA学习笔记之二
- Java学习笔记之二
- java学习之java笔记(二)
- java 5.0学习笔记之二
- JAVA虚拟机源码学习笔记之二
- Java Web开发学习笔记之二
- JAVA学习笔记之二(对象)
- java学习笔记之StringBuffer(二)
- JAVA解惑学习笔记之二----字符串
- JAVA学习笔记二之(1)注释
- JAVA学习笔记二之(4)数据类型
- Java学习笔记之Swing(二)
- JAVA学习笔记(二)
- JAVA学习笔记二
- Java学习笔记二
- java学习笔记二
- JAVA学习笔记《二》
- Java实例开发05-01 简单的多线程服务器
- MushRoom_lb
- Java final关键字解释
- Java引用多个jar包的写法
- 【转载】Java的浮点数
- java 学习笔记之二
- PHP调用java的class
- C#和Java的代码转换工具(开源)CSharpJavaMerger Framework
- Flying Dreams
- Java回调函数(方法)
- 高端JAVA培训 给力大学生就业路
- Java之父评价C语言之父:我用尽了形容词
- Java笔试题
- java中使用向前查找和向后查找