黑马程序员:Object类:超父类的学习

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

Object:所有类的父类
所有对象都具备的内容不断地抽取,就到了一个顶层Object类中。
equals()方法
 所有对象都可以进行比较,我们之前用的都是比较数据(数值)时运算符
 而对象是不能比较运算符,所有对象都能比较,那就只能用Object 类的比较方法equals();
 为什么只用传一个比较对象boolean equals(Object  obj),因为对象本身就是一个需要比较的对象
 equals的使用:
  equals 比较的是两个对象的地址值的方式
  d1.equals(d2) 比较的是两个引用是否指向同一个对象
 因为子类已经继承了父类 的所以功能,
 既然父类中已经提供了对对象相等的比较。可经直接使用,如果比较内容不是所需要,
 可以将其覆盖,保留其功能声明,定义自己所需的比较内容

 通常在开发时,每一个对象都具备该方法,但是每个对象都有自己的属性的比较方式
 所以都会覆盖该 方法建 立每个对象自己特定的判断相同的依据
 public boolean equals(Object obj)
 {
 //只要年龄相同,就是同龄人,就是相同对象
 既然要用到对象的特有内容。向下转型 
 if(obj instanceof Person)
 {
   return false ;  //在工作中是不会返回false 的而是抛出异常
 }
  Person p=(Person)obj;
 if(this.age==obej.age)
 
 }
toString方法: 把对象变成字符串
    Person p=new Person();  
    System.out.println(p.toString());  //在输出语句里,如果输出的是引用型变量,
					那会调用toString方法,将其变成字符串进行打印。


为了让自定义的对象对应的字符串表现形式有意义,
那就覆盖toString方法即可。
public String toString()
{
 return "Person"+age;
}

在以后的工作中,如果想要让自定的对象特定的字串形式更有意义
那就可以覆写Object类中的toString方法。
 建议所有子类都重写此方法

 getClass()方法:获取任意一个对象所属的字节码文件对象
  Person p1=new Person()
  Person p2=new Person();
  Class c1=p1.getClass();
  Class c2=p2.getClass(); //c1==c2 比较的是同一个字解码文件的对象
  System.out.println(c1.getName());打印类名

  hashCode():拿到任何一个对象的哈希码值
   p1.getclass().getName()+"@"+Integer.toHexString(p.hashCode());

  native(本地):jvm会自动去找windows的方法。
  -----------------------------------
  内部类

  将一个类中还有一个类
特点:
  内部类可以直接访问外部类中的成员
  外部类要访问内部类中的成员必须创建内部类的对象

  为什么要定义内部类?
  类是用于描述事物的,而事物中如果还有具体的事物,而且这个内部的事物在访问
  着所属事物 中的内容
  这时这个内部的事物,也需要用到类来描述。这个类就是内部类


  为什内部类可以直接访问外部类中的成员?
  因为内部类都 持有一个外部类的引用。外部类名.this
----------------------------------------
内部类的修饰符
 当内部类定义在外部类的成员位置上时,
 可以使用成员的修饰来进行内部类的修饰


 1,权限修饰符
    默认的(default)或者公有的(public )
     可以直接访问内部类
     外部类名。内部类名 变量名=new 外部类对象()。new 内部类对象()
    私有的(private)
      是不可以直接在外部访问
    
  内部类也可以被修饰符修饰


  static 修饰符:
	内部类被静态修饰,出现访问局限性,只能访问外部中的静态成员
	内部类被静态后,会随着外部类的加载而加载
	静态内部类的格式:new Outer.Inner();
	   直接new内部类对象,调用内部类中的非静态成员
	   
如果内部类中定义了静态成员,该内部类必须被静态修饰

     
记住:内部类只有定义在外部类的成员位置上,才具备这些修饰符

  class Outer
  {
   int num=4;
   //内部类
   class Inner
   {
    void method()
    {
    }
   
   }

   public void show()
   {
     Inner in=new Inner()
      in.method();
       外部类想要调用内部类的时候 就要创建对象进行调用
   }
  }
class InnerClassDemo
{
 public static void main(String[] args)
 {
  直接在其他类中,访问一个类的内部类
  new Outer().show();
    
    在其也类中直接访问内部类的方法
  Outer.Inner in=new Outer.new Inner();
}
}

------------------------
内部类也可以定义在外部类中的局部位置上(静态只修饰成员,不能修饰局部)

内部类定义在局部位置上,不允许访问局部中变量。
只能访问被final 修饰的局部常量
class Outer
{
 public void show()// 局部变量也可以使用final修饰
 {
  int x=5; //内部类中不能访问局部变量
  class Inner
  {
   void method()
   {
   }
  }
 
   Inner in=new Inner
    in.method();
 }

}

---------------------
匿名内部类
  凡是匿名都是简写格式

  定义匿名内部类,必须要前提
 ****** 内部类需要继承或者实现一个外部类或者接口
  这时才能简写匿名内部类的形式


  匿名内部类其实就是一个匿名子类对象,这个对象用{}结尾内部定义了成员
  也就是说是一个带有成员内容的对象,这个对象有点胖


  格式: new 父类名或接口名{}。成员();
abstract class Dmeo
{
 abstract void show();
}
class Outer
{
 class Inner extends Demo  //内部类是可以继承或实现类、抽象、接口
{}
//匿名内部类: 就是Demo的一个匿名子类对象
 Demo d= new Demo()
  {
   void show()
   {
   System.out.println("---------------");
   }
  };
  d.show();
}
匿名内部类特有方法可以用in.方法名调用吗?
in.show3(); //不可以,因为这个子类对象 已经提升为Inter接口类型,
只能使用Inter中的方法,不能使用子类的特有方法。
-----------------
什么时候使用匿名内部类??
当只使用一两个方法时, 就可以使用匿名内部类
匿名内部类使用场景之一:
 当接口类型参数,该接口中方法不超过三个,可以使用匿名内部类作为函数的参数进行传递 
 这亲简化了书写
 但是接口方法较多时,不要使用匿名内部类,影响阅读性


 -------------------
----异常
 不正常
 在运行时期发生的一些不正常情况,就是异常。

 异常的由来:程序运行时总会一些不正常的情况
	java语言对这些不正常情况进行了描述
	并对这些不正常进行了对象的封闭。
	是描述不正常情况的对象
异常情况有多种,都需要分别描述,意味着异常情况应该会有一个体系。
多个异常具备共性不断的向上抽取,就形成体系
就是Exception就是一个父类 
	通过查阅api 发现异常体系是这样的
Throwable:可抛出
    Error:严重的问题,一般都是由JVM从底层抛出来的问题,通常不需要处理,直接修改程序即可
    Exception:是可以定义针对性的处理方式对该种情况进行处理

不正常情况分两种,一种是可以解决的Exception、 一种是严重性的Error
无论是Error还是Exception,它们的子类都一个特点,子类名的后缀都是父类名

这个异常体系最大的特点:就在于该体系中的类和对象都具备可抛性
	可抛性的体现就是无论是类,还是对象都可以被throws或者throw所操作
	throws操作类,throw操作对象
	异常是可以处理的.
	处理方式:
	 1、声明抛出。 告诉调用者功能会有问题。通过throws关键字对问题声明在功能上
	 2、进行捕捉。
	 try
	 {
	   //需要被检测的代码
	 }catch(异常类 变量)
	 {
	 //异常处理代码
	 
	 }
	 finally
	 {
	 //一定会被执行的代码块
	 }


	异常处理的流程 :jvm默认异常处理方式就是将收到的异常名字,信息,位置,都打印在控制台上,结束程序

throw和throws关键字有什么区别
 throws用在函数上,用于功能声明异常,后面抛出的是异常类可以抛出多个,只要用逗号隔开就可以了
  int div()throws Exception,RuntimeException
  throw只能用在函数内,用于抛出异常对象,额外特点:一旦执行,功能就结束了。
  正常流程代码
  if()
    throw 问题 对象();
  if()
     throw 问题 对象();

 问题处理代码 和正常流程代码分开

 catch()
 {
 问题处理代码
 }
 catch()
 {
 问题处理代码
 }

-----------------------
自定义异常:
对于常见的不正常情况,java 都有对应的描述,比如角标越界,或者空指针等
对于自定义的程序 中出现的特有问题,java并没有给出对应的描述
这时就需要我们按照面向对象的思想对这个问题进行描述,象异常一样将其封装成对象

定义的方式:
 1、 定义一个类,对问题进行描述 
  2、必须要让这个类继承异常类,具备可抛性

  class FuShuException extends Exception
  {
  }
  这就是自定一个负数的异常


  细节:
   定义 功能,功能内部因为传入的参数问题,导致了功能会出现问题
  这时为了解决这个问题,通常我们都会将问题通过throws声明在函数上
  目的:为了调用者在使用这个功能的时候,能明确处理方式。
  也就是说throws抛出的目的是为了让调用者预先定义好问题的处理方式

  2、如果一个功能抛出多个异常。那么在调用该功能时,需要有多个catch进行每一个异常针对性处理
  如果多个catch中有父类异常,一定要定义在最下面,否则编译失败
  3、特殊部分:

  函数内throw抛出异常对象,函数上一定要throws进行声明抛出,或者try catch捕捉,否则,编译失败

  注意:异常分两种
  1、编译时被编译器检测的异常
	通常都需要编写针对性的处理代码进行处理
  2、编译时不被检测的异常,这种异常出现,编译时期是不在检查之列。这种异常称为运行时异常
     也就是说函数内throw抛出运行时异常,不需要在函数上声明,即使声明了,
     调用者也不用一定给出预先处理方式,因为它不会导致编译失败
     通常,不编写针对性的代码进行处理,一旦发生,就让程序停掉
     为了对代码进行修正。

  运行时异常和编译时异常区分方式:
  Exception中一个特殊的子类,RuntimeException就是运行时异常
  RuntimeException和其子类都不需要编译时检测
  意味着: 我们在自定义异常时,可以继承Exception,称为编译时被检测的异常
   也可以继承RuntimeException称为运行时异常
	

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值