• JAVA类与对象(课堂总结)


    一:“==”的不同含义

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

    测试代码如下:

    package test;
    
    public class qq {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Foo obj1=new Foo();
    		Foo obj2=new Foo();
    		System.out.println(obj1==obj2);
    
    	}
    
    }
    class Foo{
    	int value=100;
    }
    

     结果是false。

    分析:例子中含义是判断这两个变量是否引用同一对象,因为例子中定义的是两个不同的对象,所以返回false。

    二:类的构造方法

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

    package test;
    
    public class qq {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Foo obj1=new Foo();
    	}
    
    }
    class Foo{
    	int valud;
    	public Foo(int initValue)
    	value=initValue;
    }
    

     分析:程序报错,原因因为自定义了构造方法,系统不再提供默认构造方法。

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

    源代码:

    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();
    		
    
    	}
    }
    

     结果截图:

    分析:

    首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

    注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

    四:在静态方法中访问类的实例成员

    源代码:

    package test;
    
    public class qq
     {
      int x = 3;//类的实例变量,初始化值为3
      static int  y = 4;//类的静态变量,初始化值为4
      public static void method()//静态方法
      {   
        System.out.println("实例变量x = " + new qq().x);//在静态方法中访问类的实例变量需首先进行类的实例化
        System.out.println("静态变量y = " + y);//在静态方法中可直接访问类的静态变量
       }
     
      public static void main(String[] args) 
         {
              qq.method();
             qq ex = new qq();
            System.out.println("x = " + ex.x);
        }
    }
    

     五:Java字段初始化的规律

    源代码:

    package test;
    
    public class qq {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    InitialzeBlockClass obj=new InitialzeBlockClass();
    System.out.println(obj.field);
    obj=new InitialzeBlockClass(300);
    System.out.println(obj.field);
    	}
    
    }
    class InitialzeBlockClass{
    	{
    		field=200;
    	}
    	public int field=100;
    	public InitialzeBlockClass(int value){
    		this.field=value;
    	}
    	public InitialzeBlockClass(){
    		
    	}
    }
    

     实验结果截图:

    分析(Java字段初始化规律):所有类的变量都默认初始化为null,比如String a; Integer b;数字类的原始数据类型默认初始化为0,比如int a; short b; char c;boolean默认初始化为false;

    类加载时直接初始化静态字段;

    类加载时调用静态方法初始化静态字段;

    实例化对象时,在调用构造函数之前代码块中初始化字段;

    实例化对象时,在调用构造函数之时初始化字段;

     

  • 相关阅读:
    SQlite数据库
    关于如何获取剪切板的多个图片处理
    aes 和 Md5 分析
    SIP消息
    getItemAt
    C++ map的方法
    C++ 解析Json
    CentOS 6.3安装配置LAMP服务器(Apache+PHP5+MySQL)
    阿里云服务器CentOS 5.7(64位)安装配置LAMP服务器(Apache+PHP5+MySQL)
    Apache虚拟主机(vhost)配置教程
  • 原文地址:https://www.cnblogs.com/yibao/p/5982804.html
Copyright © 2020-2023  润新知