虽然说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;,此变量一旦被赋值就不能再改变其内容了。

未完。。。。

转载于:https://www.cnblogs.com/yangming1996/p/6415336.html

java基础之继承(一)相关推荐

  1. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础 - 进阶继承,抽象类,接口 进阶继承 class Stu {int age = 1; } class Stuo extends Stu {int agee = 2; } class ...

  2. Java基础篇--继承(inherit),多态(Polymorphism)

    Java基础篇--继承(inherit),多态(Polymorphism) 1. 继承概述 1.1 什么是继承 1.2 为什么要使用继承 1.3 继承的特点 1.4 继承的优点 2. 组合设计模式 2 ...

  3. Java基础:继承、多态、抽象、接口

    第一讲    继承 一.继承概述 1.多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 2.通过extends关键字可以实现类与类的 ...

  4. Java 基础(继承)

    继承 基础 1. 继承的特点 2. super关键字 3. 继承中变量访问特点(就近原则) 4. 继承中成员方法访问特点 5. 继承中构造访问特点 为什么子类中所有构造方法默认都会访问父类无参构造方法 ...

  5. java基础:继承的使用

    一.继承的使用 1.什么是继承 2.继承的设计规范 3.继承的内存原理 test.java package Test;public class test {public static void mai ...

  6. Java基础08 继承

    继承(inheritance)是面向对象的重要概念.继承是除组合(composition)之外,提高代码重复可用性(reusibility)的另一种重要方式.我们在组合(composition)中看到 ...

  7. 11. Java基础之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  8. java基础 通过继承Thread类和实现Runnable接口创建线程

    java 创建线程 Java中,线程也是一种对象,但不是任何对象都可以成为线程. 只有实现了Runnable接口或继承了Thread类的对象才能成为线程. 继承Thread类 //格式: class ...

  9. Java基础复习——继承机制

    一.写在前面 1.基本作用 代码复用,更重要的就是有了继承机制后才会有后面的"方法重写"和"多态机制". 2.语法格式 //Student类继承了Person类 ...

  10. java基础之继承补充和抽象类

    继承的补充和抽象类 1.子类和父类中出现了同名的变量该如何访问?(super) 使用super关键字可以直接指定父类空间 格式: super.成员变量 访问成员变量的时候特点: 如果所指定的空间找不到 ...

最新文章

  1. python学习笔记(开课介绍1)
  2. shell脚本编程之控制脚本
  3. [改善Java代码]养成良好习惯,显式声明UID
  4. Let's Fork | 11 款 Github 最新「机器学习」开源项目
  5. DHCP_SNOOPING_ DAI_IPSG实验
  6. php字符串类型详解,php数字类型之字符串类型详解
  7. Pandas知识点-equals()与==的区别
  8. 【Elasticsearch】用ElasticSearch实现基于标签的兴趣推荐
  9. iis5.1配置php运行环境
  10. resiprocate之message
  11. 我和一位快递小哥的故事
  12. IT从业人员的10个专业论坛
  13. 推荐一款在线文件对比工具
  14. 华大单片机HC32L130X
  15. 那个叫鲁迅的人终于从教科书里滚蛋了
  16. Unity 颜色板|调色板|无级变色功能
  17. cobar mysql5.6_Cobar init error
  18. 放射学中基于影像组学和人工智能预测癌症预后
  19. python关于递归求组合与组合数-通过阶乘, fibonacci加深对递归的理解
  20. Delphi学习笔记:常用组件

热门文章

  1. MySQL存储过程(四)——存储过程循环流控语句
  2. 华三H3c 交换机 vlan Hybird端口配置
  3. HDOJ--2066--一个人的旅行
  4. IdleHandler,页面启动优化神器
  5. 撸一款Flutter版『微信』
  6. CoreData手动创建托管对象子类时报错
  7. cin.ignore()函数的用法
  8. saltstack minion端状态监控程序
  9. 11.2.0.3 MRP进程异常终止 ORA-00600 krr_assemble_cv_3
  10. 如何做好一个流量站?