黑马程序员笔记——Java面向对象之多态

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

多态

什么是多态

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

多态的体现

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

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

多态的前提

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

多态的好处

多态的出现大大的提高程序的扩展性

多态的弊端

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

多态的应用

*/

/*
动物,
猫,狗。
*/

abstract class Animal
{
	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("拱地");
	}
}

//-----------------------------------------


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

		//Dog d = new Dog();
		//d.eat();
		//Cat c = new Cat();
		/*
		Cat c1 = new Cat();
		function(c1);

		function(new Dog());
		function(new Pig());
		*/

		//Animal c = new Cat();
		//c.eat();

		
		function(new Cat());
		function(new Dog());
		function(new Pig());
		

		
	}
	public static void function(Animal a)//Animal a = new Cat();
	{
		a.eat();
		//a.catchMouse();
	}
	/*
	public static void function(Cat c)//
	{
		c.eat();
	}
	public static void function(Dog d)
	{
		d.eat();
	}

	public static void function(Pig p)
	{
		p.eat();
	}
	*/

}

多态中的类型转换

instanceof : 用于判断对象的类型。 用法:对象 intanceof 类型(类类型 接口类型) a instanceof Animal
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("拱地");
	}
}

//-----------------------------------------


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;
		

		/*
		毕姥爷 x = new 毕老师();

		x.讲课();

		毕老师 y = (毕老师)x;


		y.看电影();
		*/
		function(new Dog());
		function(new Cat());


	}
	public static void function(Animal a)//Animal a = new Cat();
	{
		a.eat();
		/*
		if(a instanceof Animal)
		{
			System.out.println("haha");
		}
		else 
		*/
		if(a instanceof Cat)
		{
			Cat c = (Cat)a;
			c.catchMouse();
		}
		else if(a instanceof Dog)
		{
			Dog c = (Dog)a;
			c.kanJia();
		}


		/*
		instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)  
		*/
	
	}
	


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

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

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

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

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

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

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

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

Object

Object :它是所有类的父类。

boolean equals(Object obj):比较两个对象是否相同,比较的是内存地址值。

String toString():将对象变成字符串。默认的是形式:类名@对象哈希值

Class getClass():返回该对象所属的类文件对象。Class类,可以通过类中的方法,获取类中定义的成员,如方法,变、量等。

int hashCode():返回对象的哈希值,哈希值就是对象在内存中存放位置。

void finalize():垃圾回收方法。可以通过System.gc()来运行垃圾回收器。

每一对象都有可能因为自身的特点而覆盖equals,或者toString等其他方法。

因为每一个都有这个功能,但是功能的体现内容是不同的。

内部类

内部类的访问规则:

1、内部类可以直接访问外部类的成员包括私有。

      子所以可以直接访问外部类中的成员,是因为内部类中持有了一个

      尾部类的引用,格式:类名.this

2、外部类访问内部类必须建立内部类对象格式: 

      外部类名.内部类名.变量名称=new外部类().内部类() 例Outer.Inner in = new Outer().new Inner()

3、因为内部类处在外部类的成员位置上,可以被private修饰,是Java中唯一可以被private修饰的类。

4、当内部类定义在外部类的成员位置上,而且非私有可以在外部其他类中直接建立内部类对象。

      格式:外部类名.内部类名.变量名称=new外部类().内部类()Outer.Inner in = new Outer().new Inner()

5、当内部类在成员位置上,就可以被成员修饰符所修饰。比如:private:将内部类在外部类中进行封装

       static:内部类就具备static的特性,当内部类被static修饰后,只能直接访问外部类的静态成员,出现了访问局限

      在外部其他类中,如何直接访问静态内部类的非静态成员:new  Outer.Inner().functaion()

      如何直接访问静态内部类的静态成员:Outer.Inner.functaion()

      注意:当内部类中定义了静态成员,该内部类必须是静态的。

      当外部类的静态方法访问内部类时,内部类也必须是静态的。

内部类的应用

当描述事物时,事物的内部还有事物,该事物用内部类来描述。因为内部事务在使用外部事物的内容

内部类定义在函数的局部成员位置上时,内部类和内部函数不能被成员修饰符private、static等修饰

内部类定义在局部时不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量

匿名内部类

1、匿名内部类就是内部类的简写格式 

2定义匿名内部类的前提:内部类必须是继承一个类或者实现接口

3、匿名内部类的格式:  new 父类或者接口(){定义子类的内容}

4其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。

5、匿名内部类中定义的方法最好不要超过3个。

interface Inter
{
	void method();
}

class Test 
{
	//补足代码。通过匿名内部类。
	/*
	static class Inner implements Inter
	{
		public void method()
		{
			System.out.println("method run");
		}
	}
	*/

	static Inter function()
	{
		return new Inter()
		{
			public void method()
			{
				System.out.println("method run");
			}
		};
	}

}



class InnerClassTest 
{
	public static void main(String[] args) 
	{

		//Test.function():Test类中有一个静态的方法function。
		//.method():function这个方法运算后的结果是一个对象。而且是一个Inter类型的对象。
		//因为只有是Inter类型的对象,才可以调用method方法。


		Test.function().method();
		

//		Inter in = Test.function();
//		in.method();


		show(new Inter()
		{
			public void method()
			{
				System.out.println("method show run");
			}
		});

	}

	public static void show(Inter in)
	{
		in.method();
	}
}

class InnerTest
{

	public static void main(String[] args)
	{
		new Object()
		{
			public void function()
			{
				
			}
			
		}.function();


	}
}


----------- android培训java培训、java学习型技术博客、期待与您交流! ------------



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值