java 作业04 类和对象

思考问题1

早期我们经常这样定义变量

int value=100;

前面的示例中这样定义变量 

MyClass.obj=new MyClass();

这两种方式定义的变量是一样的吗?

不一样。前者定义的是原始数据类型变量,在定义原始数据变量时就为变量开辟了空间;后者是定义了对象的变量,并用构造方法为其开辟内存空间。

思考问题2:

对原始数据类型,可以直接使用“==”来判断两个变量的值是否相等。

对象变量也可以使用“==”来判断两变量的值是否相等吗?

不可以。

当“==”施加在两个原始数据类型变量时,是比较两个变量的值是否相等。施加在引用类型变量时,是比较这两个变量是否引用同一个对象。即比较两个引用类型变量所保存的对象地址是否一样。

在java中要比较两个对象的字段值,可以“重写(override)”基类的equals()方法,只有参数类型为Object的,才是重写了Object的equals方法;参数类型为其他类时要Overload了equals方法。代码如下:

public class ObjectEquals {

public static void main(String[] args) {

MyTestClass obj1=new MyTestClass(100);

MyTestClass obj2=new MyTestClass(100);
System.out.println(obj1==obj2);

System.out.println(obj1.equals(obj2));

}

}

class MyTestClass
{

public int Value;

//注意:只有参数类型为Object的,才是重写了Object的equals方法

//参数类型为MyTestClass的,仅仅是Overload了equals方法。

// @Override

// public boolean equals(Object obj)

// {

// return ((MyTestClass)obj).Value==this.Value;

// }

public boolean equals(MyTestClass obj)

{

return obj.Value==this.Value;

}

public MyTestClass(int initValue)

{

Value=initValue;

}

}

思考问题3:

请总结一下,这个方法有哪些“与众不同”之处?你能列举几条?

1)方法名与类名相同;

2)方法名的第一个首字母大写了;

思考问题4:

上面代码为何无法通过编译?哪儿出错了?

引用构造方法new Foo()时缺少参数。

如果一个类中提供了一个自定义的构造方法,将导致系统不再提供默认的构造方法。

思考问题5:

如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?

如果父类中有静态成员赋值或静态初始化块,执行静态成员赋值或静态初始化块。如果类中有静态成员赋值或静态初始化块,执行静态成员赋值或静态初始化块将类的成员赋予初值。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。如果有构造方法,则以构造方法为准。

实例

执行示例,输出结果为

根据输出结果,总结java初始化输出字段的规律

1.执行类成员定义时指定的默认值或类的初始化模块,到底执行哪一个要看哪一个“排在前面”,执行排在后面的。

2、如果有构造方法,则以构造方法为准。

3、类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。

思考问题6:

运行示例,观察结果,总结静态初始化块的执行顺序:

class Root
{
static{
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root()
{
System.out.println("Root的无参数的构造器");
}
}
class Mid extends Root
{
static{
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid()
{
System.out.println("Mid的无参数的构造器");
}
public Mid(String msg)
{
//通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:" + msg);
}
}
class Leaf extends Mid
{
static{
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf()
{
//通过super调用父类中有一个字符串参数的构造器
super("Java初始化顺序演示");
System.out.println("执行Leaf的构造器");
}

}

public class TestStaticInitializeBlock
{
public static void main(String[] args)
{
new Leaf();

}
}

运行结果:

1、静态初始化块只执行一次

2、创建子类型的对象时,也会导致父类型的静态初始化块执行

3、super()可以访问父类中初始化方法。有静态初始化块的,从父类开始执行静态初始化块,再执行子类的静态初始化块;再开始执行父类普通的初始化块,原始构造函数,重载构造函数,子类的同理。

思考问题7:

静态方法中只允许访问静态数据。那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

通过参数访问实例成员 具体代码如下:

public class Test2 {
public static void main(String[] args)
{
Test t=new Test();
int a=t.getyear();
t.input1();
Test.input(a);
t.input(a);
}
}
class Test
{
int year = 100;
public int getyear()
{
return year;
}
public static void input(int a)
{
System.out.println("静态"+a);
}
public void input1()
{
System.out.println("实例");
}
}

运行结果

思考问题8:

两个整数明明完全一样,为何一个输出

true,一个输出false?

调用了java.lang.String类,包含了字符串的值和实现比较特殊,可以不适用构造方法,就可以直接获得一个字符串对象。

程序题:使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数。请写一个类,任何在任何时候都可以向他查询“你已经创建了多少个对象?”

package text;

class Number

{

static int i=0;

public Number()

{

i++;

}

public void out()

{

System.out.println("你已经创建了"+i+"个对象!");

}

}

public class Text {

public static void main(String[] args) {

// TODO Auto-generated method stub

Number n1=new Number();

n1.out();

Number n2=new Number();

n2.out();

Number n3=new Number();

n3.out();

}

}

时间: 2024-10-13 19:46:06

java 作业04 类和对象的相关文章

JAVA作业 04 类与对象

一.动手动脑 1)题目要求:验证ClassAndObjectTest.java(使用自定义类) 2)源代码: public class ClassAndObjectTest { public static void main(String[] args) { //创建类的实例,定义一个对象变量引用这一实例 MyClass obj = new MyClass(); //通过对象变量调用类的公有方法 obj.myMethod("Hello"); //给属性赋值 obj.setValue(1

Java自学-面向对象 类和对象

Java中的类和对象 引入面向对象的基本概念 假设,我们要设计一个LOL这样的游戏,使用面向对象的思想来设计,应该怎么做? 步骤 1 : 设计英雄这个类 LOL有很多英雄,比如盲僧,团战可以输,提莫必须死,盖伦,琴女 所有这些英雄,都有一些共同的状态 比如,他们都有名字,hp,护甲,移动速度等等 这样我们就可以设计一种东西,叫做类,代表英雄这样一种事物 类: 英雄(Hero) 状态: 名字, 血量,护甲,移动速度 注: 本例用到了3种数据类型 分别是 String(字符串),float(浮点数)

【编程语言】Java中的类和对象learn by Imooc

 一.什么是类和对象 * 类是模子,确定对象将会拥有的特征(属性)和方法 * 类的特点: *     类是对象的类型 *     具有相同属性和方法的一组对象的集合 * 对象的属性 *     属性-对象具有的各种特征 *     每个对象的每个属性都有用的特定值 * 对象的方法 *     方法-对象执行的操作(能干什么) * 类和对象的关系 *     类是抽象的概念,仅仅是模板 *     对象是一个你能够看得到,摸得着的具体实体 二. 如何定义Java的类 * 1.类的重要性:所有Jav

Java学习笔记--类和对象

1.介绍面向对象的编程 面向对象是现在主流的编程样例,它替代了以前C语言使用时的"结构体",Java是一门面向对象的语言,所以需要熟悉面向对象的概念.面向对象的程序由很多对象组成,每个函数对于用户而言,都有特殊的功能.程序里面的很多对象都可以直接从公共库里面拿来直接用.不用去研究这些功能怎么去实现的.传统的结构的编程由一系列算法步骤来解决问题.一旦这些步骤确定下来,也要同时确定存储数据的方式.也就是数据结构一开始学习的:算法+数据结构=程序. 先决定算法,再决定使用什么样的结构来存储数

JAVA OO之 类、对象、包

类 类是具有相同属性和行为的一组对象的集合. 1 public class HomeWork1 { 2 public static void main(String[] args) { 3 MyPhone mp= new MyPhone(); 4 mp.call(); 5 mp.music(); 6 mp.photo(); 7 mp.video(); 8 } 9 } 以上是类申明的一个例子. 对象 万物皆为对象,对象因我关注而产生.类是对象的抽象,对象是类的实例. 包 文件夹...... 如需调

Java中的类与对象

最近要找实习才想起来翻出好久没碰的Java, 希望还不晚, 打算抽几天的时间看完 <Head first Java>, 这本书翻译的还算不错推荐给大家哈. 关于类和对象的区别, 类其实就是同一类对象的一个抽象,而对象则是某一个类的具体实例. 其实很像马克思里面的抽象与具体有木有, 相信学过的理解起来还是很easy的. 比方说可以定义一个类是 高富帅 , 王思聪就是一个对象. 23333 都说Java是面向对象的语言, 那么到底需要哪些东西才能够使用对象呢?? Answer : 需要两个类: 1

浅谈Java中的类与对象

面向对象基本概念:封装.继承.多态 封装:就是把数据和行为结合在一起形成统一的整体,并对对象使用者隐藏数据的实现过程. 继承:Java继承是使用已存在的类的定义作为基础建立新类的技术,继承避免了对一般类和特殊类之间共同特征进行的重复描述. 多态:多态指同一个实体同时具有多种形式. Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 消息解析 1. 什么是类? 答:类是客观存在的,抽象的,概念的东西. 2. 什么是对象? 答:对象是具体的,实际的,代表一

Java中的类和对象

类和对象 类:类是对对象的抽象,也就是说类是同一类对象的总称,这些对象具有相同的属性和方法. 对象:对象就是一个具体的事物,Java作为面向对象的语言,可以说在Java中万事万物皆对象.对象本身具有自己的属性和方法. 举个生活中的例子:我们生活中常见的人.手机.电脑.车.鸟等等就可以认为是类,然后每一个不同的人就是人这个类的对象,小米6,苹果7就是手机类的不同对象. 知道了什么是类,那么类里面有什么呢? 先来看一下类的定义方法: public class 类名{ 访问修饰符 类型名 属性名 :

Java反射获取类和对象信息全解析

反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.forName(String clazzName)静态方法 调用类的class属性,Person.class返回的就是Person的class对象(推荐使用) 调用某个对象的getClass()方法 具体使用还是要根据实际来选择,第一种方式是比较自由的,只要知道一个类名就可以了,其不会做该类是否存在的