JAVA学习笔记--组合与继承
JAVA一个很重要的功能就是代码的可复用性,代码复用可以大大提升编程效率。这里主要介绍两种代码复用方式:组合和继承。
一、组合
组合比较直观,只需在新的类中产生现有类的对象,新的类由现有类的对象组成,因而称之为组合。这种方法只是复用了代码的功能,而不是它的形式。
public class Combine{
public static void main(String[] args){
/* 以下两行代码即体现了组合 */
Combine1 com1 = new Combine1(); // 在新的类中创建现有类的对象
Combine1 com2 = new Combine1(100); /* 可以在新类中添加其他的代码 */
}
} class Combine1{
Combine1(){ // 构造方法
System.out.println("这是一个组合实例");
}
Combine1(int i){
System.out.println(i);
}
}
利用组合可以实现代码的复用,你可以通过组合利用一个现有类的代码,并为其添加一些新特性。
二、继承
继承按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码。继承是所有OOP语言不可缺少的组成部分,当然这也包括JAVA。在创建一个类时,总是在继承,这有可能是继承一个明确指明的类,也有可能是隐式继承JAVA的标准根类Object。继承关系通过关键字 extends 来实现,当声明一个类A继承自类B时,可以这样编写代码:
class A extends B{
}
其中,B称作A的父类或基类,A称作B的子类或导出类。
1)子类继承了父类中可访问的数据域和方法,还可以为其添加新的数据域和方法;
2)子类并不能访问父类的私有数据域,但可以通过公共的访问器来访问它;
3)继承是用来为 是关系(is-a) 建模的,但不是所有的是关系都要用继承来建模;
4)JAVA不支持多继承,一个JAVA类只能继承自一个父类,即单继承。JAVA提供接口(interface)来实现多继承。
5)子类不继承父类的构造方法。
子类不能继承父类的构造方法。当创建一个子类的对象时,该对象包含了一个父类的子对象,这个子对象与你直接用父类创建的对象是一样的,二者区别在于后者来自于外部,而前者被包装在子类的对象内部。对于父类子对象的正确初始化也很重要而且只有一种方法,那就是 在构造器中调用父类的构造器来执行初始化,子类的构造器会自动调用父类的默认构造器进行初始化的,但如果父类中定义了带参的构造器,那么需要手工调用父类的构造器,这时需要使用 super 关键字显式的调用父类的构造器,并配以适当的参数列表。调用父类的构造器必须是在子类构造器中要做到第一件事。下面是一个简单的例子:
class Shape{
/* 父类的私有数据成员,不能被继承 */
private int a = 10;
private int b = 20; Shape(int i){ // 构造器1
System.out.println("调用基类构造器1");
} Shape(int i,int j){ // 构造器2
System.out.println("调用基类构造器2");
} /* 父类的公有方法,可以被继承 */
public void get_a(){ // 通过公有方法访问父类的私有数据成员
System.out.println("a = " + a);
} public void get_b(){
System.out.println("b = " + b);
} public void set_a(int a){ // 通过公有方法修改父类的私有数据成员
this.a = a;
} public void set_b(int b){
this.b = b;
}
} public class Circle extends Shape{
/* 子类新增的数据成员 */
private int radius;
private double area; /* 构造方法 */
public Circle(){
super(1); // 调用基类构造方法1
get_a();
get_b();
} public Circle(int i){
super(1,2); // 调用基类构造方法2
set_a(100);
set_b(200);
get_a();
get_b();
get_area(2);
} /* 子类中新增的方法 */
public void get_radius(){
System.out.println("radius = " + radius);
} public void get_area(int i){
this.radius = i;
area = radius*radius*Math.PI;
System.out.println("area = " + area);
} public void set_radius(int i){
this.radius = i;
} public static void main(String[] args){
Circle circle = new Circle();
Circle circle1 = new Circle(1);
}
}
注:super关键字可以调用父类的构造器,而且必须放在导出类构造器的第一行,只能调用一次,super()和this()不能同存构造函数第一行。
JAVA学习笔记--组合与继承的更多相关文章
- java学习笔记6--类的继承、Object类
接着前面的学习: java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记 ...
- Java学习笔记:01面向对象-继承
01面向对象-继承 一.java中的数据类型 1.基本数据类型:四类 八种 byte(1) boolean(1) short(2) char(2) int(4) float(4) long(8) do ...
- Java学习笔记——封装、继承和多态
先说说封装: 用new 一条狗来举个例子: public class Dog { //私有化字段 private String name; private int age; //无参构造 Dog(){ ...
- java学习笔记7--抽象类与抽象方法
接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
- java学习笔记12--异常处理
java学习笔记系列: java学习笔记11--集合总结 java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 j ...
随机推荐
- 在Swift中使用AutoLayout-VFL(AutoLayout-VFL笔记)
1.背景 iOS开发这几年, UI布局工具从frame到Masonry到SnapKit, sb和xib的AutoLayout也用过, 但是代码版本的AutoLayout倒是没用过, 最近一年, 频频发 ...
- MySQL学习之路(一)——初涉MySQL。
MySQL学习之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版和企业版. 1 ...
- mysql千万级数据量根据索引优化查询速度
(一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...
- mac安装配置mysql
目录 mac安装配置mysql 1.mysql的安装 2.设置root用户的密码 3.分别执行一下命令 4.配置mysql环境变量 mac安装配置mysql 1.mysql的安装 安装过程十分简单 ...
- redis相关操作&基本命令使用
Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis是 NoSQL技术阵营中的一员,它 ...
- Redis笔记 -- make编译安装报错记录2则(一)
1.Redis的获取与安装,目前最新稳定版本为4.0.10 Redis: https://redis.io/download GitHub: https://github.com/antirez/ ...
- 总结2018&&展望2019
2019很激动,因为我加入了博客园这个大家庭,以后的技术文章都会在博客园记录,也希望可以结识更多的有趣朋友和共同理想的友人.第一篇文章从自我规划开始.2019 您好!!! 总结2018: 距离2018 ...
- 20155211 2016-2017-2 《Java程序设计》第十周学习总结
20155211 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输 在实际传输数据以前需要将域 ...
- 20155217 实验四 Android程序设计
20155217 实验四 Android程序设计 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号. R.java文件是定义该项目所有资源的 ...
- # 20155337 2016-2017-2 《Java程序设计》第五周学习总
20155337 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 •语法与继承架构 •使用try.catch •特点: 使用try.catch语法,J ...