《复合(composition)优先于继承》

继承打破了封装性(violates encapsulation)。superclass’s的变化可能会使得subclass遭受破坏。所以子类要跟着父类更新。

比如一个继承HashSet的类,

public class InstrumentedHashSet<E> extends HashSet<E> {private int addCount = 0;public InstrumentedHashSet() {}public InstrumentedHashSet(int initCap, float loadFactor) {super(initCap, loadFactor);}@Overridepublic boolean add(E e) {addCount ++;return super.add(e);}@Overridepublic boolean addAll(Collection<? extends E> c) {addCount += c.size();return super.addAll(c);}public int getAddCount() {return addCount;}
}
复制代码

如果调用addAll方法,传入一个size = 3 的List,

InstrumentedHashSet<String> s =
new InstrumentedHashSet<String>();
s.addAll(Arrays.asList("Snap", "Crackle", "Pop"));
复制代码

然后调用getAddCount,得到的是6而不是3。 解释:

在HashSet内部,addAll方法是基于add方法来实现的,即使HashSet的文档中并没有说明这一细节,这也是合理的。因此InstrumentedHashSet中的addAll方法首先把addCount增加了3,然后利用super.addAll()调用HashSet的addAll实现,在该实现中又调用了被InstrumentedHashSet覆盖了的add方法,每个元素调用一次,这三次又分别给addCount增加了1,所以总共增加了6

执行顺序:子类addAll-->父类addAll-->子类add

正确姿势:使用复合,wrapper class

//Wrapper class - use composition in place of inheritance
import java.util.*;public class InstrumentedSet<E> extends ForwardingSet<E> {private int addCount = 0;public InstrumentedSet(Set<E> s) {super(s);}@Override public boolean add(E e) {addCount++;return super.add(e);}@Override public boolean addAll(Collection<? extends E> c) {addCount += c.size();return super.addAll(c);}public int getAddCount() {return addCount;}public static void main(String[] args) {InstrumentedSet<String> s =new InstrumentedSet<String>(new HashSet<String>());s.addAll(Arrays.asList("Snap", "Crackle", "Pop"));    System.out.println(s.getAddCount());}
}复制代码

//Reusable forwarding class

import java.util.*;public class ForwardingSet<E> implements Set<E> {private final Set<E> s;public ForwardingSet(Set<E> s) { this.s = s; }public void clear()               { s.clear();            }public boolean contains(Object o) { return s.contains(o); }public boolean isEmpty()          { return s.isEmpty();   }public int size()                 { return s.size();      }public Iterator<E> iterator()     { return s.iterator();  }public boolean add(E e)           { return s.add(e);      }public boolean remove(Object o)   { return s.remove(o);   }public boolean containsAll(Collection<?> c){ return s.containsAll(c); }public boolean addAll(Collection<? extends E> c){ return s.addAll(c);      }public boolean removeAll(Collection<?> c){ return s.removeAll(c);   }public boolean retainAll(Collection<?> c){ return s.retainAll(c);   }public Object[] toArray()          { return s.toArray();  }public <T> T[] toArray(T[] a)      { return s.toArray(a); }@Override public boolean equals(Object o){ return s.equals(o);  }@Override public int hashCode()    { return s.hashCode(); }@Override public String toString() { return s.toString(); }
}复制代码

这样的话执行顺序是: InstrumentedSet的addAll-->ForwardingSet的addAll--->Set的addAll--->ForwardingSet的add---> Set的add
最终都会指向Set,不会再调用InstrumentedSet的addAll。所以s.getAddCount结果是3. 不过这个过程是我猜的,我没有debug跟一下,有空需要走一遍验证一下。


另外不安全的地方是父类的方法可能改变。

如果不去override函数,会安全一点。但有种情况,如果父类更新了一个签名相同返回值不同的方法,子类就无法编译通过。

使用继承的时候,一定要问自己子类父类是不是is-A的关系,是不是每个子类都是父类。

reference: http://www.jianshu.com/p/4fd0345054cc http://blog.csdn.net/democreen/article/details/50158485

转载于:https://juejin.im/post/5a3132fc51882578da0dde6e

Item 16  Favor composition over inheritance

相关文章

  1. Java入门第51课——给Cell类添加构造方法

    问题 为Cell类定义有参构造方法,并在构造方法中初始化Cell的行和列;然后创建一个坐标为(0,4)的格子,并打印信息,效果如图所示: 上图中蓝色圈中的"*"号表示所创建的格子。 方案 在方法中可以通过this关键字表示"调用该方法的那个对象",因此,可以使用t…...

    2023/3/28 16:02:29
  2. 百钱买百鸡 假设公鸡5文钱一只 母鸡三文钱一只 小鸡1文钱三只,要求用100文钱 , 如何买到100只鸡

    java百钱买百鸡 代码如下&#xff1a; package day03; /*** 百钱买百鸡 假设公鸡5文钱一只 母鸡三文钱一只 小鸡1文钱三只* 要求用100文钱 , 如何买到100只鸡* author Amanda**/ public class chicken {public static void main(String[] args){/*方法一&#xff1a;int x…...

    2023/3/28 16:02:29
  3. Java入门第52课——给Cell类添加重载的构造方法

    问题 给Cell类添加重载的构造方法,详细要求如下: 1.为Cell类定义默认构造方法,使用该构造方法创建对象,并打印显示。 2.继续为Cell类定义构造方法,要求该构造方法接收一个Cell类型的参数。使用该构造方法,创建一个位置为(0,4)的格子,并打印显示。 方案 可以对一个类定义…...

    2023/3/28 16:02:28
  4. 猜数字

    猜设置一个猜数字的游戏程序 &#xff0c; 系统会随机产生一个1-10的数字 &#xff0c; 用户录入数字 &#xff0c; 如果数字正确 &#xff0c; 获得奖励&#xff0c; 如果用户录入的数字不正确 &#xff0c; 则要输出录入的是小于系统产生的数字 还是大于 代码如下&#xff1…...

    2023/3/28 16:02:27
  5. Java入门第53课——俄罗斯方块项目中的T类和J类

    问题 在Tetris游戏中,游戏场地由10列20行个正方形格子构成,如图所示,每个方块由四个格子组成,绘制在场地中,如图所示中的红色方块。 4个小型正方形格子组成的规则图形(Tetromino),共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名,各个图形形状如下图所示。 之前…...

    2023/3/28 16:02:27
  6. 使用if语句对四个整数排序及三目运算符对三个整数的排序

    使用if语句对四个整数排序及三目运算符对三个整数的排序 代码在最后 三目运算符 语法格式 [x > y ? x : y] 布尔值 ? 值1: 值2; 会返回一个结果,结果是 值1 或 值2 , 值1 和 值2 的类型可以不同 运算规则&#xff1a;先确定布尔值是真还是假 &#xff0c; 是真整个表达…...

    2023/3/28 16:02:26
  7. 鸡肋的灭蚊灯

    夏天蚊子是真的烦人。 早上起床&#xff0c;一身的包。 我跑去灭蚊灯里看&#xff0c;发现一只蚊子都没抓到。。。 以前家里都是用传统的那种蚊香&#xff0c;烟子很大的那种&#xff0c;但是家里有孕妇&#xff0c;这种蚊香对人体有害&#xff0c;就在网上搜了一下对人体无…...

    2023/3/28 16:02:26
  8. 输入成绩,判断成绩等级IfSwitch

    输入成绩&#xff0c;判断成绩等级 if & switch if语句判断方法&#xff1a; import java.util.Scanner;public class ScoreIf {public static void main(String[] args){Scanner sc new Scanner(System.in);System.out.println("请输入成绩");int score sc.…...

    2023/3/28 16:02:25
  9. 底部TabLayout不显示

    如图&#xff0c;tabLayout结合viewPager结合使用后&#xff0c;tabLayout不显示。 网上搜了下&#xff0c;说是setupWithViewPager的设置顺序导致的&#xff0c;这一点其实我也想到了&#xff0c;可顺序调整后底部tab还是不显示。 看了下预览视图&#xff0c;发现tablayout被…...

    2023/3/28 16:02:25
  10. 产生随机数的方法

    产生随机数的方法 package day02; /*** 如何獲取隨機數* author Amanda* java中有龐大的類庫&#xff0c;其中有個數學類&#xff0c;Math類&#xff0c;位於java.lang包&#xff1b;這是Java核心包&#xff1b;* 規定&#xff1a;使用核心包的類&#xff0c;不需要導包 …...

    2023/3/28 16:02:24
  11. Java入门第54课——方法和数组作业

    1.请描述下列代码的运行结果 public class ExerciseTest{public static void main(String[] args){ExerciseTest fnew ExerciseTest();System.out.println(f.add("4","5"));}public int add(int x,int y){return xy;}public String add(String x,String y)…...

    2023/3/28 16:02:24
  12. 设计编程摇色子的游戏 , 有三个色子可以摇 ; 分别用 if 和 switch 语句实现 总体点数为 15及以下没奖励 16 三等奖 17 二等奖 18 一等奖

    设计编程摇色子的游戏 , 有三个色子可以摇 ; 分别用 if 和 switch 语句 实现总体点数为 15及以下没奖励 16 三等奖 17 二等奖 18 一等奖 if语句实现 import java.util.Scanner;/*** 设计编程摇色子的游戏 , 有三个色子可以摇 ; 分别用 if 和 switch 语句实现总体点数为 15及…...

    2023/3/28 16:02:23
  13. Java入门第55课——对象内存管理

    1.1 对象内存管理 1.1.1 对象内存管理 编译好的Java程序需要运行在JVM中 程序,无论代码还是数据,都需要存储在内存中。JVM为Java程序提供并管理所需要的内存空间。 JVM内存分为"堆"、"栈"和"方法区"三个区域,分别用于存储不同的数据。 1.…...

    2023/3/28 16:02:23
  14. 编程一个java程序 可以对键盘录入的字节型数据 进行10进制到二进制表示形式的转换 (后期使用循环进行优化) nextByte(); 可以录入字节型数据

    编程一个java程序 可以对键盘录入的字节型数据 进行10进制到二进制表示形式的转换 (后期使用循环进行优化) nextByte(); 可以录入字节型数据 思想&#xff1a;byte b 23; b & 1; b >> 1 & 1 b >> 2 & 1 b的第一位数和1 与(&) &#xff0c;它为1则…...

    2023/3/28 16:02:22
  15. Java入门第56课——对象内存管理作业

    1.简述JVM垃圾回收机制 2.Java程序是否会出现内存泄漏 3.JVM如何管理内存&#xff0c;分为几个部分&#xff1f;分别有什么用途&#xff1f;说出下面代码的内存实现原理&#xff1a; Foo foonew Foo(); foo.f(); 扫码关注我吧&#xff1a;...

    2023/3/28 16:02:22
  16. 对整数进行分离 , 比如把 12345 拆分成 1 ,2 ,3 ,4,5

    对整数进行分离 &#xff0c; 比如把 12345 拆分成 1 &#xff0c;2 &#xff0c;3 &#xff0c;4&#xff0c;5 public class Apart {/*** 对整数进行分离 &#xff0c; 比如把 12345 拆分成 1 &#xff0c;2 &#xff0c;3 &#xff0c;4&#xff0c;5*/public static void…...

    2023/3/28 16:02:21
  17. Java入门第57课——继承

    1.1 继承 1.1.1 泛化的过程 1.1.2 extends关键字 通过extends关键字可以实现类的继承 子类(Sub class)可以继承(Super class)的成员变量及成员方法,同时也可以定义自己的成员变量和成员方法; Java语言不支持多重继承,一个类只能继承一个父类,但一个父类可以有多个子类…...

    2023/3/28 16:02:21
  18. Java入门第58课——构建Tetromino类、重构T和J类

    问题 分析案例“俄罗斯方块项目中的T类和J类”中的T类和J类,会发现存在大量的重复代码,比如,cells属性,print方法、drop方法、moveLeft方法、moveRight方法,这四个方法在各个类中的实现都是相同的。因此,本案例要求使用继承的方式,构建T类和J类父类Tetromino类,重构T类…...

    2023/3/28 16:02:20
  19. Java打印各种形状 心形 菱形 三角形 圆形

    Java打印各种形状 心形 菱形 三角形 圆形 public class TestPrint {/*** 打印*号*/public static void main(String[] args) {// 正方体System.out.println("\n打印正方形-----------------------------\n");for (int i 0; i < 5; i) {for (int j 0; j < 5; …...

    2023/3/28 16:02:19
  20. 数组声明初始化遍历操作

    数组&声明初始化&遍历&操作 思维导图&#xff1a; 一维数组 思维导图&#xff1a; 概念&#xff1a;数组具有连续内存位置的引用数据类型&#xff08;对象 实际存储在堆中&#xff09;&#xff0c;由0个1个或多个具有相同类型、相同名称&#xff0c;不同索引的…...

    2023/3/28 16:02:17
  21. 说说IT培训

    本人几年前在某上市培训机构做了1年多的培训讲师&#xff0c;很多同学问我是培训好还是自学好&#xff0c;我今天就来给大家详细说说。 先来给大家说说培训的模式&#xff0c;第一种是面授&#xff0c;第二种是o2o线上线下。面授大家都懂&#xff0c;就是一个老师在现场讲课。…...

    2023/3/28 16:02:17
  22. 数组的排序冒泡排序选择排序

    数组的排序&冒泡排序&选择排序 思维导图&#xff1a; 排序算法介绍 常见的算法有选择排序、冒泡排序、快速排序、归并排序、希尔排序等&#xff0c;我们需要根据实际情况&#xff0c;择优选择合适的算法 排序算法的稳定性 排序算法有稳定排序也有不稳定排序 **稳…...

    2023/3/28 16:02:16
  23. Java入门第59课——方法重写规则

    问题 在TetrominoT和TetrominoJ类中重写父类Tetromino的print方法,并进行测试,控制台输出结果如下所示: ---------打印T型---------i am a T(0,4),(0,5),(0,6),(1,5)- - - - * * * - - -- - - - - * - - - -- - - - - - - - - -- - - - - - - - - -- - - - - - - - - -- - -…...

    2023/3/28 16:02:16
  24. Arrays工具类

    Arrays工具类 介绍&#xff1a; 专家提供的&#xff0c;专门用来操作数组的工具类&#xff0c;这个类中很多方法可以帮助我们操作数组&#xff1b; 它位于java.util包下&#xff0c;使用时要import导包&#xff0c;它的方法都是静态的&#xff0c;可以用类名.方法名 这个格式调…...

    2023/3/28 16:02:15
  25. Java入门第60课——继承课后作业

    1.指出下面代码的编译错误,并说明原因 //哺乳动物public class Mammals{}//鸟类public class Birds{}//蝙蝠public class Bat extends Mammals,Birds{} 2.说出下面代码的输出结果,并解释原因 public class Sub extends Base{String color;public Sub(double size,String nam…...

    2023/3/28 16:02:14
  26. Java入门第61课——访问控制

    访问控制符有4种,初学者需要牢记四者间的区别。 概要:1.1包的概念 1.2 访问控制修饰符 博主点评 1.1 包的概念 1.1.1 package语句 定义类时需要制定类的名称,但如果仅仅将类名作为类的唯一标识,则不可避免的出现命名冲突的问题,这会给组件复用以及团队间的合作造成很大的…...

    2023/3/28 16:02:13
  27. Java入门第62课——访问控制课后作业

    1.关于package和import语句&#xff0c;下面说法错误的是&#xff1a; A.package提供了一种命名机制&#xff0c;用于管理类名空间 B.定义类时&#xff0c;除了定义类的名称以外&#xff0c;必须要指定一个包名 C.import语句用于导入所需要的类 D.同时使用不同包中相同类名的类…...

    2023/3/28 16:02:12
  28. 海滩上有一堆桃子,五只猴子来分。 第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。 第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走

    海滩上有一堆桃子&#xff0c;五只猴子来分。 第一只猴子把这堆桃子凭据分为五份&#xff0c;多了一个&#xff0c;这只猴子把多的一个扔入海中&#xff0c;拿走了一份。 第二只猴子把剩下的桃子又平均分成五份&#xff0c;又多了一个&#xff0c;它同样把多的一个扔入海中&…...

    2023/3/28 16:02:11
  29. Java入门第63课——static和final

    在教大家写的第一个Java程序HelloWorld中,很多同学问static是什么意思,本节课终于讲到了。 概要 1.1 static关键字 1.1.1 static修饰成员变量 1.1.2 static修饰成员方法 1.1.3 static块 1.2 final关键字 1.2.1 final修饰变量 1.2.2 final修饰方法 1.2.3 final修饰类 …...

    2023/3/28 16:02:10
  30. 数据库连接池报错com.alibaba.druid.pool.DruidDataSource error

    com.alibaba.druid.pool.DruidDataSource error 我的源码如下: package com.hnxy.utils;import com.alibaba.druid.pool.DruidDataSource; //数据库连接的工具类 提供连接池的数据源对象的获取 public class JDBCUtil {private static DruidDataSource ds new DruidDataSour…...

    2023/3/28 16:02:10

最新文章

  1. Java入门第51课——给Cell类添加构造方法

    问题 为Cell类定义有参构造方法,并在构造方法中初始化Cell的行和列;然后创建一个坐标为(0,4)的格子,并打印信息,效果如图所示: 上图中蓝色圈中的"*"号表示所创建的格子。 方案 在方法中可以通过this关键字表示"调用该方法的那个对象",因此,可以使用t…...

    2023/3/28 16:02:29
  2. 百钱买百鸡 假设公鸡5文钱一只 母鸡三文钱一只 小鸡1文钱三只,要求用100文钱 , 如何买到100只鸡

    java百钱买百鸡 代码如下&#xff1a; package day03; /*** 百钱买百鸡 假设公鸡5文钱一只 母鸡三文钱一只 小鸡1文钱三只* 要求用100文钱 , 如何买到100只鸡* author Amanda**/ public class chicken {public static void main(String[] args){/*方法一&#xff1a;int x…...

    2023/3/28 16:02:29
  3. Java入门第52课——给Cell类添加重载的构造方法

    问题 给Cell类添加重载的构造方法,详细要求如下: 1.为Cell类定义默认构造方法,使用该构造方法创建对象,并打印显示。 2.继续为Cell类定义构造方法,要求该构造方法接收一个Cell类型的参数。使用该构造方法,创建一个位置为(0,4)的格子,并打印显示。 方案 可以对一个类定义…...

    2023/3/28 16:02:28
  4. 猜数字

    猜设置一个猜数字的游戏程序 &#xff0c; 系统会随机产生一个1-10的数字 &#xff0c; 用户录入数字 &#xff0c; 如果数字正确 &#xff0c; 获得奖励&#xff0c; 如果用户录入的数字不正确 &#xff0c; 则要输出录入的是小于系统产生的数字 还是大于 代码如下&#xff1…...

    2023/3/28 16:02:27
  5. Java入门第53课——俄罗斯方块项目中的T类和J类

    问题 在Tetris游戏中,游戏场地由10列20行个正方形格子构成,如图所示,每个方块由四个格子组成,绘制在场地中,如图所示中的红色方块。 4个小型正方形格子组成的规则图形(Tetromino),共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名,各个图形形状如下图所示。 之前…...

    2023/3/28 16:02:27
  6. 使用if语句对四个整数排序及三目运算符对三个整数的排序

    使用if语句对四个整数排序及三目运算符对三个整数的排序 代码在最后 三目运算符 语法格式 [x > y ? x : y] 布尔值 ? 值1: 值2; 会返回一个结果,结果是 值1 或 值2 , 值1 和 值2 的类型可以不同 运算规则&#xff1a;先确定布尔值是真还是假 &#xff0c; 是真整个表达…...

    2023/3/28 16:02:26
  7. 鸡肋的灭蚊灯

    夏天蚊子是真的烦人。 早上起床&#xff0c;一身的包。 我跑去灭蚊灯里看&#xff0c;发现一只蚊子都没抓到。。。 以前家里都是用传统的那种蚊香&#xff0c;烟子很大的那种&#xff0c;但是家里有孕妇&#xff0c;这种蚊香对人体有害&#xff0c;就在网上搜了一下对人体无…...

    2023/3/28 16:02:26
  8. 输入成绩,判断成绩等级IfSwitch

    输入成绩&#xff0c;判断成绩等级 if & switch if语句判断方法&#xff1a; import java.util.Scanner;public class ScoreIf {public static void main(String[] args){Scanner sc new Scanner(System.in);System.out.println("请输入成绩");int score sc.…...

    2023/3/28 16:02:25
  9. 底部TabLayout不显示

    如图&#xff0c;tabLayout结合viewPager结合使用后&#xff0c;tabLayout不显示。 网上搜了下&#xff0c;说是setupWithViewPager的设置顺序导致的&#xff0c;这一点其实我也想到了&#xff0c;可顺序调整后底部tab还是不显示。 看了下预览视图&#xff0c;发现tablayout被…...

    2023/3/28 16:02:25
  10. 产生随机数的方法

    产生随机数的方法 package day02; /*** 如何獲取隨機數* author Amanda* java中有龐大的類庫&#xff0c;其中有個數學類&#xff0c;Math類&#xff0c;位於java.lang包&#xff1b;這是Java核心包&#xff1b;* 規定&#xff1a;使用核心包的類&#xff0c;不需要導包 …...

    2023/3/28 16:02:24
  11. Java入门第54课——方法和数组作业

    1.请描述下列代码的运行结果 public class ExerciseTest{public static void main(String[] args){ExerciseTest fnew ExerciseTest();System.out.println(f.add("4","5"));}public int add(int x,int y){return xy;}public String add(String x,String y)…...

    2023/3/28 16:02:24
  12. 设计编程摇色子的游戏 , 有三个色子可以摇 ; 分别用 if 和 switch 语句实现 总体点数为 15及以下没奖励 16 三等奖 17 二等奖 18 一等奖

    设计编程摇色子的游戏 , 有三个色子可以摇 ; 分别用 if 和 switch 语句 实现总体点数为 15及以下没奖励 16 三等奖 17 二等奖 18 一等奖 if语句实现 import java.util.Scanner;/*** 设计编程摇色子的游戏 , 有三个色子可以摇 ; 分别用 if 和 switch 语句实现总体点数为 15及…...

    2023/3/28 16:02:23
  13. Java入门第55课——对象内存管理

    1.1 对象内存管理 1.1.1 对象内存管理 编译好的Java程序需要运行在JVM中 程序,无论代码还是数据,都需要存储在内存中。JVM为Java程序提供并管理所需要的内存空间。 JVM内存分为"堆"、"栈"和"方法区"三个区域,分别用于存储不同的数据。 1.…...

    2023/3/28 16:02:23
  14. 编程一个java程序 可以对键盘录入的字节型数据 进行10进制到二进制表示形式的转换 (后期使用循环进行优化) nextByte(); 可以录入字节型数据

    编程一个java程序 可以对键盘录入的字节型数据 进行10进制到二进制表示形式的转换 (后期使用循环进行优化) nextByte(); 可以录入字节型数据 思想&#xff1a;byte b 23; b & 1; b >> 1 & 1 b >> 2 & 1 b的第一位数和1 与(&) &#xff0c;它为1则…...

    2023/3/28 16:02:22
  15. Java入门第56课——对象内存管理作业

    1.简述JVM垃圾回收机制 2.Java程序是否会出现内存泄漏 3.JVM如何管理内存&#xff0c;分为几个部分&#xff1f;分别有什么用途&#xff1f;说出下面代码的内存实现原理&#xff1a; Foo foonew Foo(); foo.f(); 扫码关注我吧&#xff1a;...

    2023/3/28 16:02:22
  16. 对整数进行分离 , 比如把 12345 拆分成 1 ,2 ,3 ,4,5

    对整数进行分离 &#xff0c; 比如把 12345 拆分成 1 &#xff0c;2 &#xff0c;3 &#xff0c;4&#xff0c;5 public class Apart {/*** 对整数进行分离 &#xff0c; 比如把 12345 拆分成 1 &#xff0c;2 &#xff0c;3 &#xff0c;4&#xff0c;5*/public static void…...

    2023/3/28 16:02:21
  17. Java入门第57课——继承

    1.1 继承 1.1.1 泛化的过程 1.1.2 extends关键字 通过extends关键字可以实现类的继承 子类(Sub class)可以继承(Super class)的成员变量及成员方法,同时也可以定义自己的成员变量和成员方法; Java语言不支持多重继承,一个类只能继承一个父类,但一个父类可以有多个子类…...

    2023/3/28 16:02:21
  18. Java入门第58课——构建Tetromino类、重构T和J类

    问题 分析案例“俄罗斯方块项目中的T类和J类”中的T类和J类,会发现存在大量的重复代码,比如,cells属性,print方法、drop方法、moveLeft方法、moveRight方法,这四个方法在各个类中的实现都是相同的。因此,本案例要求使用继承的方式,构建T类和J类父类Tetromino类,重构T类…...

    2023/3/28 16:02:20
  19. Java打印各种形状 心形 菱形 三角形 圆形

    Java打印各种形状 心形 菱形 三角形 圆形 public class TestPrint {/*** 打印*号*/public static void main(String[] args) {// 正方体System.out.println("\n打印正方形-----------------------------\n");for (int i 0; i < 5; i) {for (int j 0; j < 5; …...

    2023/3/28 16:02:19
  20. 数组声明初始化遍历操作

    数组&声明初始化&遍历&操作 思维导图&#xff1a; 一维数组 思维导图&#xff1a; 概念&#xff1a;数组具有连续内存位置的引用数据类型&#xff08;对象 实际存储在堆中&#xff09;&#xff0c;由0个1个或多个具有相同类型、相同名称&#xff0c;不同索引的…...

    2023/3/28 16:02:17
  21. 说说IT培训

    本人几年前在某上市培训机构做了1年多的培训讲师&#xff0c;很多同学问我是培训好还是自学好&#xff0c;我今天就来给大家详细说说。 先来给大家说说培训的模式&#xff0c;第一种是面授&#xff0c;第二种是o2o线上线下。面授大家都懂&#xff0c;就是一个老师在现场讲课。…...

    2023/3/28 16:02:17
  22. 数组的排序冒泡排序选择排序

    数组的排序&冒泡排序&选择排序 思维导图&#xff1a; 排序算法介绍 常见的算法有选择排序、冒泡排序、快速排序、归并排序、希尔排序等&#xff0c;我们需要根据实际情况&#xff0c;择优选择合适的算法 排序算法的稳定性 排序算法有稳定排序也有不稳定排序 **稳…...

    2023/3/28 16:02:16
  23. Java入门第59课——方法重写规则

    问题 在TetrominoT和TetrominoJ类中重写父类Tetromino的print方法,并进行测试,控制台输出结果如下所示: ---------打印T型---------i am a T(0,4),(0,5),(0,6),(1,5)- - - - * * * - - -- - - - - * - - - -- - - - - - - - - -- - - - - - - - - -- - - - - - - - - -- - -…...

    2023/3/28 16:02:16
  24. Arrays工具类

    Arrays工具类 介绍&#xff1a; 专家提供的&#xff0c;专门用来操作数组的工具类&#xff0c;这个类中很多方法可以帮助我们操作数组&#xff1b; 它位于java.util包下&#xff0c;使用时要import导包&#xff0c;它的方法都是静态的&#xff0c;可以用类名.方法名 这个格式调…...

    2023/3/28 16:02:15
  25. Java入门第60课——继承课后作业

    1.指出下面代码的编译错误,并说明原因 //哺乳动物public class Mammals{}//鸟类public class Birds{}//蝙蝠public class Bat extends Mammals,Birds{} 2.说出下面代码的输出结果,并解释原因 public class Sub extends Base{String color;public Sub(double size,String nam…...

    2023/3/28 16:02:14
  26. Java入门第61课——访问控制

    访问控制符有4种,初学者需要牢记四者间的区别。 概要:1.1包的概念 1.2 访问控制修饰符 博主点评 1.1 包的概念 1.1.1 package语句 定义类时需要制定类的名称,但如果仅仅将类名作为类的唯一标识,则不可避免的出现命名冲突的问题,这会给组件复用以及团队间的合作造成很大的…...

    2023/3/28 16:02:13
  27. Java入门第62课——访问控制课后作业

    1.关于package和import语句&#xff0c;下面说法错误的是&#xff1a; A.package提供了一种命名机制&#xff0c;用于管理类名空间 B.定义类时&#xff0c;除了定义类的名称以外&#xff0c;必须要指定一个包名 C.import语句用于导入所需要的类 D.同时使用不同包中相同类名的类…...

    2023/3/28 16:02:12
  28. 海滩上有一堆桃子,五只猴子来分。 第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。 第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走

    海滩上有一堆桃子&#xff0c;五只猴子来分。 第一只猴子把这堆桃子凭据分为五份&#xff0c;多了一个&#xff0c;这只猴子把多的一个扔入海中&#xff0c;拿走了一份。 第二只猴子把剩下的桃子又平均分成五份&#xff0c;又多了一个&#xff0c;它同样把多的一个扔入海中&…...

    2023/3/28 16:02:11
  29. Java入门第63课——static和final

    在教大家写的第一个Java程序HelloWorld中,很多同学问static是什么意思,本节课终于讲到了。 概要 1.1 static关键字 1.1.1 static修饰成员变量 1.1.2 static修饰成员方法 1.1.3 static块 1.2 final关键字 1.2.1 final修饰变量 1.2.2 final修饰方法 1.2.3 final修饰类 …...

    2023/3/28 16:02:10
  30. 数据库连接池报错com.alibaba.druid.pool.DruidDataSource error

    com.alibaba.druid.pool.DruidDataSource error 我的源码如下: package com.hnxy.utils;import com.alibaba.druid.pool.DruidDataSource; //数据库连接的工具类 提供连接池的数据源对象的获取 public class JDBCUtil {private static DruidDataSource ds new DruidDataSour…...

    2023/3/28 16:02:10