/**
关于继承与覆盖
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
本文详细介绍了Java中的继承与覆盖概念,包括继承的基本原理、如何正确地使用继承、避免继承的常见误区,以及覆盖(重写)方法的原则与注意事项。
1033

被折叠的 条评论
为什么被折叠?



