类的继承

类的继承(inheritance)

继承概念:

  • 一个对象从其他的类里获取状态、行为,再外加上自己的额外的一些行为、状态。(在父类程序定义了的东西,在子类中可以直接使用,不用再次定义————如此代码可重用)

  • 类与类之间同样具有关系,叫关联。(学生类与教师类)

  • 举例:信鸽继承了鸟类的特征、行为,能够飞等,但信鸽在飞行过程中还能够送信,这是信鸽特有的行为。平行四边形继承了四边形,拥有四边形的特征并且拥有自己的特征。

  • 继承分为单继承和多重继承。 单继承是指一个子类最多只能有一个父类。多继承是一个子类可以有二个以上的父类。由于多继承会带来二义性(就是说明一种语言语法不完善),在实际应用中应尽量使用单继承。

  • Java语言中的类只支持单继承,而接口支持多继承。Java中多继承的功能是通过接口(interface)来间接实现的 。

类的继承:

  • 格式:
    class 子类名 extends 父类名{
    代码块
    }
class Electricity{
   public Electricity() {									//继承必须保证父类中有一个空构造方法
   }
   public String name = null;				
   Electricity(String name){
   	this.name = name;
   }
   //父类不同封装类型方法
   protected void doSometh_pro() {
   	System.out.println("父类protected方法");
   }
   private void doSometh_pri() {
   	System.out.println("父类private方法");
   }
   public void doIt() {
   	System.out.println("父类public方法");
   }
}
class Phone extends Electricity {						//Phone子类继承父类Electricity
   public Phone() {										//子类必须调用父类的构造方法,不写系统默认加上
   	//以下语句可以不加
   	super("SAMSUNG");									//调用父类两参构造
   	System.out.println(name);							//子类拥有父类给予的可见属性,无需再次设置这一属性。
   	super.doSometh_pro();								//调用父类方法
   	//super.doSometh_pri();								//父类private都是父类私有,其他类都不可用
   }
}
public class Test {
   public static void main(String[] args) {
   	Phone ph_1 = new Phone();							//实例化子类对象													
   	
   }
}

在这里插入图片描述

对以上运行结果分析,继承优缺点分析:

优点:
  1. 可以继承父类中定义的成员方法以及成员变量,使得子类可以减少代码的书写。还可以重写父类的方法以增加子类的功能。

  2. 可缩短软件开发的周期,降低开发的费用。(父亲拼好的积木块,儿子可以直接使用,不用再去拼一个积木块)

  3. 重复使用定义好的类,减少系统在使用过程中出现错误的概率。

  4. 继承关系是传递的。 若类C继承类B,类B继承类A(多层继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。

  5. 继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。

  6. 继承提供了软件复用功能。 若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。

  7. 继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。

  8. 提供多重继承机制。 从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承。

说明:
第4—8来源百度百科:
链接: https://baike.so.com/doc/6734159-6948524.html#6734159-6948524-1.

缺点:
  1. 耦合性(模块间关联的程度)太大
  2. 破坏了类的封装性,继承一般多用于抽象方法的继承和接口的实现

子类继承父类后

子类调用父类的方法:
  • 在子类的构造方法中直接使用super()可调用父类的构造方法。
  • 可以在子类中用super关键字调用父类成员方法。
  • 在实例化子类对象时(同时子类的构造方法被调用), 父类无参构造方法将被自动调用。有参构造不能被自动调用,只能使用super关键字显式的调用父类的构造方法。
  • 使用finalize()方法注意: 如果使用finalize()方法对对象进行清理,需要确保子类finalize()方法的最后一个动作时调用父类的finalize()方法,以保证垃圾回收对象占用内存时,对象的所有部分都能被正常终止。
子类的重写父类成员方法
  • 重写
    1. 重写(覆盖),需保留方法名称。
      · 重写方法内容实现
      · 更改成员方法的存储权限
      重写方法时,修改方法的权限只能从小范围到大范围,而不能反过来。(如修改一个权限为protected的后只能修改为public而不能修改为private)
      举例:(父亲有三个儿子,父亲会制造钻石,这个技术交给某个儿子另外两个儿子肯定会吵架,即子类不能把protected方法/public方法改为private)
      · 修改成员方法的返回值类型(J2SE 5.0以上版本编译器的功能)
    2. 重构:只改变方法实现的内容,方法的类型权限,返回值,参数等都不改变。是一个特殊的重写方式。
实例化子类对象与父类实例化的关系

示例代码:

class Electricity{
	public Electricity() {									//继承必须保证父类中有一个空构造方法
		System.out.println("父类构造方法已调用");
	}
}
class Phone extends Electricity{
	Phone(){
		System.out.println("子类构造方法已调用");
	}
}
public class Test {
	public static void main(String[] args) {										
		new Phone();
	}
}

运行结果:
在这里插入图片描述
结果分析:
可以看出,实例化子类后,先执行的父类的构造方法,这就说明,实现实例化的一个父类对象,然后再实例化子类对象。访问子类的构造方法时就已经完成了父类的实例化对象以及他的构造方法调用。


无特别说明(用户指定要从其他类继承),所有的自定义、已有类都是Object类的子类。Object可以说是 “ 程序 ” 抽象出来的类。因此所写的类基本都继承于这个类,源于java.long.Object类,如:String、Integer、自定义类等(可视为:class 类名 extends Object{},但是这里extends Object是省略的)。

Object类中的方法:

(1)clone()方法

保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

(2)getClass()方法

final方法,获得运行时类型。

(3)toString方法

该方法用得比较多,一般子类都有覆盖。

(4)finalize方法

该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

(5)equals方法

该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。

(6)hashCode方法

该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。

(7)wait方法

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生。

①其他线程调用了该对象的notify方法。

②其他线程调用了该对象的notifyAll方法。

③其他线程调用了interrupt中断该线程。

④时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

(8)notify方法

该方法唤醒在该对象上等待的某个线程。

(9)notifyAll方法

该方法唤醒在该对象上等待的所有线程。

方法具体实现可查看JAVA中的API文档。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!
转载地址: https://m.php.cn/faq/416709.html.

对equals()方法的说明

完整的equals思路:例如:x.equals(y)

  1. 首先检查x==y,进行地址检查,如果相等,这是快速的方式。
  2. 检查y是否等于null,如果为null,则返回false
  3. 检查x与y是否是同一个类,此时存在两种检测方式:如果不存在子类父类关系,则可以随意使用
    (1) .利用instanceof进行检查(父类定义相等关系)
    (2) .利用getClass进行检查(子类定义相等关系)
  4. 然后对所需要对比的属性进行比较
直接输出一个对象
  • 这个对象是你自定义的一个类或者定义于已有的类实例化出来的,而这个父类就是Object类的一个子类,Object类中自带的方法toString(),Object中toString()方法的实现是这样的:

    getClass().getName() + "@" + Integer.toHexString(hashCode())
    

    举例:

class Phone{				
}
public class Test {
	public static void main(String[] args) {										
		Phone one = new Phone();
		System.out.println(one);
	}
}

结果:
在这里插入图片描述
后面跟的是这个类的哈希码值,如果希望这个类打印出想要的格式,就需要覆盖toString方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值