《黑马程序员》java笔记->【03】关于继承与覆盖

本文详细介绍了Java中的继承与覆盖概念,包括继承的基本原理、如何正确地使用继承、避免继承的常见误区,以及覆盖(重写)方法的原则与注意事项。

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


/**
 关于继承与覆盖

java中所有的的父类是:Object(最顶层类)

继承关系

存在所属关系时候,才定义继承

继承:is a关系;抽象:like a关系

继承后可以直接使用父类的方法

误区:不要仅仅为了提高复用,为了方便获取其他类中的内容而去继承

一个类只能继承一个父类,但是可以有多个父类

查阅该体系中的顶层类的内容。可以了解该体系的基本功能。

创建对象时候创建最子类对象,可以使用基本功能和子类特有功能。

(看父类内容,建子类对象使用)

super:代表父类,用法和this相似
this代表本类对象的引用(对象地址);System.out.println("this="+this) 运行结果哈希码
super代表父类所属空间。

注意:子父类中通常不会出现同名属性,因为父类中已经定义属性,子类没必要在定义可直接用。

如果父类属性私有private,子类只能直接访问非私有不能直接访问除非用提供访问的方法,如:setAge(int a),getAge()

当子父类中出现一样的方法时,会发生函数的特性:覆盖(重写)override;(自己有不找父类)
-------------------------------------------------------------------------------------
覆盖注意:
1:子类覆盖父类时,必须保证覆盖方法权限大于被覆盖方法的权限

2:覆盖方法静态修饰时,静态只能覆盖静态,或者被静态覆盖,写法注意这项

子类和父类不能有不同返回类型的 同名方法(同名参数)
如:
class Fu
{
 //没写权限public,private  ,不代表默认权限public,private等
 //这种权限介于小于共有权限,大于私有权限间
 void show(){System.out.println("fu");}
}
class Zi extends Fu
{
 int show(){System.out.println("zi");
 return -2;
}
运行出现不确定,错误(本类中不允许出现,子父类中也不允许出现)
-------------------------
//继承覆盖的举例
class Demo32
{
 public static void main(String[] args)
 {
  Phone p=new Phone();
  p.show();
  NewPhone p2=new NewPhone();
  p2.show();
 }
}
class Phone
{
 void show()
 {
  System.out.println("number:");
 
 }
 void call(){}
}
/*
继承了父类的功能后,对已有的功能进行内容的改变。
功能声明不变,将内容在子类中进行自定义
这种定义叫做覆盖。
*/
class NewPhone extends Phone
{
 //继承父类功能,并对功能自定义
 void show()
 {
  //新增功能
  System.out.println("name:");
  //调用父类方法功能
  super.show();

 }

}
------------------------
*/
class Demo32
{
 public static void main(String[] args)
 {
  B s1=new B();
  s1.show1(20);
  System.out.println(s1.show2());
 }

}
class A

 String name="A";
 public void show1(int age)
 {
  System.out.println("age="+age);
 }

}
class B extends A
{
 String name="B";
      //void show1(){}
 public String show2()
 {
  //表示本类name用this.name,父类用super.name
  return this.name;

 }
}
class C extends A//不能多继承如:extends A,B 错误
{
      //void show1(){}
 public void show3(){}
}
---------------------------------------
/**
-------------------------------
构造函数不会覆盖,因为类名不一样

子类的实例化过程
 其实子类的所有构造函数中的第一行,默认多有一条隐士的语句。
 就是super();也就是说子类的构造函数默认都会访问父类中空参数的构造函数

为什么子类的构造函数都要去访问父类的构造函数呢?
因为子类继承了父类,可以访问父类中的已有的一些属性,
在子类进行实例化的时候必须要为父类中的属性分配空间。
并要进行初始化,所以必须要访问一次父类的构造函数,看
看父类时如何对其属性进行初始化的。
所以子类要实例化对象时,必须要先看父类的初始化过程

结论:父类的构造函数既可以给本类对象初始化,也可以给子类
对象初始化。

注意:如果父类中没有空参数的构造函数,那么子类的构造函数中
必须用super来手动指定要访问的父类中的构造函数。
或者用this来指定访问本来中的构造函数。

this和super调用构造函数只能定义构造函数的第一行。不能同时出现。
为什么都在第一行? 因为初始化的动作要先执行

class Fu
{
 //父类中没有空参数的构造函数
 Fu(int x)
 {
  System.out.println("fu run"+x);
 }
}
class Zi extends Fu
{
 Zi()
 {
  //super();
  super(3);//用super手动指定访问的父类构造函数
  System.out.println("zi run");
 }
------------------------------
*/

class Demo33
{
 public static void main(String[] args)
 {
  new Zi();
 }
}
class Fu
{
 Fu()
 {
  System.out.println("fu run");
 }
}
class Zi extends Fu
{
 Zi()
 {
  //super();
  System.out.println("zi run");
 }
 Zi(int num)
 {
  //super();
  System.out.println(num);
 }
}
//运行结果:fu run
//     zi run

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值