Java学习之练习题二(含答案)
1、简述什么是Java垃圾回收机制?有什么意义?列举6种Java垃圾回收算法。
答:Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。
意义:使内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。
六种java垃圾回收算法:引用计数法、tracing算法、compacting算法、copying算法、generation算法、adaptive算法
2、在Java继承中,方法覆盖要满足什么要求?
答:需要满足
1函数名称相同,参数类型和个数相同
2返回值类型相同
3只能用于子类覆盖父类的方法
4子类的方法权限大于等于父类的
3、Java的方法覆盖与方法重载有什么异同?
答:相同点:
都要求方法同名,都可以用于抽象方法和非抽象方法
不同点:
方法覆盖要求参数签名必须一致,而方法重载要求参数签名必须不一致。
方法覆盖要求返回类型必须一致或相容,而方法重载不做限制。
方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法)。
方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载没有限制。
父类的一个方法只能被子类覆盖一次,而一个方法所在的类中可以被多次重载
4、分别介绍this、super、static、final关键字的使用。
答:1-this:this关键字总是指向调用该方法的对象。根据this出现的位置的不同,this作为对象的默认引用有两种情形。构造器中引用该构造器正在初始化的对象。在方法中引用调用该方法的对象。一个类有许多构造函数,有时候想在一个构造函数中调用其他构造函数,以避免代码重复,可以使用this关键字,当局部变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分,
2-super:super是调用父类的构造方法和方法、引用父类的成员。在 Java 中,有时还会遇到子类中的成员变量或方法与父类中的成员变量或方法同名。因为子类中的成员变量或方法名优先级高, 所以子类中的同名成员变量或方法就隐藏了父类的成员变量或方法,但是 我们如果想要使用父类中的这个成员变量或方法,就需要用到 super.想要使用父类中的这个成员变量或方法。
3-static:用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。
4-final:final关键字是一个修饰符,可以修饰类、方法和变量。被final修饰的类是一个最终类,不可以被继承。被final修饰的方法是一个最终方法,不可以被覆盖。被final修饰的变量是一个常量,只能被赋值一次。
5、综合设计题(把完成后的程序代码手写出来即可)
阶段一:设计猫和鸭类与其父类结构,按照下面类图并写出代码。(shout()方法简单输出一句话,构造方法初始化封装好的私有成员变量)
阶段二:增加新成员海豚,重新设计类结构。使用多态、接口优化设计
阶段三:输出各种动物叫声
需求说明:
在阶段二编写的Java代码的基础上,分别创建Cat、Duck、Dolphin对象并放到一个数组中,对数组进行遍历输出各种动物如何叫
阶段四:输出各种动物腿的条数
需求说明:
在阶段三代码的基础上,对数组进行遍历输出各种动物腿的条数(提示:使用instanceof判断动物种类)
答:代码如下:
package com.sise.java.zuoye1_2; public abstract class Animal { private String name; private int legNum; public Animal(String name) { this.name=name; } public String getName() { return name; } public int getLegNum() { return legNum; } public abstract void shout(); } //Cat------ package com.sise.java.zuoye1_2; public class Cat extends Animal{ private int legNum = 4; // 腿的条数 public Cat(String name, int leNum) { super(name); this.getLegNum(); } /* * 重新父类方法 */ public void shout() { System.out.println("喵喵喵"); } /* * 实现接口的方法 */ public int getLegNum() { return legNum; } } //Duck------- package com.sise.java.zuoye1_2; public class Duck extends Animal implements Terrestrial{ private int legNum = 2; // 腿的条数 public Duck(String name, int leNum) { super(name); this.legNum = legNum; } /** * 重写父类的shout()方法 */ public void shout() { System.out.println("嘎嘎嘎~"); } /** * 实现接口的getLegNum()方法 腿的条数 */ public int getLegNum() { return legNum; } } Terrestrial--- package com.sise.java.zuoye1_2; public interface Terrestrial { /** * 返回腿的条数 腿的条数 */ public int getLegNum(); } Dolphin-------- package com.sise.java.zuoye1_2; public class Dolphin extends Animal{ public Dolphin(String name) { super(name); } @Override public void shout() { System.out.println("海豚音……"); } } //Test----- package com.sise.java.zuoye1_2; import java.util.Scanner; public class Test { static Animal[] animals = new Animal[3]; static Scanner input = new Scanner(System.in); static int choose; public static void start() { animals[0] = new Cat("加菲猫", 4); animals[1] = new Duck("唐小鸭", 2); animals[2] = new Dolphin("海豚奇奇"); load(); choose = input.nextInt(); } public static void main(String[] args) { start(); while (choose == 0) { try { modify(); } catch (Exception e) { e.printStackTrace(); } finally { load(); choose = input.nextInt(); } } System.out.println("谢谢使用!"); } public static void load() { System.out.println("动物名字\t\t腿的条数\t\t动物叫"); for (int i = 0; i < animals.length; i++) { if (animals[i] instanceof Terrestrial) { String name = animals[i].getName(); int legNum = ((Terrestrial) animals[i]).getLegNum(); System.out.print(name + "\t\t" + legNum + "\t\t"); animals[i].shout(); } else { String name = animals[i].getName(); System.out.print(name + "\t\t" + 0 + "\t\t"); animals[i].shout(); } } System.out.println("是否要继续修改数据:按0进行修改操作,其它任意数字键退出"); } public static void modify() throws Exception { String[] names = new String[3]; int[] number = new int[3]; System.out.println("请输入猫的名称"); names[0] = input.next(); System.out.println("请输入猫腿的条数"); number[0] = input.nextInt(); if (number[0] != 4) { throw new Exception("猫只能有4条腿"); } System.out.println("请输入鸭子的名称"); names[1] = input.next(); System.out.println("请输入鸭子腿的条数"); number[1] = input.nextInt(); if (number[1] != 2) { throw new Exception("鸭子只能有两条腿"); } System.out.println("请输入海豚的名称"); names[2] = input.next(); animals[0] = new Cat(names[0], number[0]); animals[1] = new Duck(names[1], number[1]); animals[2] = new Dolphin(names[2]); } }
- java学习练习题及答案
- Thinking in Java 第四版本--第3章练习题答案--for,break,switch,case,default
- java语言程序设计 李元朝 第7章 类的继承和多态机制 练习题答案
- CCF计算机软件能力认证试题练习-数位之和(Java参考答案学习记录)
- 对应java练习题的答案
- java学习之路 之 基本语法-程序流程控制-switch语句练习题
- CCF计算机软件能力认证模拟试题-最大的矩形(Java参考答案学习记录)
- Java 学习笔记 Day005 (补day5 的练习题)
- java学习之路----java开发实战经典第12章习题及答案
- JAVA学习 第九天(1)练习题
- java学习之路 之 基本语法-特殊的流程控制语句-练习题
- java学习之路 之 Java常用类-包装类(Wrapper)及练习题
- CCF计算机软件能力认证试题练习-图像旋转(Java参考答案学习记录)
- Java语言程序设计基础篇原书第十版第五章编程练习题答案
- java学习之路之基本语法-程序流程控制-switch语句练习题
- linux学习5-6练习题及答案
- java 学习之路----java开发实战经典反射习题答案(15章)
- <<The C Programming Language>>学习之路-练习题参考答案 1-7
- 6、50道JAVA基础编程练习题跟答案
- java学习之路 之 基本语法-方法(函数)及练习题