黑马程序员——面向对象 (2)

                                                            ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

     多态:一类事物具有的多种表现形式。函数的重载也是算多态的一种。多态的体现:父类的引用指向自己的子类对象;父类的引用也可以接受自己的子类对象。多态的优点是提高了程序的扩展性。前提是类与类之间有关系,即继承或实现,存在覆盖,否则无意义。虽然提高了扩展性,只是相对于父类的引用访问父类中的成员。在多态的引用中,子类得到了提升,向上转型,想要调用子类的方法,则需要强制将父类的引用转成子类。  

 Animal a=new cat();  //a 是父类指向子类的引用
  a.eat;
 Cat c=(cat)a;
c.catchMouse();
Animal a=new Animal();
Cat c=(cat)a; 

 

  上面这句是错误,因为不能将父类强制转化为子类类型。可以转化的是父类的引用指向子类,这样既可以提升,又可以强转。多态自始至终都是子类在变化。

   instanceof 这个关键字用来判断某一类型引用指向的对象符合什么类型

   多态中非静态成员函数的特点:在编译时期,参阅引用类型变量所属的类中是否有调用方法,有就成功,否则失败。在运行时期,参阅对象所属的类中是否有调用方法,编译时看引用的父类中是否有调用的方法,运行时就看子类的方法。

   多态中的成员变量特点:无论编译与运行,都是看父类,参考左边,引用型变量所属的类,静态成员函数同样是这样的。因为静态方法在进入内存后,即被绑定到了所属类下面。 要考虑到对象建立过程中,内存加载的顺序与情况。

     Object类:所有类的父类,因为父类都是从子类中抽出公有的功能,那么作为object 类它的方法是所有类都有的。

clone(),equals(),hashcode(),wait(),notify(),toString()。equals与==的区别在于equals比的是内容,类型。==比较的是内存的地方。用到对象里的特有数据时记得进行类型转化,因为比较返回的类型是object类。getClass(),这个方法今后是要用到发射中的。

     内部类:将一个类中定义在另一个类的里面,这样的优点是可以直接访问外部类中的成员,包括私有。外部类要访问内部类,必须建立内部类。

外部类.内部类.名称=new 外部类 ().new 内部类()。

outer.inner in=new outer.new inner()

class outer
{
   int x=0;
      class inner
     {
         System.out.println( outer.this.x)  //这个就是外部类可以访问内部类的原因
       }
}
   当内部类在成员位置上,可以被成员修饰符所修饰。private,static都可以修饰了。使用static修饰时,只能访问外部类中的静态成员,出现了访问局限,当内部类的方法操作数据都是非特有的数据时,可以用静态内部类了。访问非静态成员的格式:

new outer.inner().function();

 访问静态成员时:

outer.inner().function();
内部类中定义静态成员,该类必须是static的。static修饰成员的。

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

  描述事物的时候,事物的内部还有事物。那么需要使用内部类来进行描述了。这个是使用内部类的原则。前面是在成员位置上时,当内部类定义在局部时,

1.不可以被成员修饰符修饰。

2.可以直接访问外部类中的成员,因为还有外部类中的引用,但是不可以访问它所在的局部中的变量,只能访问final修饰的局部变量。

  匿名内部类:定义匿名类的前提:

1.内部类必须是继承一个类或者实现接口。

class  outer
{
 public void function()
 {
      new +父类()
   {
    复写的方法 
   }  
 }.function();
}

2.匿名内部类的本质是匿名子类对象,有些臃肿,因为带有内容的缘故。匿名对象只能调用一次方法。匿名内部类中定义的方法最好不要超过三个(含三个)。

public class test6 
{
  public static void main(String[] args)
  {
	 test.function().method();
  }
}
interface Inter
{
 void method();	
}
 class test 
 {
	 static Inter function()
	 {
		 return new Inter()
           {
			 public void method()
			 {
				 System.out.println(" ");
			 }
		 };
	 }
 }

  匿名内部类的范例,需要注意的地方是主函数中的调用模式决定了方法是静态的方法,返回的方式。最后的分号不要忘记。

  异常:运行程序中出现的问题。对于出现的问题在java中分为两种:Error类与Exception两种。Error的出现一般不需要编码针对处理。Exception 则是我们需要针对处理的。虽然两者不同,但是有些共性的内容,比如原因,出现的情况。有了Throwable类,此类中有getCause(),获取原因。getMessage 获取throwable的详细消息字符串。printStackTrace()将此throwable及其追踪输出至标准错误流。toString() 返回此throwable的简短描述。常见的Exception:Arithmeticex。ception属于运算异常。—Exception作为问题异常的方法描述后缀,和Error一样。

  异常处理的特有格式(某些步骤可以省略,除了try,剩余两个可以省略一个)

 try
 {
	 需要被检测的代码;
 }
  catch(异常类 变量)
 {
	  处理的异常代码即处理方式;
 }
  finally
  {
	  一定会执行的语句;
  }
	public static void  main(String[] args)
	{
		
		try
		{
		    rec r=new rec(3,-3);
		    r.getArea();
		}
		
		{
			System.out.println(e.toString());
		}
		System.out.println(" p ");
   }
}
interface Shape
{
 void getArea();	
}
 
class rec implements Shape
{
  private int len,wid; 
 rec(int len,int wid) throws someException 
   {  
	  if(len<0||wid<0)
	      throw new someException
	   this.len=len;
	   this.wid=wid;
   }
   public void  getArea()
   {
	   System.out.println(len*wid );   
	   }
}
class someException extends RuntimeException
{
	someException(String message)
	{
		super(message);
	}
}

      对于捕获的异常,我们常用的操作。前面有介绍过的一些方法,getMessage 获取异常信息。toString() 异常名称:异常信息;printStackTrace 打印异常信息,异常类直接调用即可。JVM默认的异常处理机制就是在调用printStackTrack的方法,调用完后,程序会停止运行,出问题下面语句不会执行到。   我们在功能上通过throw是 来抛出异常来说明此功能有可能在调用的过程出现问题,类上也是需要声明异常的throws 异常,解决异常的话不用声明。
    int div (int a,int b) throws Exception
  调用有可能异常的功能时,我们必须要处理,要么抛,要么try。
  多异常的处理,步骤:
 1.声明异常类时,声明的要具体些,这样处理会具体。否则,处理的时候不知道问题,那么不容易解决问题。
 2.有几个异常,那就要对应几个catch,出现继承关系的catch代码块的时候,Exception应该放在最下面,否则,父类下面的catch不会执行到。建立并进行catch处理,一定要处理问题而不是简单地打印,因为异常机制的出现本质是为了解决问题而且不符合实际开发需求。
  除了java定义的异常外,实际开发中还有一些未定义的异常,我们需要自定义异常。自定义异常类继承Exception,当函数内部出现抛出异常时,必须要给出处理。一般情况,函数内出现异常,函数上要声明出来---throws Exception。之所以要继承,是因为只有Throwable中才有抛出特性 throw  throws。 throw使用在函数内,后面是异常对象,throws使用在函数上,后面是异常类,可以多个,逗号隔开。函数内抛出异常,函数上要声明,除了RuntimeException。函数上声明了该异常,调用者可以不用处理。原因是出现这类异常时,需要程序停止,需要用户再去处理了。catch 有否来判断有没有处理,没有处理就需要类上声明。
   子类在覆盖父类时,如果父类方法抛出异常,那么子类在覆盖该方法时,只能抛出父类异常或此异常的子类 如果父类抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。原则是父类可以处理的异常,子类就可以抛出。   如果父类或接口都没有抛出异常,那么子类也不能抛出异常,子类方法有异常,只能try,绝对不能抛。


   包:对类中的文件进行管理,可以理解为java中的文件夹概念。给类提供多层命名的空间,写在程序文件的第一行,类名的全称是  包名.类名运行java的时候类的书写是要符合以上全称的。包也是一种包装。

  保存的时候,在Dos命令行里的格式是-d .  所在文件夹位置。包与包之间要访问的话,被访问的包中的类及类中的成员要被public修饰才行。继承的过程中被继承的类名使用的是全称。不同包中的子类可以访问父类中被protect保护的成员。包与包之间可以使用的权限只有两种,public protect。

    为了 简化类名的书写,使用了一个关键字:import。

  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值