java的继承及super

由继承而得到的类叫做子类,被继承的类叫做父类。

一个父类可以同时拥有多个子类。一个子类只能是有一个直接父类,即单继承。

父类实际上是所有子类的公共域和公共方法,子类是父类的特殊化。

Java中,如果没有extends语句,则该类默认继承的是java.lang.Object。因此Java中的类都是直接或间接继承继承java.lang.Object

子类可以继承父类的所有内容(无static或private修饰),可以隐藏或修改父类的域和方法,也可以添加域和方法。

变量的继承,隐藏与添加

  1. 继承
    只要该变量未被static或private修饰,子类就可继承。
  2. 隐藏
    子类重新定义一个与父类那里继承而来的变量完全相同的变量,即隐藏。
  3. 添加
    定义子类时,加上新的变量。

方法的继承,覆盖与添加

  1. 继承
    子类自动继承父类的非私有方法。

  2. 覆盖
    子类重新定义与父类同名的方法。
    重新定义时,保持与父类完全相同的方法头声明。

  3. 添加
    子类增加一些方法。

子类和父类在同一个包中的继承性

子类自然而然继承了父类中非private的方法和成员变量. 继承的成员变量和方法的权限保持不变.

子类和父类不在同一个包中的继承性

子类自然而然继承了父类中非private和友好访问权限的方法和成员变量,也就是说子类只会继承父类中的protected和public访问权限的成员变量和方法.

构造函数

子类对象创建时默认自动调用父类无参构造函数,再调用本类构造函数。

  1. 父类不主动创建构造函数,子类创建构造函数无限制。
  2. 父类主动创建无参构造函数,子类无限制且先执行父类无参构造函数
  3. 父类主动创建有参构造函数,子类构造函数要先super父类构造函数且先执行父类构造函数
  4. 父类有多重含参构造函数,子类要先super父类构造函数且先执行父类构造函数

使用super()调用父类构造函数时,必须是子类构造器的第一句。

package csdnjava;

public class superuse {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SubClass sc1 = new SubClass();
		SubClass sc2 = new SubClass(400);
	}
}

class Super{
	private int n;
	
	Super(){
		System.out.println("Super()");
	}
	Super(int n){
		System.out.println("Super("+n+")");
		this.n = n;
	}
}
class SubClass extends Super{
	private int n;
	SubClass(int n){
		super();
		System.out.println("SubClass("+n+")");
		this.n = n;
	}
	SubClass(){
		super(300);
		System.out.println("SuperClass()");
	}
}



当子类覆盖了父类方法后, 子类的对象将无法访问父类中被覆盖的方法.
但可以在子类方法中调用父类中被覆盖的方法.
如果需要在子类方法中调用父类中被覆盖的方法, 则可以使用super(被覆盖的是实例方法) 或者 父类类名(被覆盖的是类方法) 来作为调用者, 调用父类中被覆盖的方法.

如果父类方法具有 private 访问权限, 则该方法对其子类是隐藏的.
因此子类无法访问该方法, 也就无法重写该方法.
如果子类中定义了一个与父类 private 方法具有相同的方法名 / 相同的形参列表 / 相同的返回值类型的方法, 依然不是重写.
这只是在子类中重新定义了一个新的方法.

对象类型转换

存在继承关系的父类对象与子类对象之间可以在一定条件下相互转换,转换所遵循的规则如下:

向上转换,即子类对象向上转换成父类,允许将子类的实例赋值给父类的引用,允许父类的引用指向子类对象。
但是反过来,一个父类对象未必可以向下转换,因为子类对象所包含的内容父类不一定具有,这种转换是不安全的。只有当父类引用实际上指向一个子类对象时,这个父类对象可以用强制转换转换成子类对象的引用。

子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换

  1. 子类对象可以被视为其父类的一个对象。父类对象不能被当作某一个子类的对象。
  2. 如果一个方法的形参定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。 简单地说,需要一个Person的地方来一个Student是可以的。

举例说明:

将父类引用指向子类对象 即向上转型 这个时候我们是使用功能较弱的类型引用功能较强的对象
Father father = new Son();
在这里Son 对象实例被向上转型为father了,但是请注意这个Son对象实例在内存中的本质还是Son类型的,只不过它的能力临时被消弱了而已

如果要让它恢复能力,就用强制转换将其对象类型还原!
Son son = (Son)father;
其实father引用仍然是Father类型的,只不过是将它的能力加强了,将其加强后转交给son引用了,Son对象实例在son的变量的引用下,恢复真身,可以使用全部功能了。

父类强制转换成子类并非任何时候都能成功,失败时:

//当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误。例如:

  Father father = new  Father();

  Son son = (Son) father;

 // 这个系统会抛出ClassCastException异常信息。

所以在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败


关于上转型对象:

1.上转型对象实际上是由子类负责创建的,只不过它的功能被削弱了。

2.上转型对象不能操作子类新增的成员变量和成员方法。

3.上转型对象可以操作子类继承的成员变量和隐藏的成员变量,也可以调用子类继承的或重写的方法。

4.将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类的所有属性和功能。

看:https://blog.csdn.net/qq_40691051/article/details/89430309
看:https://blog.csdn.net/abcdefgzmy/article/details/50696955

用eclipse时出现的问题:包不可定义为java https://blog.csdn.net/nanruitao10/article/details/94396117

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值