本周学习的内容有继承与多态:
在了解继承与多态之前,我们需要先引入一个概念——包
简单来说包就是用来存放Java文件的文件夹,其作用是对类来进行一个分类,便于管理与查找。
导入包的代码如下:
import 包名.类名
特别提醒:当需要导入包中的所有类时,类名替换为*
继承:
继承就是保持已有类的特性而构造新类的过程。继承后,子类能够利用父类中定义的变量和方法,就像它们属于子类本身一样。
单继承:在类层次中,子类只继承一个父类的数据结构和方法,一个类只有一个父类
多继承:在类层次中,子类继承了多个父类的数据结构和方法,一个类允许有多个继承
//父类
public class file{
public long size; //文件大小
public String name; //文件名
public void info() //显示文件信息
{
System.out.println(name + " " + size);
}
}
//子类
public class videofile extends file()
{
//父类的public成员自动继承
//private不能被继承,子类无权访问
//只需要添加子类的特性
public int duration //时长
public void play()
{
System.out.println("播放" + this.name);
}
public void stop()
{
System.out.println("停止" + this.name);
}
}
成员变量隐藏:是指在子类中定义了一个与直接超类的某个成员变量同名的成员变量,从而使超类中的那个成员变量不能直接被子类继承。
当成员变量隐藏时,在超类类题代码中用简单变量命名访问的一定是超类中的成员变量,而在子类类体代码中用简单变量名访问的则一定是在子类中的成员变量
可以用下列各式访问超类中被隐藏的成员变量
super.<变量名> 在子类类体里,访问直接超类中被隐藏的成员变量
((<超类名>)<子类实例引用>).变量名 访问指定超类中被隐藏的成员变量
<超类名>.<变量名> 访问指定超类中被隐藏的类变量
若子类和父类里都有相同的名字定义的方法,但是实现不一致。覆盖的方法是按照子类中重定义的方法进行调用,而继承的方法直接调用父类的方法
覆盖 (重写)(Override):
1、方法名称要一样
2、返回值数据类型要一样
3、所使用的参数列表要一样,参数列表包括参数个数及每个参数的数据类型,不包括参数的变量名
4、访问修饰符只能越来越开放,不能越来越封闭
构造方法的继承:
创建子类对象时,父类的构造方法会被自动调用
若父类有很多个构造方法,可以在子类里显示指定用哪个构造方法
多态
多态可细分为重载与重写
相同点
重载与重写的相同点是两者均可在类中对方法名相同的方法进行重新定义
不同点
重载
一般用于类中的方法在使用时须接受不同参数的情况
重写
一般用于子类需要在不影响父类源码的基础上对所继承来的方法进行修改的情况
1、使用父类类型的引用只想子类的对象
2、该引用只能调用父类中定义的方法和变量
3、如果子类中重写(覆盖)了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法
4、变量不能被重写(覆盖),重写只针对方法,如果在子类中重写了父类的变量,编译时会报错
子类转成父类是可以的(隐式转换)
当调用一个方法的时候,不是看引用类型,而是看对象的实际类型。
转化原则
子类对象可以当作父类对象使用
父类对象不能当作子类对象使用
如果父类引用实际只想的是子类对象,那么该父类引用可以通过强制转化成子类对象使用
public class file {
public long size;
public String name;
public void info()
{
System.out.println("name : " + name + " size : " + size);
}
}
public class vediofile extends file{
public int duration;
public void play()
{
System.out.println("播放" + this.name);
}
public void stop()
{
System.out.println("停止" + this.name);
}
@Override
public void info() {
// TODO Auto-generated method stub
super.info();
System.out.println("time : " + duration);
}
}
public class HelloWorld {
public static void main(String[] args) {
vediofile v = new vediofile();
v.size = 20000;
v.name = "abc.mp4";
v.duration = 70;
file f = v;
f.info(); //调用的子类的info
}
}