欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

黑马程序员_毕向东_Java基础****学习笔记(二十一)

程序员文章站 2022-03-05 12:05:05
...

----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流!----------------------

package day06;

/*
 * 多态:可以理解为事物存在的多种体现形态
 * 
 * 人:男人、女人
 * 动物:猫、狗
 * 猫 x=new 猫();
 * 动物 x=new 猫();
 * 
 * 
 * 1、多态的体现:
 * 		父类的引用指向了自己的子类对象
 * 		父类的引用页可以接收自己的子类对象
 * 2、多态的前提:
 * 		必须是类于类之间有关系,要么继承,要么实现。
 * 		通常还有一个前提:存在覆盖。
 * 3、多态的好处:
 * 		多态的出现大大的提高了程序的扩展性。
 * 4、多态的弊端:
 * 		提高了扩展性,但是只能引用父类的引用访问父类中的成员。
 * 
 * 5、多态的应用:
 * 
 * 6、多态的出现代码中的特点:(多态使用的注意事项)
 * 
 */

/*
 * 需求:动物
 * 猫、狗
 */
abstract class Animal {
	public abstract void eat();
}

class Cat extends Animal {
	public void eat() {
		System.out.println("吃鱼");
	}

	public void catchMouse() {
		System.out.println("抓老鼠");
	}
}

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

	public void kanJia() {
		System.out.println("看家");
	}
}
class Pig extends Animal {
	public void eat() {
		System.out.println("饲料");
	}

	public void gongDi() {
		System.out.println("拱地");
	}
}

// --------------------------------------------
public class DuoTaiDemo {
	public static void main(String[] args) {
		// Cat c=new Cat();
		// c.eat();

		// Dog d=new Dog();
		// d.eat();
		//Cat c = new Cat();
		//c.eat();
//		Cat c1 = new Cat();
//		function(c1);
//		function(new Dog());
//		function(new Pig());
		function(new Cat());
		function(new Dog());
		function(new Pig());
	}
	public static void function(Animal animal){
		animal.eat();
	}
/*
	public static void function(Cat c) {
		c.eat();
	}
	public static void function(Dog d) {
		d.eat();
	}
	public static void function(Pig p) {
		p.eat();
	}
*/
}


package day06;

abstract class Animal1 {
	public abstract void eat();
}

class Cat1 extends Animal1 {
	public void eat() {
		System.out.println("吃鱼");
	}

	public void catchMouse() {
		System.out.println("抓老鼠");
	}
}

class Dog1 extends Animal1 {
	public void eat() {
		System.out.println("吃骨头");
	}

	public void kanJia() {
		System.out.println("看家");
	}
}
class Pig1 extends Animal1 {
	public void eat() {
		System.out.println("饲料");
	}

	public void gongDi() {
		System.out.println("拱地");
	}
}

// --------------------------------------------
public class DuoTaiDemo2{
	public static void main(String[] args) {
		//Animal a=new Cat();//类型提升,向上转型
		//a.eat();
		//如果想要调用猫的特有方法时,如何操作?
		//强制父类的引用转成子类类型.向下转型
		//Cat c=(Cat)a;
		//c.catchMouse();
		//千万不要出现这样的操作,就是将父类对象转换成子类对象
		//我们能转换的事父类引用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换
		//多态自始至终都是子类对象在做着变化
//		Animal a=new Animal();
//		Cat c=(Cat)a;
		//function(new Cat());
		function(new Cat1());
		function(new Dog1());
	}
	
	
	public static void function(Animal1 animal){
		animal.eat();
		/*
		 * if (animal instanceof Animal1){
		 * 		System.out.println("不能这么做");
		 * }
		 * 原因:因为你无论传什么,只要能接收进来,它全是动物类型,父类型全满足,下面的语句不执行了
		 * 
		 * instanceof关键字的使用情况:1、子类对象有限,例如:男人,女人。
		 * 							  2、当传的类型需要其他操作时,比如比较
		 */
		if(animal instanceof Cat1){
			Cat1 c=(Cat1)animal;
			c.catchMouse();
		}
		else if(animal instanceof Dog1){
			Dog1 d=(Dog1)animal;
			d.kanJia();
		}
		
	}

}


package day06;
/*
 * 基础班的学生:
 * 				学习、睡觉
 * 高级班的学生:
 * 				学习、睡觉
 * 
 * 可将这两类事物进行抽取
 */
abstract class Student{
	public abstract void study();
	public void sleep(){
		System.out.println("躺着睡觉");
	}
}
//单独定义一个类,用来操作调用学生的对象,相当于一个工具类
class DoStudent{
	public void doSome(Student stu){
		stu.study();
		stu.sleep();
	}
}
class BaseStudent extends Student{
	public void study(){
		System.out.println("base study......");
	}
	public void sleep(){
		System.out.println("趴着睡");
	}
}
class AdvStudent extends Student{
	public void study(){
		System.out.println("Adv study......");
	}
}

public class DuoTaiDemo3 {
	public static void main(String [] args){
//		BaseStudent bs=new BaseStudent();
//		bs.study();
//		bs.sleep();
//		AdvStudent as=new AdvStudent();
//		as.study();
//		as.sleep();
		DoStudent ds=new DoStudent();
		ds.doSome(new BaseStudent());
		ds.doSome(new AdvStudent());
	}
	
}


package day06;

class Fu {
	int num = 5;

	void method1() {
		System.out.println("fu method1().......");
	}

	void method2() {
		System.out.println("fu method2().......");
	}

	static void method4() {
		System.out.println("fu method4().......");
	}
}

class Zi extends Fu {
	int num = 8;

	void method1() {
		System.out.println("zi method1()......");
	}

	void method3() {
		System.out.println("zi method3().......");
	}

	static void method4() {
		System.out.println("zi method4().......");
	}
}

public class DuoTaiDemo4 {
	public static void main(String[] args) {
		/*
		 * 在多态(父类的引用指向子类的对象)中成员函数的特点:
		 * 在编译期,参与引用型变量所属的类中是否有调用方法,如果有,编译通过,如果没有编译失败。 在运行期,参阅所属的类中是否有调用的方法。
		 * 
		 * 简单总结:成员函数在多态调用时,编译看左边,运行看右边
		 * 
		 * 面试中出现: 在多态中成员变量的特点: 无论编译和运行,都参考左边。(引用型变量所属的类)
		 * 
		 * 在多态中,静态成员函数的特点: 无论编译和运行,都参考左边。(引用型变量所属的类)
		 */
		// Zi z=new Zi();
		// z.method4();
		Zi.method4();// 静态方法直接用类名调用就行了,静态方法不需要对象

		// System.out.println(z.num);
		// z.method1();
		// z.method3();
		// z.method2();
		// Fu f=new Zi();//静态方法直接用类名调用就行了,静态方法不需要对象
		// f.method4();

		Fu.method4();
		// System.out.println(f.num);
		// f.method1();
		// f.method2();
		// f.method3();
	}
}

----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流!----------------------