`
bruthe
  • 浏览: 1507 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_java面向对象(二)

 
阅读更多

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

一:多态

      ①多态的体现
         父类的引用指向了自己的子类对象
         父类的引用也可以接受自己的子类对象
      ②多态的前提
         必须是类与类之间有关系,要么继承、要么实现
         通常还有一个前提:存在覆盖
      ③多态的好处
         多态的出现打打的提高了程序的扩展性
      ④多态的弊端
         虽然提高了扩展性,但是只能使用父类的引用去访问父类中的成员

abstract class Student
{
	abstract public void show();
	public void sleep()
	{}
}

class BaseStudent extends Student
{
	public  void show()
	{
		System.out.println("base student");
	}
	public void sleep()
	{
		System.out.println("躺着睡。。");
	}
}

class AdvStudent extends Student
{
	public  void show()
	{
		System.out.println("advanced student");
	}
	public void sleep()
	{
		System.out.println("座着睡。。");
	}
}

class DuotaiDemo1
{
	public static void main(String[] args)
	{
		//BaseStudent bs=new BaseStudent();
		//bs.show();
		//bs.sleep();

		//StudentDo(new BaseStudent());
		//StudentDo(new AdvStudent());

		DoStudent ds=new DoStudent();
		ds.studentDo(new BaseStudent());
		ds.studentDo(new AdvStudent());
	} 

    /*  //将此方法做成一个工具类
		public static void StudentDo(Student s)
		{
			s.show();
			s.sleep();
		}	
	*/	
}

class DoStudent
{
	public static void studentDo(Student s)
	{
		s.show();
		s.sleep();
	}	
}

 

二:多态的应用及注意事项

      ①在多态中 成员函数 的特点
         在编译时期:参阅引用型变量所属的类中是否有调用方法.如果有,则编译通过,没有则编译失败
         在运行时期:参阅对象所属的类中是否有调用的方法
         简单总结:成员函数在多态调用时,编译看左边,运行看右边

      ②在多态中 成员变量 的特点
          无论编译和运行,都参考左边(引用型变量所属的类)

      ③在多态中 静态成员函数 的特点
          无论编译和运行,都参考左边

class Fu
{
	static int num_1=5;
	int num_2=30;
	public void method1()
	{
		System.out.println("fu_method_1");
	}

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

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

}

class Zi extends Fu
{
	static int num_1=8;
	int num_2=20;
	public void method1()
	{
		System.out.println("zi_method_1");
	}

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

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

class DuotaiDemo2
{
	public static void main(String[] args)
	{
		//多态情况
		Fu f=new Zi();
		f.method1();    //zi_method_1
		f.method2();    //fu_method_2  子类没有那就继承父类
		//f.method3();   成员函数在多态调用时,编译看左边(父类没有method3()方法,所以编译失败),运行看右边
		f.method4();    //fu_method_4  在多态中静态成员函数的特点:无论编译和运行,都参考左边(父类)   
		
		//在多态中成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类)
		System.out.println(f.num_1);  //5
		System.out.println(f.num_2);  //30 

		System.out.println("----------------");

		//非多态情况
		Zi z=new Zi();
		z.method1();    //zi_method_1
		z.method2();    //fu_method_2
		z.method3();    //zi_method_3
		z.method4();    //zi_method_4
		System.out.println(z.num_1);  //8
		System.out.println(z.num_2);  //20
	}
}   

 

abstract class Animal
{
	abstract void eat();
}

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

	public void catchMouch()
	{
		System.out.println("catch mouch");
	}
}

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

	public void lookHome()
	{
		System.out.println("look home");
	}
}

class Pig extends Animal
{
	public void eat()
	{
		System.out.println("eat  siliao");
	}

	public void gongDi()
	{
		System.out.println("gogn di");
	}
}

class  DuotaiDemo
{
	public static void main(String[] args) 
	{
		function( new Cat() );
	    // Animal a=new Cat(); 类型提升,向上转型
		//  Cat c=(Cat)a; (强制将父类的引用转成子类类型,向下转型)

		/*
			千万不要出现如下操作,即将父类对象转成子类类型
			Animal a=new Animal();
			Cat c=(Cat)a;  这是错误的

			多态至始至终都是子类对象在做着变化
			我们能转换的是父类引用指向了自己子类的对象时,该引用可以被提升,也可以被强制转型
		*/
	}

	public static void function(Animal a)
	{
		a.eat();
	    //当想调用子类的方法时,可以这样处理
		if(a instanceof Cat)  //a==Cat,错误的处理方式, a为对象,此时可以使用instanceof 来处理
		{
			Cat c=(Cat)a;
			c.catchMouch();

			//等价于  Animal a=new Cat();
			//		  Cat c=(Cat)a
			//		  c.catchMouch();
		}
		else if(a instanceof Dog)
		{
			Dog d=(Dog)a;
			d.lookHome();
		}
		else if(a instanceof Pig)
		{
			Pig p=(Pig)a;
			p.gongDi();
		}
	}
}

 

三:内部类及匿名内部类

       内部类的访问规则:
          ①内部类可以直接访问外部类中的成员,包括私有成员
             之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部类名.this
          ②外部类要访问内部类,必须建立内部类对象

          ③在外部的其它类中如何访问内部类,访问格式:
              外部类名.内部类名 变量名= 外部类对象 . 内部类对象,eg:
             Outer.Inner in=new Outer().new Inner();
          ④当内部类在成员位置上,就可以被成员修饰符所修饰,如
              private 将内部类在外部类中进行封装
              static 内部类就具备static的特性(此时静态内部类就只能访问外部类的静态成员了)


             a:在外部其它类中,如何直接访问static内部类的非静态成员?
                   new  Outer.Inner().function();
             b:在外部其它类中,如何直接访问static内部类的静态成员?
                   Outer.Inner.function();


             注意:当内部类中定义了静态成员,该内部类必须是static的
                       当外部类中的静态成员访问内部类时,内部类必须是静态的

class Outer
{
	private  int x=3;

	class Inner
	{
		int x=4;
		public void function()
		{
			int x=5;
			//内部类可以直接访问外部类中的成员,包括私有成员
			System.out.println("innner_1="+x);  //输出:5

			System.out.println("innner_1="+this.x);  //输出:4

			System.out.println("innner_1="+Outer.this.x);  //输出:3
		}
	}

	void method()
	{
		//外部类要访问内部类,必须建立内部类对象
		Inner in=new Inner();
		in.function();
	}
}

class InnerClassDemo
{
	public static void main(String[] args)
	{
		//直接访问内部类中的成员
		Outer.Inner in=new Outer().new Inner();
		in.function(); //程序输出  inner=3
	}
}

 

     内部类定义在局部时
          ①不可以被成员修饰符修饰
          ②可以直接访问外部类中的成员,因为还持有外部类中的引用
             但是不可以访问它所在局部中的变量,只能访问被final修饰的局部变量

 

     匿名内部类:
          ①匿名内部类其实就是内部类的简写格式
          ②定义内部类的前提:
                内部类必须是继承一个类或者实现接口
          ③匿名内部类的格式:
              new 父类或接口()
              {
                   定义子类的内容;
              }
           ④其实匿名内部类就是一个匿名子类对象,而且这个对象有些胖,可以理解为带内容的对象
           ⑤匿名内部类中定义的方法最好不要超过3个

abstract class AbsInner
{
	abstract void show();
}
class Outer
{
	private int x=3;
	/*
		class Inner extends AbsInner
		{
			void show()
			{
				System.out.println("x=="+x);
			}
		}	
	*/
	public void function()
	{
		//new Inner().show();      方法①

		//AbsInner ai=new Inner(); 方法②
		//ai.show();

		AbsInner ai=new AbsInner()  //注意不要少打了 " () "
		{
			void show()
			{
				System.out.println("x=="+x);
			}
			void show1()
			{
				System.out.println("hello");
			}
		};   //这一步等价于方法②
		ai.show();
		//ai.show1();  

		/*
			虽然子类对象有show1()方法,但是由于是多态,父类引用,
			而父类AbsInner没有show1()方法 所以编译不通过
		*/		
	}
}

class InnerClassDemo3
{
	public static void main(String[] args)
	{
		Outer out=new Outer();
		out.function();
	}
}

 

 

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

分享到:
评论

相关推荐

    黑马程序员_Java基础辅导班教程课件[第01期]第15天

    总结来说,《黑马程序员_Java基础辅导班教程课件[第01期]第15天》的内容可能涉及了Java语言的核心概念,包括面向对象编程、控制结构、异常处理、文件I/O、集合框架以及内存管理等。通过深入学习和实践这些知识点,...

    黑马程序员_Java基础辅导班教程课件[第01期]第13天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第13天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java开发的基本技能。第13天的课程通常会涵盖上一天(第12天)所学...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day02

    本文将深入探讨2016年黑马程序员发布的Hibernate框架开发课程的第二天内容。Hibernate,一个强大的Java持久化框架,简化了数据库操作,为开发者提供了对象关系映射(ORM)解决方案。在Day02的学习中,我们将重点关注...

    黑马程序员_毕向东_Java基础视频教程第05天-01-面向对象(概述).avi

    黑马程序员_毕向东_Java基础视频教程第05天-01-面向对象(概述).avi

    黑马程序员_Java基础辅导班教程课件[第01期]第14天

    接下来,学员将深入学习类与对象的概念,这是Java面向对象编程的核心。类是对象的模板,定义了对象的属性和行为;对象则是类的实例,可以进行具体的交互和操作。在Java中,通过关键字`class`来定义类,通过`new`...

    01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip

    【标题】"01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip" 提供的是一门由黑马程序员机构推出的Java基础强化课程,由讲师张孝祥主讲,旨在深入讲解Java编程的基础知识并进行能力提升。 【描述】中提到...

    黑马程序员_毕向东_Java基础源码.rar

    二、面向对象编程 Java的核心在于面向对象编程(OOP)。毕向东的源码将展示类的定义、对象的创建、封装、继承和多态等概念。类是对象的蓝图,而对象则是程序的基本运行单元。理解如何通过类来组织代码,并利用继承...

    黑马程序员_Java基础辅导班教程课件[第01期]第11天

    "黑马程序员_Java基础辅导班教程课件[第01期]第11天"是一个专门为初学者设计的培训课程,旨在帮助学员深入理解和掌握Java的核心概念。这个课程可能是通过视频形式进行的,结合了理论讲解和实际操作,以便让学习者能...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4

    《Hibernate框架深度解析——基于黑马程序员2016版教学资料》 Hibernate,作为一个强大的对象关系映射(ORM)框架,极大地简化了Java开发者在数据库操作中的工作。它通过提供数据持久化的对象模型,使得开发者可以...

    黑马程序员_Java基础辅导班教程课件[第01期]第5天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第5天"中,我们主要聚焦于Java编程语言的基础知识。这是一份专为初学者设计的教学资源,旨在帮助学员扎实地掌握Java编程的基本概念和技能。第5天的课程可能涵盖了变量...

    黑马程序员_Java基础辅导班教程课件[第01期]第8天

    1. **面向对象编程(OOP)**:Java是一门面向对象的语言,第8天的课程可能会重点讲解OOP的四大特性——封装、继承、多态和抽象。封装是隐藏对象的属性和实现细节,仅对外提供公共访问方式;继承允许一个类(子类)...

    黑马程序员_(适合初学者入门的Java基础视频)

    3. **面向对象编程**:深入讲解Java的核心特性——面向对象编程,包括类的定义、对象的创建与使用、封装、继承和多态等概念。 4. **数组和集合框架**:介绍数组的使用,以及ArrayList、LinkedList、HashSet、...

    黑马程序员_Java基础辅导班教程课件[第01期]第10天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第10天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java的核心概念。通过这个阶段的学习,学员将能够理解并运用Java的...

    黑马程序员_Java基础辅导班教程课件[第01期]第4天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第4天"中,我们可以推测这是针对初学者的Java编程课程,旨在帮助学员掌握Java的基础知识。 在课程的第4天,可能讲解了以下核心概念: 1. **类(Class)**:`Demo.class...

    黑马程序员_Java基础辅导班教程课件[第01期]第6天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第6天"中,我们主要聚焦于Java编程语言的基础知识,这通常包括了变量、数据类型、运算符、流程控制语句等核心概念。此课程面向初学者,旨在为学员构建坚实的Java编程...

    黑马程序员_Java基础辅导班教程课件[第01期]第12天

    黑马程序员提供的"Java基础辅导班教程课件[第01期]第12天"旨在帮助学员深入理解Java语言的核心概念,进一步提升编程技能。在这个阶段的学习中,学员将接触到Java的高级特性以及实际应用。 首先,"day12"这个目录很...

    黑马程序员_Java基础辅导班教程课件[第01期]第7天

    1. **类与对象**:Java是一种面向对象的语言,因此理解类和对象的概念至关重要。类是对象的蓝图,定义了对象的属性(字段)和行为(方法)。而对象则是类的实例,具备类定义的所有特征和功能。 2. **封装**:封装是...

    黑马程序员_从零开始征服Android之旅(第二季)源码和笔记(上)

    学习Java的面向对象编程概念,如类、对象、继承、多态等,以及异常处理和集合框架,是Android开发的前提。另外,Kotlin作为现代的Android开发语言,也被越来越多的开发者采用,其简洁的语法和安全特性使得编写代码...

    黑马程序员入学Java精华总结

    ### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...

    传智播客.黑马程序员《Java 基础入门》课后习题答案

    1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...

Global site tag (gtag.js) - Google Analytics