黑马程序员——第八天(Java面向对象-多态)

---------------------- android培训java培训、期待与您交流! ----------------------

一.面向对象(多态-概念)

多态:可以理解为事物存在的多种体现形态

人:男人、女人

动物:猫、狗

猫 x = new 猫();
动物 x = new 猫();


函数:(多态性)

重载 覆盖 


二.面向对象(多态-扩展性)

1.多态的基本体现

父类的引用指向了自己的子类对象

父类的引用也可以接收自己的子类对象 

2.多态的前提

必须是类与类之间有关系,要么继承,要么实现

通常还有一个前提,存在覆盖

前期预先调用功能,后期定义子类去实现功能并把子类作为属性传进来

3.多态的好处
多态的出现打打的提高了程序的扩展性

4.多态的彼弊端

提高了扩展性,但是只能使用父类的引用访问父类的成员

5.多态的应用

6.多态的出现 代码中的特点(多态使用的注意事项)

 
/*
	动物
	猫狗

*/
abstract class Animal{
	public abstract void eat();
}
class Cat extends Animal{
	@Override
	public void eat(){
		System.out.println("吃鱼");
	}
	public void carchMouse(){
		System.out.println("抓老鼠");
	}
}

class Dog extends Animal{
	@Override
	public void eat() {
		System.out.println("吃骨头");
	}
	public void KanJia(){
		System.out.println("看家");
	}
}

class Pig extends Animal{
	@Override
	public void eat() {
		System.out.println("饲料");
	}
	public void gong(){
		System.out.println("拱地");
	} 
}
public class DuoTaiDemo {
	public static void main(String[] args) {
		function(new Cat());
		function(new Dog());
		function(new Pig());
	}
	public static void function(Animal animal){//Animal animal = new Cat();/Dog()/Pig()
		animal.eat();
	}
}

三.面向对象(多态-转型)

		Animal animal = new Cat();//类型提升,向上转型
		animal.eat();
		//如果想要调用猫的特有方法,如何操作?
		//强制将父类的引用,转成子类类型,向下转型
		Cat cat = (Cat) animal;
		cat.carchMouse();
		//千万不要出现这样的操作,就是将父类对象转成子类类型
		//我们能转换的是父类引用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换
		//多态至始至终都是子类对象在做着变化

判断某一类型引用指向的对象 到底符合什么类型的时候 用instanceof

instanceof什么时候可以用呢?
用来判断所属类型 判断以后 就可以用这个所属类型的方法

1.子类是有限的(比如说人  ,  要么男人  要么女人)

2.当传的类型 需要进行其它操作


四.面向对象(多态-示例)


五.面向对象(多态中成员的特点)

在多态中(父类引用指向子类对象),成员函数的特点:(非静态的方法)

在编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译失败

在运行时期,参阅对象所属的类中是否有调用的方法。

简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。 


在多态中,成员变量的特点:

无论编译和运行,都参考左边(引用型变量所属的类)


在多态中,静态成员函数的特点:

无论编译和运行,都参考左边


静态   静态绑定

非静态 动态绑定


六.面向对象(多态的主板示例)

interface PCI{
	public void open();
	public void close();
}
class NetCard implements PCI{
	@Override
	public void open() {
		System.out.println("netcard open");
	}
	@Override
	public void close() {
		System.out.println("netcard close");
	}
	
}
class SoundCard implements PCI{
	@Override
	public void open() {
		System.out.println("SoundCard open");
	}
	@Override
	public void close() {
		System.out.println("SoundCard close");
	}
	
}
class MainBoard{
	public void run(){
		System.out.println("MainBoard run");
	}
	public void usePCI(PCI p){//PCI p = new NetCard(); 接口型引用指向自己的子类对象 (多态)
		if(p!=null){
			p.open();
			p.close();
		}
	}
}
class DuoTaiDemo5{
	public static void main(String[] args) {
		MainBoard mainBoard = new MainBoard();
		mainBoard.run();
		mainBoard.usePCI(null);
		mainBoard.usePCI(new NetCard());
		mainBoard.usePCI(new SoundCard());
	}
}
//接口的出现 增加了功能扩展   同时多态的应用提高了程序的扩展性
//Debug卡 02显卡   03内存  04网卡   08芯片坏了
//接口降低了耦合性  提高了可扩展性   提供了规则

七.面向对象(多态的扩展示例)

/*
	需求:数据库的操作
数据是:用户信息
1.连接数据库	JDBC Hibernate(框架)
2.操作数据库.
	C	create
	R	read
	U	update
	D	delete
3.关机数据库连接

DAO	数据访问对象
D	data
A	access
O	object

*/
class User{
	
}
interface UserInfoDAO{
	public void add(User user);
	public void delete(User user);
}
class UserInfoByJDBC implements UserInfoDAO{
	public void add(User user){
//		1.JDBC连接数据库
//		2.使用sql添加语句 添加数据
//		3.关闭链接
	}
	public void delete(User user){
//		1.JDBC连接数据库
//		2.使用sql删除语句 删除数据
//		3.关闭链接
	}
}
class UserInfoByHibernate implements UserInfoDAO{
	public void add(User user){
//		1.Hibernate连接数据库
//		2.使用sql添加语句 添加数据
//		3.关闭链接
	}
	public void delete(User user){
//		1.Hibernate连接数据库
//		2.使用sql删除语句 删除数据
//		3.关闭链接
	}
}



public class DBOperate {
	public static void main(String[] args) {
//		UserInfoByJDBC ui = new UserInfoByJDBC();
		UserInfoDAO ui = new UserInfoByHibernate();
		User user = new User();
		ui.add(user);
		ui.add(user);
	}
}

八.面向对象(Object类-equals())

/*	
	构造函数的第一行  都是隐式的  super()语句
	都会去访问父类	extends Object  
	是类层次结构的根类 (上帝)每个类都使用Object作为超类
	该类中定义的肯定是所有对象都具备的功能   不断的抽取成 
	
	Java认为所有的对象 都具备比较性  比较两个对象是否相同 equals
	Object 类中已经提供了对象是否相同的比较方法
	如果自定义类中 也有比较相同的功能  没有必要重新定义
	只要沿袭父类中的功能,建立自己特有的比较内容即可,这就是覆盖
*/
class Demo1{// extends Object 
	/*public Demo1() {
		super();
	}*/
	private int num ;
	Demo1(int num){
		this.num = num;
	}
	public boolean compare(Demo1 d){
		return this.num == d.num;
	}
	public boolean equals(Object obj){
		if(!(obj instanceof Demo1))
			return false;
//			throw new RuntimeException("不是Demo1类型的变量");
		return this.num == ((Demo1)obj).num;
	}
} 
class Person{
}
public class ObjectDemo {
	public static void main(String[] args) {
		Demo1 d1 = new Demo1(4);
		Demo1 d2 = new Demo1(5);
		Person p = new Person();
		
//		System.out.println(d1.compare(d2));
		System.out.println(d1.equals(p));
	}
}

九.面向对象(Object类-toString())

所有对象都应该能够变成字符串 并打印

toString()源码

getClass().getName() + '@' + Integer.toHexString(hashCode())

---------------------- android培训java培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值