java类与对象的问题_java类与对象的动手动脑和其他小问题

在Java中,我们可以通过组合一私有字段和一对get/set方法来定义一个属性。私有的变量,共有的方法。

packagesample;

/**

* 自定义Java类的示例

*/

classMyClass {

// 公有字段

publicStringInformation="";

// 自定义公有Java实例方法

public voidmyMethod(Stringargu) {

System.out.println(argu);

}

// 定义属性:私有字段+get方法+set方法

private int value;

public intgetValue() {

return value;

}

public voidsetValue(int value) {

this.value=value;

}

}

public classClassAndObjectTest {

public static voidmain(String[]args) {

//创建类的实例,定义一个对象变量引用这一实例

MyClassobj=newMyClass();

//通过对象变量调用类的公有方法

obj.myMethod("hello");

//给属性赋值

obj.setValue(100);

//输出属性的当前值

System.out.println(obj.getValue());

//直接访问对象公有字段

obj.Information="Information";

//输出对象公有字段的当前值

System.out.println(obj.Information);

}

}

步骤基本为:

(1)需要定义一个对象变量

(2)然后“创建(new)”一个对象,赋值给对象变量

(3)通过对象变量使用对象,主要方式有:

1)直接调用类的方法;

2)存取类的字段。

MyClass obj = new MyClass();这种“引用”一个对象的变量称为“引用类型”的变量,有时又简称为“对象变量”。以前的int,float之类的称为原始数据类型的变量。

当声明一个对象类型的变量时,实际上并没有创建一个对象,此变量=null。

定义一个原始类型的变量时,会马上给其分配内存。

在定义变量时,Java要求必须显式初始化变量;对象变量如果不引用一个真实的对象,则必须声明为null。特殊值null:代表一个对象变量不引用任何对象。

901f5fffb1b88cbcc9533943ce087509.png

上图说明:当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等

当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

如何比较两个对象的“内容”是否一样?

两个对象的“内容”,其实是指它们在某一时刻的所有字段的值,“内容相等”,其实是就“对应字段值”一致。

在Java中要比对两个对象的字段值,可以 “重写(override)”基类的equals()方法:

packagesample;

public classObjectEquals {

public static voidmain(String[]args) {

MyTestClassobj1=newMyTestClass(100);

MyTestClassobj2=newMyTestClass(100);

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

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

}

}

classMyTestClass

{

public int Value;

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

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

//   @Override

//   public boolean equals(Objectobj)

//    {

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

//    }

public booleanequals(MyTestClassobj)

{

return obj.Value==this.Value;

}

publicMyTestClass(int initValue)

{

Value=initValue;

}

}

240d6214940f6dbec80c6b0884263a30.png

第一次输出错误,第二次正确。

当你定义一个类时,如果不显式指明它的“父亲”类是哪个,则默认是Object。

Object是Java的最顶层基类,其中定义了equals( )方法

除了重写基类的equals方法,我们也可以“重载(overload)”equals( )方法:

860ba93387ac3a242ce372e79b22438d.png

注意:

与前面“重写”方式的代码相比,equals( )方法的参数类型是MyTestClass而不是Object,并且方法本身也没有附加“@Override”标记。

1.以下代码为何无法通过编译?哪儿出错了?

b36b4fd07dd561e412c1be203f96ebc1.png

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

修改之后的代码:

packagesample;

public classTest {

public static voidmain(String[]args){

修改的地方这一行:Fooobj1=newFoo(23);

}

}

classFoo{

int value;

publicFoo(int initValue){

value=initValue;

}

}

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

79249a82d94f2064d8a2eab401a4cfc1.png

这是一个生造出来展示Java语法特性的示例类,在实际开发中不要这样写代码,应该尽量保证一个字段只初始化一次!

2.请依据代码的输出结果,自行总结Java字段初始化的规律。(发表到博客)

packagesample;

public classtest2 {

public static voidmain(String[]args){

InitializeBlockClassobj=newInitializeBlockClass();

System.out.println(obj.field);//没有形参  用定义的field

obj=newInitializeBlockClass(300);

System.out.println(obj.field);//有形参调用构造函数

}

}

classInitializeBlockClass{

{

field=200;

}

public int field=100;

publicInitializeBlockClass(int value){

this.field=value;

}

publicInitializeBlockClass(){

}

}

b3124eda244b47cd782b2fb4b6095352.png

如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数;如果在主函数中创建对象时有形参,则调用类中对应的构造函数。

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

(2).执行类的构造函数。

类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

3.当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。(编写代码)

packagejicheng;

//当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。  2015.10.16

public class JiCheng{

public static voidmian(Stringargs[]){

Sons=newSon();

s.print();

}

}

//父类对象

classFather

{

Stringname="liming";

int age= 21;

}

//子类对象

classSonextendsFather

{

Stringlike="running";

voidprint()

{

System.out.println("name"+name+"  age:"

+age+"  aihao:"+like);

}

}

运行结果为:name=lining,age=21,like=running.

4.请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

a007029179bf99a4decb7ac0a0339065.png

静态初始化块的执行顺序:

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

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

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

packageexample;

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

public classexample{

public static voidmain(String[]args)

{

example.display();

examplee=newexample();

e.displayOne();

e.display();

}

public static voiddisplay(){

System.out.println("类的方法");

}

public voiddisplayOne()

{

System.out.println("对象的方法");

}

}

a51e406385720661cf29e89b4311148a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值