java基础之继承(一)

虽然说java中的面向对象的概念不多,但是具体的细节还是值得大家学习研究,java中的继承实际上就是子类拥有父类所有的内容(除私有信息外),并对其进行扩展。下面是我的笔记,主要包含以下一些内容点:

  • 构造方法
  • 重写和重载
  • final关键字
  • new的背后(内存分析)
  • 理解方法调用

一、构造方法     正如我们所知道的,构造方法的方法名与类名相同,主要的作用是实现对实例对象的初始化工作,实际上每个子类的构造方法中的第一行默认是调用了父类的构造函数,而父类继续向上调用直至Object类,然后返回。

/*这是父类*/
public class Base {
    public Base(){
        System.out.println("i am the base");
    }
}
/*这是子类*/
public class Child extends Base {
    public Child(){
        //super();隐式调用父类默认无参构造器
        System.out.println("i am the child");
    }
}
/*执行程序*/
public class Test {
    public static void main(String[] args){
        Child c = new Child();      
    }
}
输出结果:
i am the base
i am the child

当然,super这个关键字还有第二个作用,显式调用父类方法(不只是构造方法,普通实例方法也是可以直接调用的)。

public class Base {
    //父类中有个sayHello方法
    public void sayHello(){
        System.out.println("hello base");
    }
}
public class Child extends Base {
    //子类通过super关键字显式调用
    public void show(){
        super.sayHello();
    }
}

那如果我们想要显式调用子类中的其他的构造方法该怎么办呢? 可以使用this 关键字

public class Child extends Base {
    private String name;
    private int age;
    private String address;
    //一个参数的构造方法
    public Child(String name){
        this.name = name;
    }
    //三个参数的构造方法
    public Child(String name,int age,String address){
        this(name);//显式调用其他构造方法
        this.age = age;
        this.address = address;
    }
}

为什么要这么做呢?因为不是每个实例对象都需要传所有的参数,例如,大家在注册qq账号时候,有些是必填的信息,有的是可选填的,这样不同的人在注册时就会调用不同的构造函数,这样调用参数多的构造方法就没必要再为每个变量赋值,可以使用this调用其他的构造方法,减轻代码的冗余程度。

二、重载和重写     下面说说方法的重载和重写的区别。首先大家需要了解什么是方法的签名,方法的名字和参数列表叫做方法的签名。方法的重载就是指两个或以上具有相同方法名但方法的参数存在某些差异的方法之间的这种关系叫做方法的重载。     所谓方法的参数列表的差异,主要是参数的类型差异和参数的个数差异。

1、public void sayHello(){}
2、public void say(){}
3、public void sayHello(String name){}
4、public void sayHello(int age){}
5、public void sayHello(String name,int age){}

如上所示,1和2肯定不会构成重载,构成重载的前提是具有相同的方法名,1和3和4和5构成函数重载,他们之间要么参数类型不同,要么参数个数不同。

    函数的重载可能和继承关系并不大,但方法的重写和继承关系密切。方法的重写就是指两个方法之间具有相同的签名,也就是两个方法一模一样,只是一个出现在父类中一个出现在子类中

public class Base {
    //父类中的sayHello方法
    public void sayHello(){
        System.out.println("hello base");
    }
}

public class Child extends Base {
    //子类中的sayHello方法
    public void sayHello(){
        System.out.println("hello child");
    }
}
public class Test {
    public static void main(String[] args){
        Base b = new Child();
        b.sayHello();
    }
}
输出结果:
hello child

本例中涉及多态相关知识,初学者不懂可以跳过,但是需要知道,本例中父类的sayHello方法和子类的sayHello方法是一模一样的,子类继承过来之后觉得不理想又将其重写,重写完之后子类中就相当于覆盖了父类的这个方法,每次调用时就直接调用了自己重写的方法,看不见父类的方法。     总结一下:方法的重载,方法与方法之间是不一样的,而方法的重写实际上是一种方法的覆盖,子类覆盖父类的方法使父类方法在子类中不可见(实际上是可以使用super显式调用的,本节暂时不讨论)。

三、final关键字     final关键字既可以修饰类也可以修饰方法,也能修饰变量,但是具有不同的意义。被final修饰的类表示为不可继承特性,不允许子类继承,也就是不让子类再对其进行扩展。例如,jdk中的String类就是被final修饰的,不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。     被final修饰的方法表示此方法在被子类继承之后是不允许重写的,例如有些方法不希望被子类重写修改就可以使用final修饰他,在java中常量也是使用final来修饰的,例如:public final String name;,此变量一旦被赋值就不能再改变其内容了。

未完。。。。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发之途

重拾Java(0)-基础知识点

2014
来自专栏Linyb极客之路

JAVA常用API整理

提供sin, cos, tan, exp, log, log10 等类方法,PI和E等类字段

584
来自专栏挖掘大数据

scala基础学习--scala教程

翻译自《big data analytics with spark》第二章Programming in Scala

1789
来自专栏水击三千

JavaScript操作符(一元操作符、位操作符)

JavaScript操作符包括算术操作符、位操作符、关系操作符和相等操作符。只能操作一个值的操作符叫做一元操作符。 递增和递减操作符 递增和递减操作符有两个版本...

2816
来自专栏CaiRui

Python之运算符以及基本数据类型的object

一、运算符 1、算术运算符 %   求余运算 **    幂-返回x的y次幂 //    取整数-返回商的整数部分,例:9//2输出结果是4 2、比较运算符 =...

4596
来自专栏Create Sun

基础拾遗------泛型详解

前言:   泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。类型参数使得设计类和方...

3429
来自专栏章鱼的慢慢技术路

C语言中的运算和运算符

1094
来自专栏老马说编程

(54) 剖析Collections - 设计模式 / 计算机程序的思维逻辑

上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类。...

2169
来自专栏Brian

Scala Turtuial-容器(集合)类型

集合 scala的集合分为可变集合和不可变集合,其中可变集合的增删改查都是作用于它本身;而不可变集合的增删改操作返回的是一个新的集合,原不可变集合保持不变。函数...

2724
来自专栏郭耀华‘s Blog

Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap

Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和v...

2717

扫码关注云+社区