javaSE面向对象

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 抽象类特点:

  1. 只要使用abstract修饰的类就是抽象类, 抽象类中不一定 含有抽象方法, 含有抽象方法的类必须定义为抽象类
  2. 子类继承了抽象类, 需要重写抽象类的抽象方法, 如果子类没有重写抽象方法,子类也需要定义为抽象类
  3. 抽象类不能实例化对象, 抽象类的引用需要赋值子类对象, 或者赋值匿名内部类对象
  4. 普通类中含有的实例变量/实例方法/静态变量/静态方法/构造方法等所有成员都可以在抽象类中定义

1.7 访问权限
1 类的访问权限
类的访问权限有两种: 公共类 , 非公共类
公共类就是使用public修饰的类, 公共类名必须与文件名相同
如果这个类想在其他包中使用就定义为公共类, 同样如果该类不想被其他包使用就不使用public修饰

2 类成员的访问权限

访问权限 当前类 当前包 不在当前包的 派生类 其他包
私有的 private 可以 不 不 不
默认的, 没有权限修饰符 可以 可以 不 不
受保护的, protected 可以 可以 可以 不
公共的, public 可以 可以 可以 可以

如果想要在任意位置使用, 就定义为public
如果在当前类和派生类中使用, 定义为protected
如果只想在当前包中使用, 就默认权限
如果只想在当前类中使用, 就private 私有

3方法覆盖(重写)中的权限处理
	方法覆盖的规则:
  1. 方法签名必须相同( 方法签名就是方法名与参数列表)
  2. 返回值类型可以相同 , 也可以是子类型
  3. 访问权限可以更大(更宽泛)
  4. 抛出的异常不能更大

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关键字可以修饰类, 修饰字段,修饰方法, 修饰局部变量,修饰方法的形参

  1. final修饰类, 表示最终类, 不能被继承
  2. final修饰字段, 必须显示的初始化, 不能再修改
    经常final与static同时修改字段,称为final常量 , 一般所有字母都大写
  3. final修饰方法, 表示方法不能被重写, 注意可以被继承
  4. final修饰局部变量, 一旦初始化完成, 就不能再修改
    注意: final修饰引用类型变量时, 指这个引用不能再指向其他对象, 可以修改它的属性值
  5. final修饰方法形参, 在方法体中不能修改它的值

final与abstract不能一起使用

总结:

  1. 理解为什么定义抽象类, 抽象类的特点
  2. 初步学会方法的是形参是抽象类的引用, 在调用方法时传递子类对象,或者匿名内部类对象
    动物会 移动
    宠物会卖萌
    平面图形求面积/求周长
    愤怒的小鸟, 小鸟会飞
    交通工具能跑
  3. 记住类的访问权限, 类成员的访问权限有哪些, 以及访问范围
  4. 知道Object类中有哪些方法 , 分别的作用;
    能够重写toString() / equals()
  5. 记住final关键字的作用

练习1:
定义打印机类, 不同种类打印机的打印方式不同, 激光打印机/ 喷墨打印机/针式打印机都有自己的打印方式
定义人类, 可以使用打印机打印

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值