1.1 知识梳理
1类
把一组对象共有的属性和行为抽象出来就形成了类
如定义小狗类
class Dog {
//使用成员变量保存属性
String color; //保存颜色
String brand; //保存小狗的品种
int age; //保存小狗的年龄
String gender; //性别
String name; //小狗的名称
//使用成员方法描述行为
public void eat(){
System.out.println(“ 小狗喜欢吃肉 “ );
}
public void bark() {
System.out.println( “汪~~~” );
}
//默认的无参构造 , 会给各个成员变量赋值初始化
Dog(){
}
//提供有参构造方法, 构造方法的作用就是在创建对象时,给对象的各个字段赋值
Dog( String color, String gender, String brand, String name, int age){
this. color = color;
this.gender = gender;
this.brand = brand;
this.name = name;
this. age = age;
}
}
2对象
类名 对象名 = new 类名();
类名 对象名 = new 构造方法();
如:
Dog dahuang = new Dog();
new运算符在堆区中创建一个对象, 把这个对象的引用(地址)赋值给dahuang, dahuang是一个对象名, 其实就是一个变量名, 该变量存储的是堆中对象的引用
创建了对象之后 , 系统会给对象的各个字段(成员变量)进行默认的初始化
dahuang.name = “dahuang”;
dahuang.brand = “中华田园犬”;
dahuang.age = 3;
如果想在创建对象的同时就给对象的各个属性(字段,成员变量)进行赋值, 可以定义有参构造方法
Dog wangcai = new Dog( “黑色”, “公” , “阿拉斯加” , “旺财”, 1 );
3 this关键字
当在实例方法中, 实例方法的形参或者局部变量与实例变量出现命名冲突时, 通过this关键字访问对象的实例变量
this(), 在构造方法中,可以通过this()调用其他的构造方法
4 封装
wangcai.age = 5;
wangcai.age = 555555; //没有语法错误, 但是是无效的,
为了防止用户直接给字段赋值,可能会出现一些无效的值, 对字段进行封装
把字段设置为private 私有的, 提供公共的getter/setter方法, 必要时在setter方法中可以对接收的数据进行验证
5继承
class Cat {
String color;
String brand;
String gender;
String name;
int age;
public void eat(){
System.out.println(“传说中的小猫喜欢吃鱼”);
}
public void bark(){
System.out.println( “喵喵~~~” );
}
}
每定义一个小动物, 都需要再重复的写一遍相同的属性与相同的行为
在开发时, 可以把小猫,小狗,小猪,小老鼠等这些小宠物可以进一步抽象, 形成更高(更抽象)的类, Pet宠物类
class Pet{
//所有宠物都有相同的属性
String color;
String brand;
String gender;
String name;
int age;
//所有宠物都有的相同行为
public void eat(){
System.out.println(“宠物都需要吃”);
}
public void bark(){
System.out.println( “宠物都能叫唤” );
}
}
再定义其他宠物类时, 不需要每次定义重复的属性与行为, 可以直接从Pet宠物类中继承, 实现了代码的复用
class Pig extends Pet {
}
Pig类就是子类, Pet类就是父类,
子类继承了父类, 就自动拥有了父类中定义的实例变量与实例方法, 即Pig类从Pet类中继承了 name, gender, brand, color , age 等属性, eat()/ bark() 两个实例方法
1.2 多态
1 什么是多态
相同的语句执行不同的操作
2 多态是什么产生的?
子类继承父类
子类重写父类的方法
父类引用赋值子类对象
通过父类引用调用被重写的方法,实际上执行的是子类对象的方法
3 多态的应用
经常把父类的引用作为方法的形参, 在调用方法时传递各种子类对象, 提高了代码的可扩展性
对象转型
对象向上转型
父类的引用可以赋值子类对象
Animal animal = new Dog();
对象向下转型
把父类的引用强制转型为子类类型
Dog dog = (Dog) animal;
为什么进行对象向上转型?
为了实现多态
一般把父类的引用作为方法的形参,在调用方法时,传递子类对象, 提高代码的可扩展性
为什么对象向下转型 ?
当父类引用指向子类对象时, 如果要访问子类特有的属性与行为, 需要向下转型为子类类型才能访问
在向下转型时,注意,在转型前,通过instanceof运算符判断一下是否能转.
对象向下转型是对象向上转型的逆操作, 向下转型前,父类 的引用需要指向子类对象
总结:
1 掌握多态
2 能够在Eclipse中创建项目, 添加类, 并运行
3 理解包的作用, 掌握如何定义包, 如何使用其他包中的类
4 理解对象的转型
1.6 抽象类
1为什么定义抽象方法?
当类的某个操作不能具体实现时, 这个操作可以定义为抽象方法
如平面图形都可以求面积, 但是不同的子类有不同的实现方式
如所有的动物都可以移动, 不同的种类移动的方式不同
2 如何定义抽象方法?
使用abstract修饰, 只有方法的声明, 没有方法体
如:
public abstract double getArea();
如:
public abstract void move() ;
3 为什么定义抽象类?
含有抽象方法类必须定义为抽象类(语法)
对事物进行更高层级的抽象就可以形成抽象类,如动物类, 交通工具, 食物.
4 如何定义抽象类
使用abstract修饰的类就是抽象类
5 抽象类特点:
- 只要使用abstract修饰的类就是抽象类, 抽象类中不一定 含有抽象方法, 含有抽象方法的类必须定义为抽象类
- 子类继承了抽象类, 需要重写抽象类的抽象方法, 如果子类没有重写抽象方法,子类也需要定义为抽象类
- 抽象类不能实例化对象, 抽象类的引用需要赋值子类对象, 或者赋值匿名内部类对象
- 普通类中含有的实例变量/实例方法/静态变量/静态方法/构造方法等所有成员都可以在抽象类中定义
1.7 访问权限
1 类的访问权限
类的访问权限有两种: 公共类 , 非公共类
公共类就是使用public修饰的类, 公共类名必须与文件名相同
如果这个类想在其他包中使用就定义为公共类, 同样如果该类不想被其他包使用就不使用public修饰
2 类成员的访问权限
访问权限 当前类 当前包 不在当前包的 派生类 其他包
私有的 private 可以 不 不 不
默认的, 没有权限修饰符 可以 可以 不 不
受保护的, protected 可以 可以 可以 不
公共的, public 可以 可以 可以 可以
如果想要在任意位置使用, 就定义为public
如果在当前类和派生类中使用, 定义为protected
如果只想在当前包中使用, 就默认权限
如果只想在当前类中使用, 就private 私有
3方法覆盖(重写)中的权限处理
方法覆盖的规则:
- 方法签名必须相同( 方法签名就是方法名与参数列表)
- 返回值类型可以相同 , 也可以是子类型
- 访问权限可以更大(更宽泛)
- 抛出的异常不能更大
1.8 Object类
Object类是所有类的根父类, Java中的类要么直接继承Object, 要么间接继承Object.
Java中的继承是可传递的
在Object类中定义的方法,所有的类都能继承到
protected Object
clone() 对象克隆. 在堆区中再创建一个完全一样的对象, 该方法一般不用
boolean equals(Object obj) 判断两个对象的内容是否一样, 判断两个对象的字段值是否相同
protected void finalize() 垃圾回收器在回收对象时,会调用对象的finalize()方法. 垃圾回收器在什么时候回收对象不确定,该方法的执行时间不确定, 一般不用.
Class<?>
getClass() 返回对象的运行时类对象, 可以简单的理解为返回对象的类,或者返回对象类的字节码文件
int hashCode() 返回对象的哈希码. 在哈希表中使用, 后面讲HashMap,HashSet时需要用到哈希码. 根据哈希约定,如果两个对象equals相等, 这两个对象的哈希码也应该一样
void notify() 唤醒线程.
void notifyAll().
String
toString() 返回对象对应的字符串, 简单的理解为把 对象转换为字符串.
void wait() 线程等待.
1)toString()
作用:
把对象转换为字符串
应用场景:
当通过System.out.println( obj ) 打印一个对象时, 会调用对象的toString()方法
如何用:
当System.out.println( obj ) 打印一个对象时, 想要显示对象的各个属性(字段值)时, 需要重写toString()方法
2) equals()方法
作用:
比较两个对象的各个字段值是否一样
如何用:
当需要比较某个类的两个对象内容是否一样时, 需要重写equals()方法
1.9 final关键字
final关键字可以修饰类, 修饰字段,修饰方法, 修饰局部变量,修饰方法的形参
- final修饰类, 表示最终类, 不能被继承
- final修饰字段, 必须显示的初始化, 不能再修改
经常final与static同时修改字段,称为final常量 , 一般所有字母都大写 - final修饰方法, 表示方法不能被重写, 注意可以被继承
- final修饰局部变量, 一旦初始化完成, 就不能再修改
注意: final修饰引用类型变量时, 指这个引用不能再指向其他对象, 可以修改它的属性值 - final修饰方法形参, 在方法体中不能修改它的值
final与abstract不能一起使用
总结:
- 理解为什么定义抽象类, 抽象类的特点
- 初步学会方法的是形参是抽象类的引用, 在调用方法时传递子类对象,或者匿名内部类对象
动物会 移动
宠物会卖萌
平面图形求面积/求周长
愤怒的小鸟, 小鸟会飞
交通工具能跑 - 记住类的访问权限, 类成员的访问权限有哪些, 以及访问范围
- 知道Object类中有哪些方法 , 分别的作用;
能够重写toString() / equals() - 记住final关键字的作用
练习1:
定义打印机类, 不同种类打印机的打印方式不同, 激光打印机/ 喷墨打印机/针式打印机都有自己的打印方式
定义人类, 可以使用打印机打印
954

被折叠的 条评论
为什么被折叠?



