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

package sample;

/**

* 自定义Java类的示例

*/

class MyClass {

// 公有字段

public String Information = "";

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

public void myMethod(String argu) {

System.out.println(argu);

}

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

private int value;

public int getValue() {

return value;

}

public void setValue(int value) {

this.value = value;

}

}

public class ClassAndObjectTest {

public static void main(String[] args) {

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

MyClass obj = new MyClass();

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

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:代表一个对象变量不引用任何对象。

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

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

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

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

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

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

package sample;

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;

}

}

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

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

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

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

注意:

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

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

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

修改之后的代码:

package sample;

public class Test {

public static void main(String[] args){

修改的地方这一行:Foo obj1=new Foo(23);

}

}

class Foo{

int value;

public Foo(int initValue){

value=initValue;

}

}

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

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

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

package sample;

public class test2 {

public static void main(String[] args){

InitializeBlockClass obj=new InitializeBlockClass();

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

obj=new InitializeBlockClass(300);

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

}

}

class InitializeBlockClass{

{

field=200;

}

public int field=100;

public InitializeBlockClass(int value){

this.field=value;

}

public InitializeBlockClass(){

}

}

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

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

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

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

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

package jicheng;

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

public class JiCheng {

public static void mian(String args[]){

Son s=new Son();

s.print();

}

}

//父类对象

class Father

{

String name = "liming";

int age = 21;

}

//子类对象

class Son extends Father

{

String like="running";

void print()

{

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

+age+"  aihao:"+like);

}

}

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

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

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

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

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

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

package example;

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

public class example{

public static void main(String[] args)

{

example.display();

example e=new example();

e.displayOne();

e.display();

}

public static void display(){

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

}

public void displayOne()

{

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

}

}

java类与对象的动手动脑和其他小问题的更多相关文章

  1. JAVA类与对象作业——动手动脑以及课后实验性问题

    一: 1.源代码 //MAO2015.10.6 //foo class Foo { int value; public Foo(int initValue) { value = initValue; ...

  2. Java类和对象初始化

    类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...

  3. java类和对象之间的差

    java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...

  4. 危险代码:如何使用Unsafe操作内存中的Java类和对象

    危险代码:如何使用Unsafe操作内存中的Java类和对象—Part1 危险代码:如何使用Unsafe操作内存中的Java类和对象—Part2 危险代码:如何使用Unsafe操作内存中的Java类和对 ...

  5. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...

  6. java类和对象

    类是对象的抽象 对象是类的一个实例类 对象 = new 类();拿对象可以操作这个类里的方法 java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间 ...

  7. Java类和对象动手动脑

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

  8. java第二次课件课后动手动脑习题整理总结(2019年9月23号)

    一.动手动脑 1 1.题目 2.程序源代码 package yang8; import java.util.Scanner; import java.util.Random; public class ...

  9. 解析Java类和对象的初始化过程

    类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...

随机推荐

  1. 机器学习 —— 概率图模型(Homework: Structure Learning)

    概率图的学习真的要接近尾声了啊,了解的越多越发感受到它的强大.这周的作业本质上是data mining.从数据中学习PGM的结构和参数,完全使用数据驱动 —— No structure, No par ...

  2. 用rbenv给整个系统安装ruby(所有用户都可用)

    rbenv非常好用,但有一个小问题,每个用户都需要单独安装和设置版本. 下面安装步骤可以安装在/usr/local/rbenv下,所有用户都可以共享rbenv.   #rbenv安装(/usr/loc ...

  3. Scorm 1.2 开发文档

    原文出处 电华教育研究杂志2010年第7期<SCORM标准学习跟踪机制的研究与实现> http://blog.sina.com.cn/s/blog_964ec55001014nl0.htm ...

  4. 安装hma master出错 Error: Package: perl-Mail-Sender-0.8.13-2.el5.1.noarch

    You are using the EPEL 5 version of the repo instead of 6, go into your /etc/yum.repos.d/epel.repo f ...

  5. 自定义View(7)官方教程:自定义View(含onMeasure),自定义一个Layout(混合组件),重写一个现有组件

    Custom Components In this document The Basic Approach Fully Customized Components Compound Controls ...

  6. nginx.conf 配置文件详解

    简单的实现nginx在前端做反向代理服务器的例子,处理js.png等静态文件,jsp等动态请求转发到其它服务器tomcat: user www www; worker_processes ; erro ...

  7. 没有显示器且IP未知的情况下登录树莓派

    如果是没有显示器操作树莓派,可能会不知道树莓派有线网卡自动分配到的IP地址,不知道登录到哪儿.以下提供详细操作步骤解决这个问题. 网段扫描法这个是推荐的办法.网段扫描工具很多,推荐一个Advanced ...

  8. Hadoop集群(第9期)_MapReduce初级案例

    1.数据去重  "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选.统计大数据集上的数据种类个数.从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重.下面就 ...

  9. HDU 3294 (Manacher) Girls' research

    变形的求最大回文子串,要求输出两个端点. 我觉得把'b'定义为真正的'a'是件很无聊的事,因为这并不会影响到最大回文子串的长度和位置,只是在输出的时候设置了一些不必要的障碍. 另外要注意一下原字符串s ...

  10. asp.net web forms和asp.net mvc比较

    ASP.NET Webforms Behind Code的好处和存在的问题 ASP.NET Webforms是一个RAD/VISUAL(快速可视化)的Web程序开发技术.也就是说,开发者简单地拖拽控件 ...