zoukankan      html  css  js  c++  java
  • java类与对象的动手动脑和其他小问题

    在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("对象的方法");

    }

    }

  • 相关阅读:
    C# Dapper 2.0源码
    C#实现隐藏手机号、邮箱、姓名等敏感信息扩展方法
    C# 自定义弹窗提醒
    用sqlyog 连 mysql 8 时,报错:plugin caching_sha2_password could not be loaded
    汇总最全的C#.NET(数据库/.net/其它)面试题及参考答案
    安装sql2008r2后,数据库引擎为空是为什么?
    SQL Server 2008找不到SQL Server配置管理器的问题
    PrintDialog.ShowDialog不能显示打印对话框
    PrintDialog控件
    PrintPreviewControl控件
  • 原文地址:https://www.cnblogs.com/diyunfei/p/4886305.html
Copyright © 2011-2022 走看看