Java基础 【继承,引用类型使用】
第一章 继承
1.1 定义
? 继承就是子类继承父类的属性和行为,使得子类对象可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为
1.2 继承的好处
1. 提高**代码的复用性**(减少代码冗余,相同代码重复利用)。
2. 使类与类之间产生了关系。
1.3 子类不能继承的内容
1.3.1 引入
并不是父类的所有内容都可以给子类继承的:
子类不能继承父类的构造器,因为子类有自己的构造器。
值得注意的是子类可以继承父类的私有成员(成员变量,方法),只是子类无法直接访问而已,可以通过getter/setter方法访问父类的private成员变量。
1.3.2 演示代码
public class Demo03 {
public static void main(String[] args) {
Zi z = new Zi();
System.out.println(z.num1);
System.out.println(z.getNum2());
z.show1();
}
}
class Fu {
public int num1 = 10;
private int num2 = 20;
public void show1() {
System.out.println("show1");
}
private void show2() {
System.out.println("show2");
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
}
class Zi extends Fu {
}
小贴士:父类中的成员变量是非私有的,子类中可以直接访问。若父类中的成员变量私有了,子类是不能直接访问的。通常编码时,我们遵循封装的原则,使用private修饰成员变量,那么如何访问父类的私有成员变量呢?对!可以在父类中提供公共的getXxx()方法和setXxx()方法。
1.4 方法重写
1.4.1 概念
方法重写 :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
1.4.2使用场景与案例
发生在子父类之间的关系。 子类继承了父类的方法,但是子类觉得父类的这方法不足以满足自己的需求,子类重新写了一个与父类同名的方法,以便覆盖父类的该方 法。
例如:我们定义了一个动物类代码如下:
public class Animal {
public void run(){
System.out.println("动物跑的很快!");
}
public void cry(){
System.out.println("动物都可以叫~~~");
}
}
然后定义一个猫类,猫可能认为父类cry()方法不能满足自己的需求
代码如下:
public class Cat extends Animal {
public void cry(){
System.out.println("我们一起学猫叫,喵喵喵!喵的非常好听!");
}
}
public class Test {
public static void main(String[] args) {
Cat ddm = new Cat();
ddm.run();
ddm.cry();
}
}
1.4.3 @Override重写注解
-
@Override:注解,重写注解校验! -
这个注解标记的方法,就说明这个方法必须是重写父类的方法,否则编译阶段报错。 -
建议重写都加上这个注解,一方面可以提高代码的可读性,一方面可以防止重写出错! 加上后的子类代码形式如下: public class Cat extends Animal {
@Override
public void cry(){
System.out.println("我们一起学猫叫,喵喵喵!喵的非常好听!");
}
}
1.4.4 注意事项
- 方法重写是发生在子父类之间的关系。
- 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
- 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。
1.5 this与super
-
子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。 -
super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。 -
super(…)和this(…)是根据参数去确定调用父类哪个构造器的。 -
super(…)可以调用父类构造器初始化继承自父类的成员变量的数据。 -
this(…)可以调用本类中的其他构造器。
第二章 引用类型使用总结
实际的开发中,引用类型的使用非常重要,也是非常普遍的。我们可以在理解基本类型的使用方式基础上,进一步去掌握引用类型的使用方式。基本类型可以作为成员变量、作为方法的参数、作为方法的返回值,那么当然引用类型也是可以的。在这我们使用两个例子 , 来学习一下。
2.1 引用类型作为方法参数和返回值
public class Person{
public void eat(){
System.out.println("吃饭");
}
}
public class Test{
public static void main(String[] args){
method(new Person());
Person p = createPerson();
}
pubic static void method(Person p){
p.eat();
}
public static Person createPerson(){
return new Person();
}
}
2.2 引用类型作为成员变量
? 我们每个人(Person)都有一个身份证(IDCard) , 为了表示这种关系 , 就需要在Person中定义一个IDCard的成员变量。定义Person类时,代码如下:
class Person {
String name;
int age;
}
? 使用使用String 类型表示姓名 , int 类型表示年龄。其实,String 本身就是引用类型,我们往往忽略了它是引用类型。如果我们继续丰富这个类的定义,给Person 增加身份证号 , 身份证签发机关等属性,我们将如何编写呢?这时候就需要编写一个IDCard类了
定义IDCard(身份证)类,添加身份证号 , 签发地等属性:
class IDCard {
String idNum;
String authority;
}
修改Person类:
public class Person {
String name;
int age;
IDCard idCard;
public IDCard getIdCard() {
return idCard;
}
public void setIdCard(IDCard idCard) {
this.idCard = idCard;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", idCard=" + idCard +
'}';
}
}
测试类:
public class TestDemo {
public static void main(String[] args) {
IDCard idCard = new IDCard();
idCard.setIdNum("110113201606066666");
idCard.setAuthority("北京市顺义区公安局");
Person p = new Person();
p.setName("小顺子");
p.setAge(2);
p.setIdCard(idCard);
System.out.println(p);
}
}
输出结果:
Person{name='小顺子', age=2, idCard=IDCard{idNum='110113201606066666', authority='北京市顺义区公安局'}}
类作为成员变量时,对它进行赋值的操作,实际上,是赋给它该类的一个对象。同理 , 接口也是如此 , 例如我们笔记本案例中使用usb设备。在此我们只是通过小例子 , 让大家熟识下引用类型的用法 , 后续在咱们的就业班学习中 , 这种方式会使用的很多。
|