Java编程练习之final关键字

1.final类:不允许任何类继承,并且不允许其他人对这个类进行任何改动;

当被某个类设置为final类时,类中的所有方法都被隐式的设置为final形式,但是final类中的成员变量既可以被定义为final形式,又可以被定义为非final形式。

例1:使用final修饰五星红旗类,输出“五星红旗是由红色的旗面和5颗黄色的五角星组成的”,运行效果如下:

public final class FiveStarRedFlag {
    int starNum;
    String starColor;
    String backgroundColor;
    public FiveStarRedFlag(int starNum,String starColor,String backgroundColor){
        this.starNum=starNum;
        this.starColor=starColor;
        this.backgroundColor=backgroundColor;
    }
    public static void main(String[] args){
        FiveStarRedFlag fg=new FiveStarRedFlag(5,"黄色","红色");
        System.out.println("五星红旗是由"+fg.backgroundColor+"的旗面和"+fg.starNum+"颗"+fg.starColor+"的五角星组成的");
    }
}

2.final方法:不能被重写 。

将方法定义为final类型可以防止子类修改该方法的定义与实现方式,同时final方法的执行效率要高于非final方法。如果一个父类的某个方法被设置为private修饰符,子类将无法访问该方法,自然无法覆盖该方法,所以一个定义为 private的方法隐式被指定为final类型,这样无须将一个定义为private的方法再定义为final类型。

练习:编写交通类,将遵守交通规则的方法设为final()方法,不管是行人,非机动车辆,还是机动车辆,遵守的交通规则都是一样的,例如红灯停,绿灯行等。运行效果如下:

class Traffic{
    String TrafficRule;
    public Traffic(String TrafficRule){
        this.TrafficRule=TrafficRule;
    }
    public final String Obey(){
        return this.TrafficRule+"要遵守交通规则,红灯停,绿灯行,黄灯需要等一等!";
    }
}
class Pedestrian extends Traffic{
    public Pedestrian(String TrafficRule){
        super(TrafficRule);
    }
}
class motorvehicle extends Traffic{
    public motorvehicle(String TrafficRule){
        super(TrafficRule);
    }
}
class nonmotorvehicle extends Traffic{
    public nonmotorvehicle(String TrafficRule){
        super(TrafficRule);
    }
}

public class TrafficFinalMethod {
    public static void main(String[] args){
        Pedestrian p=new Pedestrian("行人");
        System.out.println(p.Obey());
        motorvehicle m=new motorvehicle("机动车");
        System.out.println(m.Obey());
        nonmotorvehicle n=new nonmotorvehicle("非机动车");
        System.out.println(n.Obey());
    }
}

 3.final变量:可用于修饰变量,一旦变量被final修饰,就不可以再改变变量的值。通常,把被final修饰的变量称作常量。

final修饰变量时,必须在声明时对其进行赋值操作。final除了可以修饰基本数据类型的常量,还可以修饰对象引用,例如被final修饰的数组。一旦一个对象引用被final修饰后,它只能恒定指向一个对象,无法指向另一个对象。一个既是static又是final的字段占据了一段不能改变的存储空间。

练习1:动车组每节车厢只有108个座位,共有10节车厢,现有旅客1189人,从控制台输出滞留旅客的人数。运行效果如下:

public class TravelPeople {
    final int num=10;//声明一个常量,10节车厢
    int seatnum=108; //每节车厢108个座位
    int peoplenum=1189; //现有旅客1189人
    public void travel(){
        int A; //滞留人员数量
        A=peoplenum-(seatnum *num);
        System.out.println("滞留旅客的人数是:"+A);
    }

//
    public static void main(String[] args){
        TravelPeople t=new TravelPeople();
        t.travel();

    }
}

练习2:将π的值设为常量,在控制台输入水泥柱的底面周长后,输出该水泥柱的直径。运行效果如下:

import java.util.Scanner;
public class Yuanzhu {
    final double pi=3.14;
    double d;
    public void calculate(double num){
        d=num/pi;
        System.out.println("水泥柱的直径是"+d);
    }
    public static void main(String[] args){
        Yuanzhu y=new Yuanzhu();
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入水泥柱的地面周长:");
        double ZhouChang=sc.nextDouble();
        y.calculate(ZhouChang);


    }
}

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一篇 基础篇 第0章 JDK安装和最简单的环境变量配置方法 第1章 Java基础概念 一、 Java基础语法 1、Helloworld.java 2、标识符 3、关键字 4、常量 5、变量 6、语句 6.1 if语句和switch语句 6.1.2 if语句举例 6.1.3 switch语句 6.2 for循环语句 6.3 while语句和do-while语句 6.3.1 while语句形式 6.3.2 do-while语句 6.3.3 while语句和do-while语句举例 6.4 break语句和continue语句 6.4.1 break语句 6.4.2 continue语句 二、类和对象 1、面向对象基础 1.1 面向对象程序设计入门分析 1.2 抽象 1.3 封装 2、类 2.1 类头 2.2类体 2.3 创建对象 2.4 面向对象举例 2.5 构造函数 2.5.1 构造函数的一般概念 2.5.2 创建自己的构造函数 2.5.3 构造方法注意事项 2.5.4构造函数的作用 3、方法 3.1 方法介绍 3.2方法定义 3.3调用方法 3.4 方法举例 4、访问控制符 5、this关键字 5.1 this方法应用举例 6. Static关键字 6.1 static应用举例 7. super关键字 7.1 super应用举例 8. abstract关键字 9. final关键字 9.1 final介绍 9.2 final使用注意事项 三、继承 1、继承的概念 1.1 继承的定义 1.2 继承举例 1.3 父类和子类 类继承 2.1 方法继承 2.2 方法覆盖 2.3 方法重载 3、多态与动态绑定 3.1 多态分为两种 3.2 调用一个对象方法的机制 3.3 方法调用举例 4、构造函数的重载 4.1 默认字段初始化 4.2 默认构造函数 4.3 显式字段初始化 4.4 构造函数被调用后的详细执行过程 5、包 5.1 创建包 5.2 创建可复用类的步骤简要说明 5.3 包的导入 5.4 包的可见性 接口 6.1 接口的概念 6.2 接口的声明 6.3 接口的实现 四、IO流及异常处理 1、流和文件 1.1 流 1.2 文件 2、常用流类 2.1 字节流 2.1.1 InputStream(输入流) 2.1.2 OutputStream(输出流) 2.1.3 FileInputStream(文件输入流) 2.1.4 FileOutputStream(文件输出流) 2.1.5 BufferedInputStream(缓冲输入流) 2.1.6 BufferedOutputStream(缓冲输出流) 2.1.7 PrintStream(打印流) 2.2字符流 2.2.1 Reader类 2.2.2 Writer类 2.2.3 FileReader类 2.2.4 FileWriter类 2.2.5 CharArrayReader类 2.2.6 CharArrayWriter类 2.2.7 BufferedReader类 2.2.8 BufferedWriter类 2.2.9 PrintWriter类 2.2.10 System.in对象和System.out对象 文件处理 3.1 创建或打开、关闭文件对象 3.2 关闭文件 3.3 read()方法 3.4 write()方法 3.5 其他操作文件的方法 4、Java异常处理 4.1 Java异常概念 4.2 异常类型 4.3 Java的内置异常 4.4 Java异常举例 4.5 异常的捕获和处理 4.6 异常抛出 4.6.1 throw语句 4.6.2 throws语句 4.6.3 finally语句 4.7 自定义异常类 4.8 异常应用的其他问题 4.9 异常应用举例 五、线程 1、线程的概念 1.1 程序、进程与线程 1.2 线程调度与优先级 1.3 线程的状态与生命周期 1.4 控制一个线程生命周期最常用的方法 2、线程的创建和启动 3、线程的同步与死锁 3.1 同步的概念 3.2 线程同步举例 3.3 线程死锁 六、GUI 1、图形用户界面概述 1.1 组件 1.2容器 1.3 AWT组件 1.4 Swing组件 1.5 组件与容器的关系 1.6 swing常用组件 2、Swing常用组件 2.1文本组件 2.2 标签 2.3 按钮 2.4单选按钮组件 2.5 复选框组件 2.6列表框组件 2.7组合框组件 2.8滑块组件 事件处理 3.1 事件处理原理 3.2 事件架构 3.3 焦点事件 3.4 键盘事件 3.5 鼠标事件 4、布局设计 4.1 FlowLayout流布局 4.2 BorderLayout边界布局 4.3 CardLayout卡式布局 4.4 GridLayout卡式布局 4.5 GridBagLayout卡式布局 4.6 BoxLayout盒式布局 5、菜单步骤 6、对话框设计 6.1 JOptionPane对话框 6.2 JDialog对话框 文字与图形处理 7.1 文本和字体 7.2 简单图形绘制 7.3 颜色 7.4 图像处理 七、网络 1、Java网络编程简介 1.1 IP网间协议 1.2 TCP传输控制协议 1.3 UDP用户数据包协议 2、URL连接 2.1 URL 2.2 Java.net包中URL类定义 2.3 创建URL对象 2.4 Java.net包中URLConnection类 2.5 AppletContext接口类 2.6 获取网络属性信息 2.7 创建输入流(InputStream)对象 3、SOCKET连接 3.1 Socket通信的一般结构 3.2 TCP Socket编程 3.2.1 Socket类 3.2.2 ServerSocket类 3.3 UDP Socket编程 八、Java概念疑难解答 第2章 Java经典练习题 2.1 斐波那契数列 2.2 判断素数 2.3 水仙花数 2.4 分解质因数 2.5 杨辉三角 2.6 学习成绩查询 2.7 求最大公约数与最小公倍数 2.8 完全平方数 2.9 统计字母、空格、数字和其它字符个数 2.10 求主对角线之和 2.11 完数求解 2.12 求s=a+aa+aaa+aaaa+aa...a的值 2.13 高度计算 2.14 乘法口诀 2.15 无重复三位数 2.16 菱形打印 2.17 利润计算 2.18 第几天判断 2.19 从小到大输出数列 2.20 猴子吃桃问题 2.21 乒乓球比赛 2.22 求分数之和 2.23 求阶乘的和 2.24 递归求法 2.25 求不多于5的正整数 2.26 回文判断 2.27 星期判断 2.28 插数入数组 2.29 取整数的任意位 2.30 按顺序输出数列 2.31 位置替换 2.32 字符串排序 2.33 贷款器 2.34 通讯录排序 2.35 闰年判断 2.36 二元方程求解 2.37 密码解译 2.38 DVD查询 2.39 电子日历 2.40 万年历 第二篇 提高篇 第3章 Java常用算法 3.1递归算法 3.2冒泡排序算法 3.3 快速排序算法 3.4选择排序算法 3.5直接插入算法 3.6希尔排序算法 3.7 二分查找算法 3.8 二叉树 3.9 图的实现 3.10 生产者消费者的实现 3.11 银行家算法 3.12 KMP算法 3.13 RSA的实现 第4章 IO流实例开发 4.1流到底怎样输入和输出扯淡区 4.2 FileInputStream的应用 4.3 FileOutputStream的应用 4.4 FileReader的应用 4.5 FileWriter的应用 4.6 BufferedInputStream的应用 4.7 BufferedOutputStream的应用 4.8 BufferedReader的应用 4.9 BufferedWriter的应用 第5章 Java图形界面开发 5.1 开发自己的控件 5.2 控件的排布示例 5.3 开发自己的QQ聊天系统 5.4 颜色选择器 5.5 按钮测试 5.6 密码验证器 5.7 绘制自己的坐标 5.8 多种字体显示 5.9 窗口风格选择器 5.10 右键菜单 5.11 树形关系网 5.12 开发自己的文本编辑器 5.13 开发自己的剪切板 5.14 文本拖动效果演示 5.15 怎样拖动图片 5.16 开发自己的数字时钟 5.17 数字动画 5.18 滑杆调试器 5.19 启动程序开发 5.20 开发自己的调色板 5.21 文件选择器 5.22 丰富多彩的光标选择器 5.23 开发自己的浏览器 5.24 文字抖动效果演示 5.25 文字阴影效果演示 5.26 3D文字效果演示 5.27 波浪文字效果演示 5.28 飞行文字效果演示 5.29 伸展文字效果演示 5.30 开发自己的网页图片 5.31 火焰图片效果演示 5.32 图片百叶窗效果演示 5.33 图片倒影效果演示 5.34 怎样翻转图片 5.35 开发自己的闹钟 5.36 应用自己的万年历 5.37 开发自己的计算器 5.38 开发自己的电子相册 第6章 Java游戏 6.1 俄罗斯方块 6.2 连连看游戏 6.3 迷宫 6.4 模拟闪电 6.5 扫雷 6.6 贪食蛇 6.7 围棋 6.8 五子棋 6.9 人机猜拳游戏 第三篇 实战篇 第7章 项目开发 7.1 开发自己的浏览器 7.2 开发自己的象棋游戏 7.3 网络主机线程扫描与端口控制
好啊好啊 抽象类与接口是Java中最重要部分之一,这里用较大的篇幅来做下这部分的笔记. 1. final关键字Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记的方法不能被子类复写; (3).final标记的变量即成为常量,只能被赋值一次. 注意: 如果使用final来声明常量,请遵守以下常规: final标记的变量名,所有单词字母都需大写. -------------------------------------------------------------------------------- 2. 抽象类 讲抽象类的定义必须先讲抽象方法的定义. 所谓抽象方法,是指只声明而未实现(即没有{}包围的方法体)的方法. 而含有一个或多个抽象方法的类就称为抽象类. 抽象类 = 普通类 + 抽象方法 对于抽象类,时刻需要谨记: 抽象类是不能够直接实例化的, 如果要使用一个抽象类,就必须要有该抽象类的子类. 如果抽象类的子类不是抽象类的话,就一定要复写该抽象类的所有抽象方法. 如下面代码示例: view plaincopy to clipboardprint? abstract class Person { //全局常量的命名一定要采取全部字母大写的方式 public static final String NAME = "newsainton"; //print()方法有方法体,所以不是抽象方法 public void print() { System.out.println("非抽象方法中,Name = "+NAME); } //fun()方法不含方法体,为抽象方法 public abstract void fun(); } //B类继承自A类,但B未声明为抽象类,则必须要复写A类中所有的抽象方法 class Student extends Person { public void fun() { System.out.println("抽象方法中,Name = "+super.NAME); } } public class Demo01 { public static void main(String args[]) { Student s = new Student(); s.fun(); s.print(); } } abstract class Person { //全局常量的命名一定要采取全部字母大写的方式 public static final String NAME = "newsainton"; //print()方法有方法体,所以不是抽象方法 public void print() { System.out.println("非抽象方法中,Name = "+NAME); } //fun()方法不含方法体,为抽象方法 public abstract void fun(); } //B类继承自A类,但B未声明为抽象类,则必须要复写A类中所有的抽象方法 class Student extends Person { public void fun() { System.out.println("抽象方法中,Name = "+super.NAME); } } public class Demo01 { public static void main(String args[]) { Student s = new Student(); s.fun(); s.print(); } } 另外一个需要考虑的问题是: 抽象类可否有自己的构造方法? 答案是: 抽象类中允许有自己的构造方法,但是该构造方法并不能直接实例化自己的对象. 如果在抽象类中存在有参构造方法,则必须在子类中明确的使用super([参数列表])指明要调用父类中的哪个构造方法. 这里举例如下: view plaincopy to clipboardprint? abstract class Person { // 应该有姓名和年龄属性 private String name ; private int age ; public Person(){} // 如果已经不是无参的,则必须在子类中明确调用无参构造 public Person(String name,int age) { this.name = name ; this.age = age ; } public String getName() { return this.name ; } public int getAge() { return this.age ; } // 定义一个输出方法,但是此方法为抽象方法 public abstract String getInfo() ; } class Student extends Person { public Student(String name,int age) { // 调用Person类中有两个参数的构造方法 super(name,age) ; } public String getInfo() { return "姓名 = "+super.getName()+",年龄 = "+super.getAge() ; } } public class Demo05 { public static void main(String args[]) { Student s = new Student("张三",30) ; System.out.println(s.getInfo()) ; } } abstract class Person { // 应该有姓名和年龄属性 private String name ; private int age ; public Person(){} // 如果已经不是无参的,则必须在子类中明确调用无参构造 public Person(String name,int age) { this.name = name ; this.age = age ; } public String getName() { return this.name ; } public int getAge() { return this.age ; } // 定义一个输出方法,但是此方法为抽象方法 public abstract String getInfo() ; } class Student extends Person { public Student(String name,int age) { // 调用Person类中有两个参数的构造方法 super(name,age) ; } public String getInfo() { return "姓名 = "+super.getName()+",年龄 = "+super.getAge() ; } } public class Demo05 { public static void main(String args[]) { Student s = new Student("张三",30) ; System.out.println(s.getInfo()) ; } } -------------------------------------------------------------------------------- 3. 接口(interface) 3.1 接口的概念 接口是抽象方法与常量的结合. 接口的定义方式为: interface 接口名 { 数据类型 常量名 = 常量值; 返回值类型 方法名(); .......} 在Java中,一个类只能继承一个类,但是却可以实现(implements)多个接口. 如果实现接口的类不是抽象类的话,则该子类必须复写接口中所有的抽象方法. 例如如下代码示例: view plaincopy to clipboardprint? interface Person { //接口中包含了抽象类和抽象方法 public static final String NAME = "newsainton"; public abstract void fun(); } // 一个类可以继承多个接口,但如果该类不是抽象类的话,则必须实现抽象类中的所有抽象方法 class Student implements Person { public void fun() { System.out.println("name = "+NAME); } } public class Demo02 { public static void main(String args[]) { Student s = new Student(); s.fun(); } } interface Person { //接口中包含了抽象类和抽象方法 public static final String NAME = "newsainton"; public abstract void fun(); } // 一个类可以继承多个接口,但如果该类不是抽象类的话,则必须实现抽象类中的所有抽象方法 class Student implements Person { public void fun() { System.out.println("name = "+NAME); } } public class Demo02 { public static void main(String args[]) { Student s = new Student(); s.fun(); } } 3.2 接口的两点注意之处 (1). 抽象类使的是extends关键字,表示一个类只能继承一个父类,但是接口使用的是implements,一个类可以同时实现多个接口,但是此时子类就必须同时覆写好多个接口中的抽象方法。 (2). 既然定义中已经明确说明了接口是抽象方法和全局变量的集合,因此,我们可以如下例一样,对代码进行简化: view plaincopy to clipboardprint? interface Person { //接口中包含了抽象类和抽象方法 //public static final String NAME = "newsainton"; public String NAME = "newsainton"; //public abstract void fun(); public void fun(); } // 一个类可以继承多个接口,但如果该类不是抽象类的话,则必须实现抽象类中的所有抽象方法 class Student implements Person { public void fun() { System.out.println("name = "+NAME); } } public class Demo03 { public static void main(String args[]) { Student s = new Student(); s.fun(); } } interface Person { //接口中包含了抽象类和抽象方法 //public static final String NAME = "newsainton"; public String NAME = "newsainton"; //public abstract void fun(); public void fun(); } // 一个类可以继承多个接口,但如果该类不是抽象类的话,则必须实现抽象类中的所有抽象方法 class Student implements Person { public void fun() { System.out.println("name = "+NAME); } } public class Demo03 { public static void main(String args[]) { Student s = new Student(); s.fun(); } } 3.3 接口与接口之间的关系 一个接口可以使用extends关键字去继承一个或多个已有的接口,但在子类的实现时,也必须全部实现所有接口的抽象方法. 一个接口去继承并实现多个接口的例子如下: view plaincopy to clipboardprint? interface A { public void printA() ; } interface B { public void printB() ; } interface C extends A,B { public void printC() ; } class X implements C { // 如果实现了(继承)C接口,则在子类中就必须覆写全部的抽象方法 public void printA() { System.out.println("A --> HELLO") ; } public void printB() { System.out.println("B --> HELLO") ; } public void printC() { System.out.println("C --> HELLO") ; } } public class Demo04 { public static void main(String args[]) { X x = new X() ; x.printA() ; x.printB() ; x.printC() ; } } interface A { public void printA() ; } interface B { public void printB() ; } interface C extends A,B { public void printC() ; } class X implements C { // 如果实现了(继承)C接口,则在子类中就必须覆写全部的抽象方法 public void printA() { System.out.println("A --> HELLO") ; } public void printB() { System.out.println("B --> HELLO") ; } public void printC() { System.out.println("C --> HELLO") ; } } public class Demo04 { public static void main(String args[]) { X x = new X() ; x.printA() ; x.printB() ; x.printC() ; } } 3.4 这里,如果一个子类既要继承一个抽象类,又要实现一个接口,该怎么写呢? 我们采取的是: class 类名称 extends 抽象类 implements 接口 这样的语法格式. 下面是同时继承一个抽象类,又实现接口的具体实例: view plaincopy to clipboardprint? interface X { public void printX() ; } interface Z { public void printZ() ; } // 一个抽象类也是可以实现接口的 abstract class Y implements Z { public abstract void printY() ; } // D类同时继承Y类和实现X接口 class D extends Y implements X { public void printX() { System.out.println("X --> HELLO .") ; } public void printY() { System.out.println("Y --> HELLO .") ; } public void printZ() { System.out.println("Z --> HELLO .") ; } } public class Demo13 { public static void main(String args[]) { D d = new D() ; d.printX() ; d.printY() ; d.printZ() ; } } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newsainton/archive/2009/08/03/4405346.aspx

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值