java学习之路:25.类的继承,Object类,对象类型转换,instanceo关键字

写在前面:
大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书。
很感谢能有这样一个平台让我能够在这里分享所学所感。
我喜欢编程,喜欢代码,喜欢去做一个程序员。
努力学习,争取多年后,给亲人更好的生活。
QQ/WX:2506897252 欢迎交流。



1.类的继承

类是可以继承的,在java中使用extends关键字类标识两个类的继承关系。
例如下面的图:
在这里插入图片描述
俗话说一日为师,终身为父嘛,哈哈,举一个不太恰当的例子,但确实对理解有所帮助,父类是老师,子类就是我们,随着长时间的相处,老师的行为,我们可以复制,也就是为我所用,老师的技能,也会被我复制,相当于我可以使用老师的技能,但是老师可能还会留一手,俗话说教会徒弟,饿死师傅,哈哈,而老师的家庭,我们可不能复制,所以,类成员有不同的修饰符来修饰,而老师家庭相当于是private,行为是public,技能是proteed。也就是说子类没有权限调用父类中被修饰为private的方法,只能调用修饰为public和protected的成员方法。

继承并不只是扩展父类的功能,还可以重写父类的成员方法,甚至重构:
重写(覆盖):在子类中将父类的成员方法的名称保留下来,重写成员方法的实现内容,更改成员方法的存储权限,或是修改成员方法的返回值类型。
重构(特殊的重写):子类与父类的成员方法返回值,方法名称,参数类型以及个数完全相同,唯一不同的是方法实现内容,这种特殊重写方式被称为重构。
需要注意的是重写父类方法时,修改方法的修饰权限只能从小范围到大范围的修改,从小到大依次为private,proteed,public。

文字记录完毕,上点代码:

//父类
public class teacher {
 public teacher()
 {
  System.out.println("父类被调用");
 }
    public void behavior()
    {
     System.out.println("我是行为");
    }
    protected teacher dolt()
    {
     return new teacher();
    }
}

//子类
public class student extends teacher {
 public student()
 {
  super();//调用父类构造方法  只能写在第一行,括号内为参数,父类构造函数参数为什么,就写什么,若没有参数,则不需要写
  super.behavior();//调用父类成员方法
 }
 public void dosomethingnew()
 {
  //新增方法
 }
 protected student dolt()
 {
  return new student(); //重写父类方法,返回值为student类型
 }
 public static void main(String[] args) {
  //
 }
}

说一下返回值,这就是面向对象的好处,和基本类型如int,char,float一样,student,teacher也是一种类型,也可以被返回。
然后就是当实例化子类对象时,父类对象也相应被实例化,换句话说,在实例化子类对象时,java编译器会在子类的构造方法中自动调用父类的无参构造方法,但有参构造方法并不能被自动调用,只能依赖于super关键字显式地调用父类的构造方法。
当实例化子类对象时:

 student s=new student();

运行结果如下:
在这里插入图片描述


2.Object类

在java中,所以的类都直接或者间接继承了java.lang.Object类,Object类是一个比较特殊的类,它是所有类的父类,是java类层中最高层类,是java中至高无上的类,当创建一个类时,总是在继承,除非某个类已经指定要从其他类继承,否则它就是从Java.lang.Object类继承而来的,例如String,Integer等等的类都市继承于Object类,自定义的类也都继承于Object类,由于所有类都是Object的子类,所以在定义类时,省略了extends Object关键字。

在Object类中主要包括clone(),finalize(),equals(),toString()等方法,其中常用的两个方法为equals()和toString()方法,由于所有的类都是Object类的子类,所有任何类都可以重写Object类中的方法。
需要注意的是Object类中的getClass(),notify(),notifyAll(),wait()等方法不能被重写,因为这些方法被定义为final类型。
什么是final类型?
一旦你声明作final,你将不能改变这个方法,如果你试图将变量再次初始化的话,编译器会报编译错误。
final的含义在不同的场景下有细微的差别,但总体来说,它指的是“不可变”。

几个重要的Object类方法:

1.getClass()方法
该方法返回对象执行时的Class实例,然后使用此实例调用getName()方法可以获取类的名称。
可以将getName()方法和toString()方法联合使用。

getClass().getName();

2.tostring()方法
该方法将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常会重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或者字符串连接时,将自动调用重写的toString()方法。

package number;
public class student  {
 public String toString()
 {
  return "在"+getClass().getName()+"类中重写toString()方法";
 }
 public static void main(String[] args) {
  System.out.println(new student());
 }
}

如图:
在这里插入图片描述
当打印student类对象时,将自动调用toString()方法。

3.equals()方法
前面学习过equals()方法,当时是比较“”== ” 运算符于equals()方法。

==运算符比较的是两个对象的引用是否相等,而equal()方法比较的是两个对象的实际内容。
查看对象的比较

public class student  {
 public static void main(String[] args) {
  String s1="花狗";
  String s2="花狗";
  System.out.println(s1.contentEquals(s2));
  student t1 =new student();
  student t2 =new student();
  System.out.println(t1.equals(t2));
 }
}

运行结果:
在这里插入图片描述
可以看出,在自定义的类中使用equals()方法比较时,将返回false,因为equals()方法默认使用==进行比较两个对象的引用地址,而不是比较对象的内容,所以要比较两个对象的内容,需要在自定义类中重写equals()方法。


3.向上转型

//父类
package number;
public class teacher {
    public static void behavior(teacher s)
    {
     System.out.println("老师类中的方法");
    }
}

//子类
package number;
public class student extends teacher {
 public static void main(String[] args) {
   student s=new student();
   behavior(s);//调用父类方法
 }
}

使用子类对象,调用父类方法,就是把子类对象赋值给父类类型的变量,这种技术被称为向上转型,这时多态机制的基本实现。


4.向下转型

相反的,使用父类对象赋值给子类类型的变量,必然会出错,必须使用显式类型转换,

teacher t=new teacher();
student s=(student)t;

5.instanceo关键字

当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向上转型之前需要一个好习惯,就是判断父类对象是否为子类对象的实例,这个判断通常使用instanceof操作符来完成。
语法如下:

t instanceof s

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

if(t instanceof s)
student s=(student)t;

若有错误,欢迎指正批评,欢迎评论。
每文一句:每一个你所浪费的今天,都是多少人曾经奢望过的明天。每一个你所厌烦的现在,都是未来的你想回也回不去的曾经!

发布了60 篇原创文章 · 获赞 107 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Fdog_/article/details/104372373