继承、多态
【摘要】
继承、多态
继承: 面向对象的三大特征之一: 是类和类之间的一种拓展关系,是一种从一般到特殊的关系; 格式: sub extends Super, 我们把sub称为子类或者拓展类, 把super称为父类或者基类(超类) 泛化: 把子类中的共性抽取到父类的过程; 特化: 子类在父类的基础之上,拓展自己特有的状...
继承、多态
-
-
继承:
-
面向对象的三大特征之一:
-
-
是类和类之间的一种拓展关系,是一种从一般到特殊的关系;
-
-
格式: sub extends Super, 我们把sub称为子类或者拓展类, 把super称为父类或者基类(超类)
-
-
泛化: 把子类中的共性抽取到父类的过程;
-
特化: 子类在父类的基础之上,拓展自己特有的状态和特征;
-
-
Object: 是所有类的直接父类后间接父类;
-
-
-
class Student{} 等价于 class Student extends Object{}
-
-
直接父类: 直接继承的父类,有且只有一个,也就是说Java只支持单继承;
-
间接父类: 直接父类或间接的父类的父类;
-
-
方法和字段:
-
private 修饰的成员不能被继承;
-
默认访问权限的成员能不能被继承? 要是在同一个包中就能被继承
-
protected 修饰的成员,可以被继承;
-
public 修饰的成员,可以被继承;
-
-
构造方法能不能被继承? 不能
-
-
class Person{
-
-
public Person(){}
-
}
-
-
class Student extends Person
-
{
-
//public Person(){}//ERROR
-
}
-
-
若父类所有的构造方法是用 private 修饰,不能有子类;
-
-
-
-
-
-
-
-
子类实例化:
-
子类初始化,会先默认调用父类的一个无参的构造方法,自己再初始化;
-
-
子类的构造方法里,有一个隐式的 super();
-
-
若我们显示的让子类去调用父类有参数的构造方法,默认的隐式的构造方法就不会被调用了;
-
-
子类对象创建之前,必须有一个父类对象;
-
-
-
方法覆写:
-
当父类的某一个方法不适合子类对象的时候,就应当重新修改方法体;
-
-
遵循的原则: 一同 两小 一大:
-
-
一同: 方法签名相同
-
两小:
-
1.返回值类型可以是父类返回值类型的子类或相同;
-
父类的:Object show(){
-
return null;
-
}
-
-
子类的: String show()
-
{
-
return null;
-
}
-
2.异常更小
-
一大: 子类方法的访问权限 >= 父类方法的访问权限
-
父类的: private Object show(){
-
return null;
-
}
-
-
子类的: String show()
-
{
-
return null;
-
}
-
-
上面这个不是覆写:因为私有成员不能被继承
-
-
必杀技: 若子类方法是覆写方法的话, 那么在方法上加上 @Override 是可以编译通过的;
-
-
-
-
静态方法能不能被覆写: 不能!
-
-
方法的覆写:属于多态,而多态是基于对象的(父类的一个变量指向子类的一个对象);
-
-
而静态方法不属于对象,属于类;
-
-
-
-
super:
-
用在子类.,
-
super:表示父类对象
-
用于调用父类的方法或字段,用法和this一模一样
-
-
调用父类的构造方法:
-
-
super(参数);和this(参数);
-
都表示在构造方法里调用构造方法;都必须写在构造方法的第一行
-
-
不同: this(参数),调用的当前类里面的构造方法,super(参数),调用的是直接父类里构造方法
-
-
-
多态:
-
-
面向对象的三大特征之一:
-
-
Person p = new Student();
-
-
p的真正类型是学生;当是我们只把他当一般人看待;
-
-
编译类型: 申明变量的类型 Person , 是我们把它当做什么
-
运行类型: 创建对象的类型 Student , 是对象真正的类型
-
-
多态的产生前提:继承
-
当编译类型和运行类型不一致的时候,就会产生多态;
-
-
多态定义: 同一个实体有多种形态;
-
-
多态的作用: 可以屏蔽不同子类对象之间的差异,从而能写出更加通用的代码,能提高效率,维护性;
-
-
引用类型转换:
-
-
向上转型: 小->大, 自动转换, 这里说的小和大,说的是 继承关系中的子类和父类.
-
-
可以把子类对象赋给父类变量;
-
Person p = new Student();
-
-
Object类是所有类的父类.那么Object类型的变量能不能接受一切值? 可以!
-
-
-
向下转型: 大 -> 小
-
-
父类对象强制转换成子类对象;
-
-
Student s = (Student)p;
-
-
一般的,再强转之前,要先判断该对象时候属于这个类类型;
-
boolean b = 对象 instanceof 类
-
-
对象的类型和类必须有继承关系;
-
-
先判断 p是否是学生类型:
-
-
if(p instanceof Student)
-
{
-
Student s = (Student)p;
-
}
-
-
多态方法调用:
-
-
class Car{
-
-
public void run(){}
-
}
-
-
class Binli extends Car
-
{
-
-
public void paoMM(){
-
-
}
-
-
public void run(){}
-
}
-
-
Car c = new Binli();
-
-
1.调用的方法不是覆写方法,子类有,父类没有;
-
c.paoMM();//找不到方法,编译的时候,去Car类里去找;
-
-
if(c instanceof Binli)
-
{
-
Binli b =(Binli)c;
-
b.paoMM();
-
}
-
-
-
2.调用的方法是覆写的方法,父类有,子类也有;
-
c.run();//调用的是子类的方法,,在编译的时候去Car里找run方法,但运行期间找的Binli类里的run方法;
-
-
组合:
-
extends 继承是一种从一般到特殊的关系, 也就是说 子类是父类的一种特殊情况;
-
-
子类 is 父类的一种 is A 关系
-
-
组合,包含: 比如手机和手机卡, 手机里有手机卡 ,has A关系
-
-
圆心和圆的关系:
-
-
-
练习:判断一个点和圆的关系(外,内,上);
-
-
-
// 描述一个点,只需要坐标就OK了
-
class Dot
-
{
-
private double x;//横坐标
-
private double y;//纵坐标
-
-
-
//根据坐标来创建点
-
public Dot(double x, double y)
-
{
-
this.x =x;
-
this.y = y;
-
}
-
//getter setter
-
}
-
-
/*
-
描述一个圆,
-
-
圆包含圆心,圆心又是一个点
-
*/
-
class Circle{
-
-
private Dot o;//圆心//等价于private Dot o = null;
-
-
//private Dot p;/不能这样设计,这样就已经表示圆包含需要判断的点了
-
-
private double r;//半径
-
-
//根据半径和圆心来创建指定的圆
-
-
public Cirlce(Dot o, double r)
-
{
-
//this.o.setX(o.getX());ERROR
-
-
this.o = o;
-
this.r = r;
-
}
-
-
//写一个判断点和圆的关系的方法
-
public String judge(Dot p)
-
{
-
double x = o.getX() - p.getX();
-
double y = o.getY() - p.getY();
-
-
double xx = x * x;
-
double yy = y * y;
-
double rr = r * r;
-
-
if(xx + yy - rr > 0)
-
{
-
//圆外
-
}else if(xx + yy - rr == 0)
-
{
-
//圆上
-
}else{
-
//圆内
-
}
-
-
return "";
-
-
}
-
-
-
/*
-
getter/setter
-
*/
-
-
-
}
-
-
-
....main...
-
{
-
//创建圆心点
-
Dot o = new Dot(0.0,0.0);
-
//创建指定大小的圆
-
Circle c = new Circle(o, 5);
-
-
//还需要一个判断的点
-
Dot p = new Dot(3,4);
-
-
//判断
-
-
String ret =c.judge(p);
-
-
System.out.println(ret);
-
}
-
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/81567099
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)