20天jvava(8)

corejava day03 - java day08
static/final/抽象类/接口/Object类
2011/07/26
回顾:
1.继承 子类<->父类
特点:子类继承父类的属性和方法,同时还可以定义
新的属性和方法,“is a”,子类可以重写父类的方法,
单继承,不会继承父类的构造方法
子类对象的创建过程:Student s = new Student();
递归分配父类空间->分配子类空间
->调用父类的构造方法->初始化子类的属性->
调用子类的构造方法
super关键字的使用 - this
2.访问控制
public - 公共级别,公开访问
protected - 受保护级别,同一个包或者子类(通过super访问)
[default] - 默认级别,同一个包中的类访问
private - 私有级别,当前类才能访问
JavaBean(可以复用的类)的规范:
有包、有无参构造方法,
属性私有并提供getter/setter方法
3.方法重写(Override)
方法重载(Overload)
4.多态:通过向上造型使类在运行时具有动态的行为
Shape s = new Circle();
double aArea = s.area();
向下转型:父类->子类,强制类型转换,instanceof
if(s instanceof Rectange){
Ractange rect =(Rectange)s;
}

=======================================
1.static和final
1)static关键字,可以用来修饰类的成员变量、方法和代码块。
a.静态变量: 用static修饰的成员变量,
通过类名直接访问,如Math.PI
静态变量在内存中只有一份拷贝,
Java虚拟机在类的加载期间只为静态变量分配一次内存,
所有类和类的实例共享的一个变量
没有被static修饰的成员变量,称作实例变量。
每次创建一个类的实例,就会为实例变量分配一次内存,
实例变量在内存中有多个拷贝,互不影响。
public class StaticDemo1{
public static int number;
public void show(){
int x = niumber;//在类的内部可以直接访问静态变量
}
}
public class StaticDemo2{
public void method(){
int x = StaticDemo1.number;//通过类名直接访问静态变量
}
}
b.静态方法:用static修饰的方法,通过类名直接访问
是全体类公有的工具方法。静态方法和类的实例无关。
在静态方法中不可以使用“this”,
静态方法只能访问静态成员。
c.静态代码块:用static修饰的程序代码块,
当Java虚拟机加载类时执行该代码块。
多个静态代码块按出现顺序依次执行

2)final关键字
a.final 修饰的类,不能再被继承。
Java 的String、Math就是final类,不能被继承!
public final class String{...}
public final class Math{...}
b.final修饰的方法,不能再被覆盖(方法重写)。
c.final 修饰的变量,初始化以后不允许再修改了。
final可以修饰成员变量、 局部变量、方法参数
3)static final 常量
Java使用final static定义常量。
一般要求常量名都有大写字母。
2.接口和抽象类
1)抽象类和抽象方法
a.抽象方法:用abstract修饰的方法,
抽象方法没有方法体。
抽象方法用来表示系统具有什么功能,
但不提供具体的实现。
b.抽象类:用abstract修饰的类,
抽象类不能被实例化,不允许创建抽象类的对象
c.抽象方法和抽象类遵循以下规则:
(1)抽象类中可以没有抽象方法,
但包含抽象方法的类必须定义为抽象类
(2)不能定义抽象构造方法,也不能定义抽象静态方法
(3)抽象类中可以有非抽象的构造方法,创建子类对象时可以调用这些构造方法
(4)抽象类及抽象方法不能使用final修饰符
(5)抽象类不能直接创建实例,可以定义引用变量引用子类的实例(即向上造型)
(6)一个具体类继承一个抽象类,必须重写所有抽象方法
如:平面图形一定可以计算面积。
public abstract class CRMSystem{
public abstract Client addClient(String name, String qq);
public abstract Client removeClient(int clientId);
//...
}

2)接口
a. 接口用来表示纯抽象概念,
没有任何具体的方法和属性。
接口用于描述系统对外提供的功能和服务,
能够清晰地把系统的实现细节和接口分离。
b. 使用interface定义接口,接口中只能包含常量和抽象方法。
接口中的变量默认是常量,接口中的方法默认公有抽象方法
接口之间可以继承。
c. 类可以使用implements实现接口,
需要实现接口的全部抽象方法。
Java支持一个类实现多个接口
d. 接口不能实例化,可以定义引用变量来引用具体实现类的实例。
接口只能被实现,一个具体类实现接口,必须使用全部的抽象方法。
3)比较接口和抽象类
a. 相同点:都不能实例化,都能包含抽象方法
b. 区别:抽象类可以为部分方法提供默认的实现,
从而避免子类重复实现它们,
提高了代码重用性,这是抽象类的优势所在,
而接口中只能包含抽象方法。
一个类只能继承一个抽象类,
但一个类可以实现多个接口,这是接口的优势所在。
3.java.lang.Object API
Object是Java中所有类的root类(根父类),
所有类都从 这个类继承
public boolean equals(Object obj)
public int hashCode()
public String toString()
1)equals方法
equals 是用来比较两个对象是否相等的方法。
区别:引用相等 与 对象相等
引用相等: 使用 “==”,如果两个对象的引用地址相同,
结果为,否则为false
对象相等: .equals() 方法
equals在Object类中声明,默认的比较规则是:比较引用
建议覆盖,实现对象的比较(比较对象的状态,就是比较对象
的数据)。
* 覆盖规则:
a 自反性:对于任何非空引用值 x,x.equals(x)
都应返回 true。
b 对称性:对于任何非空引用值 x 和 y,当且仅当
y.equals(x) 返回 true 时,x.equals(y)
才应返回 true。
c 传递性:对于任何非空引用值 x、y 和 z,如果
x.equals(y) 返回 true,并且 y.equals(z) 返回
true,那么 x.equals(z) 应返回 true。
d 一致性:对于任何非空引用值 x 和 y,多次调用
x.equals(y) 始终返回 true 或始终返回 false,
前提是对象上 equals 比较中所用的信息没有被修改。
e 对于任何非空引用值 x,x.equals(null) 都应返回
false。
2)hashCode方法:返回对象哈希码(值)
hashCode()方法要与equals方法一同覆盖
a 当两个对象equals比较为true时候,这两个对象应该
具有相同的hashCode()值
b 当两个对象equals比较为false时候,这两个对象应该
具有不相同的hashCode()值
c hashCode() 值要稳定(一致性),一个对象创建以
后就不应该再变化
2 默认的hashCode() 值是当前堆对象地址转换的一个整数
这个整数不是内存地址。
3 一般使用对象的OID值作为hashCode的值。
OID 对象的唯一编号,
在工程项目中一般采用数据库来
生成OID,也就是数据库中的“主键”
3)toString方法
返回对象的文本描述, 经常被系统默认调用, 默认返回: 全限定名@HashCode;
建议覆盖toStirng(), 返回合理的文本


课堂练习:

设计“斗地主”游戏中的Card类
1) 定义常量表示点数和花色
2) 提供get和set方法及非法参数异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用InputStream和OutputStream类来读写二进制文件。InputStream用于读取二进制数据,而OutputStream用于写入二进制数据。下面是一个简单的示例代码,展示了如何使用InputStream和OutputStream读写二进制文件: ```java import java.io.*; public class BinaryFileReadWrite { public static void main(String[] args) { String filePath = "example.bin"; try { // 创建二进制文件并写入数据 OutputStream outputStream = new FileOutputStream(filePath); byte[] data = {1, 2, 3, 4, 5}; outputStream.write(data); outputStream.close(); // 读取二进制文件 InputStream inputStream = new FileInputStream(filePath); byte[] buffer = new byte[1024]; int bytesRead = inputStream.read(buffer); while (bytesRead != -1) { // 处理读取到的数据 for (int i = 0; i < bytesRead; i++) { System.out.print(buffer[i] + " "); } bytesRead = inputStream.read(buffer); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的示例代码中,我们首先使用OutputStream来创建一个名为"example.bin"的二进制文件,并写入一些数据。然后,我们使用InputStream来读取该文件中的数据,并将其打印到控制台上。注意,我们使用了一个字节数组作为缓冲区,每次读取最多1024个字节,并且在读取完整个文件之后,需要关闭InputStream对象。 当然,这只是一个简单的示例,实际的二进制文件读写可能涉及到更复杂的数据结构和算法,需要根据具体情况进行设计和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值