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就是所在函数 ...
随机推荐
- Gartner发布最新魔力象限报告,微软领跑数据库市场(编译自TechRepublic)
知名调研机构Gartner发布了最新的<2015年数据库管理系统魔力象限调研报告>.报告显示,微软.甲骨文和AWS是数据库市场的三大领导厂商. 此份报告对知名的商用以及开源数据库厂商进行了 ...
- xcopy-参数详解
XCOPY——目录复制命令 1.功能:复制指定的目录和目录下的所有文件连同目录结构. 2.类型:外部命令 3.格式:XCOPY [源盘:]〈源路径名〉[目标盘符:][目标路径名][/S][/V][/E ...
- Python初学者第十七天 函数(1)
17day 函数 1.函数定义: 函数 是指将一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需调用其函数名即可 2.函数的特性: a 减少重复代码 b 使程序变得可扩展 c 使程序 ...
- Python学习---装饰器的学习1210
装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包 [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前 ...
- nginx+php+swoole安装记录
领了台阿里服务器1vCPU 1G,做下测试研究. 系统 centos7,使用yum安装. Nginx yum install nginx ##开启nginx service nginx start 安 ...
- 沉淀再出发:再谈java的多线程机制
沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于ja ...
- WritePrivateProfileString、GetPrivateProfileString 读写配置文件
WritePrivateProfileString 写配置文件 BOOL WINAPI WritePrivateProfileString( _In_ LPCTSTR lpAppName, _In_ ...
- SQL查询含有%号的字段
select * from EMS_ANNOUNCEMENT where 1=1 and title like '%\%%' escape '\'
- C#网络编程(一)基础篇
简介: C#网络编程API包含在System.Net和System.Net.Sockets命名空间下,大部分网络操作都可以在其中找到相应的类来实现:包括Socket的创建和连接,网络流收发方法的封装, ...
- php给$_POST赋值会导致值为空
在调试一个程序的时候发现很奇怪的现象,post传过来的值再某些地方为空,先看下面的代码 <?php if($_POST['submit'] == 'Add'){ if($_POST['type' ...