Java实例 Part5:面向对象入门
Part5:面向对象入门
@
Example01:成员变量的初始化值
运行结果:
代码实现:
public class Example01 {
//声明变量
private byte b;
private int i;
private short s;
private long l;
private char ch;
private float f;
private double d;
private boolean bool;
private String str;
public static void main(String[] args) {
Example01 example = new Example01();
System.out.println("byte类型的初始值:"+example.b);
System.out.println("int类型的初始值:"+example.i);
System.out.println("short类型的初始值:"+example.s);
System.out.println("long类型的初始值:"+example.l);
System.out.println("char类型的初始值:"+example.ch);
System.out.println("float类型的初始值:"+example.f);
System.out.println("double类型的初始值:"+example.d);
System.out.println("boolean类型的初始值:"+example.bool);
System.out.println("String类型的初始值:"+example.str);
}
}
- 要点:对于引用类型的变量,在使用之前需要进行初始化,否则会抛出NullPointerException。
Example02:单例模式的应用
-----懒汉式
运行结果:
实现代码:
class Single {
private static Single s = null;
private Single(){}
public static Single getInstance(){
if (s == null){
s = new Single();
System.out.println("---我是懒汉!");
}
return s;
}
}
- 懒汉式在方法中创建这个类的对象,调用效率不高,但能延时加载。
-----饿汉式
运行结果:
代码实现:
class Single {
private static Single s = new Single();
private Single(){}
public static Single getInstance(){
System.out.println("---我是饿汉!");
return s;
}
}
- 饿汉式在全局变量范围内创建这个类的对象,调用效率高,但不能延时加载。
== 测试代码:==
public class Example02 {
public static void main(String[] args) {
System.out.println("---你又是谁?");
Single.getInstance();
}
}
要点:单例模式的特点在于仅能获得一个对象。为了防止其他用户创建对象,需要将构造函数设置成private的,然后提供一个静态方法,该方法返回这个类的对象。
Example03:汉诺塔问题的求解
- 汉诺塔问题描述:有A、B、C 3根柱子,在A上从下往上按照从小到大的顺序放着3个圆盘,以B为中介,把盘子全部移动到C上。移动过程中,要求任意盘子的下面要么没有盘子,要么只能有比它大的盘子。
运行结果:
代码实现:
public class Example3 {
public static void main(String[] args) {
int nDisks = 3; //设置汉诺塔为3阶
moveDish(nDisks,'A','B','C');
}
public static void moveDish(int level,char from,char inner,char to){
if (level == 1){ //如果只有一个盘子
System.out.println("从"+from+"移动盘子1号到"+to);
}else { //如果有大于一个盘子就迭代
moveDish(level-1,from,to,inner);
System.out.println("从"+from+"移动盘子"+level+"号到"+to);
moveDish(level-1,inner,from,to);
}
}
}
- 要点:为了将N个盘子从A移动到C,需要先将N个盘子上面的N-1个盘子移动的B上,这样才能将第N个盘子移动到C上,同理,为了将第N-1个盘子从B移动到C上,通过递归可以实现汉诺塔问题。(上面的程序是3阶汉诺塔问题,有需要可以改写成自己需要计算的输入程序的n阶汉诺塔问题)
Example04:两只完全相同的宠物并得出对象的哈希码
- 要求:重写equals()和toString()以及hashCode()方法来比较两个对象是否相同。
运行结果:
代码实现:
import java.awt.*;
import java.util.Objects;
public class Cat {
private String name;
private int age;
private double weight;
private Color color;
public Cat(String name, int age, double weight, Color color) {
this.name = name;
this.age = age;
this.weight = weight;
this.color = color;
}
@Override
public boolean equals(Object o) { //利用属性来判断猫咪是否相同
if (this == o) { //如果两个猫咪是同一个对象则相同
return true;
}
if (o == null ) { //如果两个猫咪有一个为null则不同
return false;
}
if (getClass() != o.getClass()) { //如果两个猫咪的类型不同则不同
return false;
}
Cat cat = (Cat) o;
//比较猫咪的属性
return age == cat.age && Double.compare(cat.weight, weight) == 0 && Objects.equals(name, cat.name) && Objects.equals(color, cat.color);
}
@Override
public String toString() { //重写toString()方法
return "Cat{" +
"名字='" + name + '\'' +
", 年龄=" + age +
", 重量=" + weight +
", 颜色=" + color +
'}';
}
@Override
public int hashCode() {
return Objects.hash(name, age, weight, color);
}
public static void main(String[] args) {
Cat c1 = new Cat("hyn",3,10,Color.PINK);
Cat c2 = new Cat("azw",4,15,Color.YELLOW);
Cat c3 = new Cat("hyn",3,10,Color.PINK);
System.out.println("猫咪1号:"+c1);
System.out.println("猫咪2号:"+c2);
System.out.println("猫咪3号:"+c3);
System.out.println("猫咪1号的哈希码:"+c1.hashCode());
System.out.println("猫咪2号的哈希码:"+c2.hashCode());
System.out.println("猫咪3号的哈希码:"+c3.hashCode());
System.out.println("猫咪1号是否与2号相同:"+c1.equals(c2));
System.out.println("猫咪1号是否与3号相同:"+c1.equals(c3));
}
}
- 要点:Java中创建的对象是保存在堆中的,为了提高查找的速度而使用了散列查找。散列查找的基本思想是定义一个键来映射对象所在的内存地址。当需要查找对象时,直接查找键即可,这样就不用遍历整个堆来查找对象了。
提高:对toString()方法里面的内容进行改进,通过使用字符串输出对象。
运行结果:
代码实现:
@Override
public String toString() { //重写toString()方法
StringBuilder sb = new StringBuilder();
sb.append("名字:"+name+"\n");
sb.append("年龄:"+age+"\n");
sb.append("重量:"+weight+"\n");
sb.append("颜色:"+color+"\n");
return sb.toString();
}
Java实例 Part5:面向对象入门的更多相关文章
- Java面向对象入门
Java面向对象入门 一.Java面向对象的基本组成 Java类及类的成员:属性.方法.构造器:代码块.内部类 面向对象三大特征:封装.继承.多态(抽象) 关键字:this.super.static. ...
- Thrift入门及Java实例演示<转载备用>
Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...
- 第二十五节:Java语言基础-面向对象基础
面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基 ...
- Java的多线程 简单入门
Java的多线程 简单入门 首先能够先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序仅仅是一组指令的有序集合.它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
随机推荐
- SQL点点滴滴_查看所有存储过程或视图的位置及内容
代码:select a.name,a.[type],b.[definition] from sys.all_objects a,sys.sql_modules b where a.is_ms_ship ...
- 关于webWorker的理解和简单例子
一.理解 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能.您可以继续做任何愿 ...
- 转载:VMWARE虚拟机无法访问的三种方法分析
bridged(桥接模式).NAT(网络地址转换模式)host-only(主机模式).理论认识:1.bridged(桥接模式)在这个地方模式.虚拟机等同于网络内的一台物理主机,可对手动设置IP,子网掩 ...
- 安装office2016和激活。
严重声明:条件宽裕的同学可以购买正版.请大家多多支持正版. 自己手贱,原本在电脑win10系统上安装的正版office被误删了,联系了客服人员,但是自己的微软账号也忘记了.好想下载个正版的.自己在网上 ...
- java继承-final关键词用法
final关键字特点: 1.可以用来修饰变量.方法.类. 2.修饰的变量是一个常量.一旦被赋值就不能被修改(常量一般都和static关键字配合使用) 3.修饰类代表此类不能被继承4.修饰方法代表次方法 ...
- CXF+JAXB处理复杂数据
CXF+JAXB处理复杂数据 CXF默认使用JAXB 来实现对象和XML之间的映射.在前面的例子 中,使用CXF发布的Webservice,其方法的参数和返回值都是简单类型. 本文讨论对象复杂性的 ...
- 页面请求速度慢,TTFB时间长的问题分析
线上环境发现用户请求某个页面时,出现请求速度慢页面卡顿白屏的现象,通过chrome开发工具调试查看Timing,花费在waiting(TTFB)上的时间过长,几秒十几秒不等 TTFB全称Time To ...
- shouldRasterize 光栅化、(缓存)复用、内存、内容稳定
使用场景:稳定的视图(layer)被反复使用或进行动画: 本质:牺牲内存解放cpu: 反例:牺牲内存牺牲cpu. 单次使用或者视图有变动,shouldRasterize不会有任何用途,反而会牺牲内存. ...
- 复习静态页面polo-360
1.ps快捷键 ctrl+1 恢复到100% ctrl+0 适应屏幕大小 ctrl+r 显示标尺 辅助线的利用 矩形框--图像--裁剪:文件存储为web所用格式,注意选格式. 1个像素的平铺 雪碧图的 ...
- C#ref和out的区别-ref是有进有出,out是只出不进
之前学习C#时候就遇到了这个问题,不过当时没有深究.昨晚想到这个问题时候自己尝试敲了敲代码,结果从运行的结果来看,越看越乱.在查看了一些资料的基础上,自己总结了一下. 可能会有点乱,但是自己总结出来的 ...