天天看点

面向对象进一步内容

1 public 最大的范围

2 protected 把范围限定在一个包内和子类,也就是说别的包的这个类的子类也是可以访问到的,而其它包的其他类是不能的。

3 default 很少使用,很少使用package作为访问控制的边界,这个范围比protected范围再小一个层次,即别的包的子类也是不能访问这个类的

4 private 而这个范围就最小了,只有自己的类中元素能访问

声明属性尽可能私有。这样才能做到尽可能的封装。提供适当的属性访问方法,适当的开放属性的访问。

不建议使用非公有类,就是说所有类都应该是公有的,并且一个源文件一个类。

继承:

1 子类继承父类的属性和方法

2 构造器不能继承!

3 实例化子类,会递归分配所属父类的空间

关于对象的实例化过程:

1 检查类是否加载,如果没有加载就加载这个类

懒惰式加载(按需加载)用加载,不用就不加载:如果每一次用到就加载,而且只加载一次,通过CLASSPATH指定的路径寻找类文件,加载以后是一个对旬,类型是Class。

Student.class - > Class 实例

2 在内存堆 中分配对象空间。递归分配所有父类属性空间。

属性默认自动初始化。自动初始化为“0”值。

3 进行属性的赋值。

4 递归调用父类构造器。(默认调用父类无参数构造器)

5 调用本类构造器。

关于继承中的构造器:

1 子类递归调用父类构造器。

2 默认调用父类无参数构造器。

3 如果父类没有无参数构造器,就必须在子类中明确指定调用父类的有参数构造器!

4 使用super()调用父类构造器,必须写在子类构造器第一行。

5 编程建议:所有的类都提供无参数构造器!减少继承时候的麻烦。

作业:

1 复习全部的课堂代码

2 类:图形

子类:圆继承于图形。矩形也继承于图形。

3 定义一个类:栈,LIFO,last in first out

是一个整数栈:采用固定大小的数组实现存储。

栈的数据是存储在数组中的。

栈里有栈顶游标(就是数组中最后一个元素的index)

class Stack(int size){

int[] data;

int top = 0;

public Stack(int size){

?Create Array data

}

public void push(int d){

//add to the arry,tto

}

public int size(){}

public boolean isFull(){}

}

4 创建一个棋盘类,包含一个数组Chess[16][16]

将棋盘填充

关于JavaBean

1 JavaBean 不是语法规范,是习惯性编程规范,用这个规范写的类使用方便。有时候JavaBean的类也称为:POJO

Plan Old Java Object

2 规范:

a 是一个Java类,具有无参数构造器。

b 有用getXxx() 和 getXxx()声明的Bean属性。

如:getName()和setName(String n)声明的Bean属性为:name,与是否有实例变量name无关。

boolean 类型的get方法可以有两种形式:getMarried() or isMarried();

c 必须实现序列化接口(在学习IO的时候具体学习。)

d JDK提供的类几乎都符合JavaBean规范。

3 JavaBean 最大的好处:“使用方便”

继承中的语法现象:

1 父类型可以引用子类型的实例,父类型的实现是多态的!

2 子类可以覆盖父类的方法,修改父类的行为。

方法覆盖:子类覆盖了父类“相同方法签名”的方法。

方法的覆盖是由方法动态绑定实现的,就是Java虚拟机运行时候确定执行哪个方法,java最终执行子类的方法。

3 属性是静态绑定的,是绑定到类型的。

这个特点是有一定的副作用的,可能造成同一个对象,引用类型不同属性值不一样!

避免方式: 1 尽量减少子类定义父类中同名的属性!

2 一般属性定义为私有,使用getter setter 方法访问。

静态: 是指Javac编译的时候,确定

动态: 是指Java虚拟机运行期间,执行的

引用类型转换

1 向上转型(自动类型转换)

Circle c = new Circle (1,2,3);

Shape s = c;

2 向下转型(强制类型转换),是大类型到小类型。

如:

Shape s = new Circle(1,2,3);

Circle c = (Circle)s;//当s实际引用圆的时候,能够转换成功!

s = new Rectangle(1,1,2,2);

Circle c2 = (Circle) s;//出现类型转换异常,因为s引用的是Rectangle 不是圆实例

3 instanceof 运算符,用来检查引用对象的类型。经常与引用类型强制转换配合,

实现安全的类型转换避免类型转换的异常

static 修饰词(关键字)

1 静态修饰的变量,是属于类级别的变量,是在类的加载期间分配的,所有类和类的实例共享的一个变量

相当于全局变量。一般使用类名访问静态属性:

Koo.x

2 静态方法。是属于类的方法,可以通过类名访问。是全体类的公有的工具方法。静态方法和类的实例无关。

在静态方法中不可以访问"this",静态方法只能访问静态成员;

3 静态代码块,是在类加载期间运行的代码块,由于类只加载一次,所以静态代码块只执行一次!

用途不是很常见,一般用来在类加载以后初始化一些静态资源时候使用,如:加载配置文件。

4 静态内部类(在内部类专题讲解)

final

1 final 修饰的类,不能再被 继承。

Java的String就是final类,不能被继承!

Math 也是final

在实际项目开发中,原则上不允许使用final类

Spring,Hibernate,Struts 2 这些框架经常动态继承代理我们的类。

使用finally类可能造成这些框架的工作问题

2 final 修饰的方法 ,不能再被覆盖。

3 final 修饰的变量,初始化以后不允许再修改了。

a final的临时变量

b final的方法参数

c final的成员变量

d final static --Java中没有绝对意义上的常量,

使用final static 修饰的变量作为常量。一般直接称为:常量。

一般要求常量名都用大写字母。

Object 类

1 Object类是Java默认的继承根。如果声明一个类,没有指定父类,那么这个类默认继承与object。

2 所以类都继承了Object的方法 。这些方法是java系统的核心重要方法,需要“如数家珍”。

3 toString() 方法,很多输出操作时候,默认调用对象的toString() 方法。转换对象为字符串形式。

默认输出:全限定名@hashcode,其中hashcode是与对象内存地址对应的一个整数

4 *推荐覆盖toString()输出符合业务逻辑的文本结果

作业:

1 实现课堂代码

2 考虑:一个类:Card 扑克牌,参考Chess

实例变量:花色,点数

常量:2,3,4,5,6,7,8,9,10,JQKA

常量:梅花,方块,红桃,黑桃

方法:toString();