IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java第四章课后小结 -> 正文阅读

[Java知识库]Java第四章课后小结

一,对象与对象引用的区别是什么? 请举例说明

为了接下来的分析,先建立一个Demo类

 public class Demo{
    //默认构造方法
    public Demo{
    }
}

常用的创建对象:Demo demo=new Demo();

这一条语句,其实包括了四个动作:
1)右边的“new Demo”,是以Demo类为模板,在堆空间里创建一个Demo对象。
2)末尾的()意味着,在对象创建后,立即调用Demo类的构造函数,对刚生成的对象进行初始化。
3)左边的“Demo demo”创建了一个Demo类引用变量,它存放在栈空间中。也就是用来指向Demo对象的对象引用。
4)“=”操作符使对象引用指向刚创建的那个Demo对象。

等价于

Demo demo;//创建对象引用 作为局部变量分配在栈stack上

demo=/*将对象引用指向对象*/new Demo();//创建对象对象分配在堆heap上

区别:
在这里插入图片描述
(1)一个对象引用可以指向一个对象,也可以不指向对象

Demo demo;//一个对象引用
demo=new Demo();//一个对象引用指向一个对象

Demo demo;//创建对象引用,但是没有指向对象

(2)一个对象可以被一个对象引用引用,也可以被多个对象引用同时引用

Demo demo;//创建对象引用
demo=new Demo();//创建对象,并被一个对象引用指向

Demo demo1,demo2,demo3;//创建多个对象引用
demo1=new Demo();
demo2=demo1;
demo3=demo2;//创建对象,并被多个对象引用指向

二,对象作为参数传递的特点是什么?请举例说明

特点:
基本数据类型作为参数传递是值传递,而对象是引用传递,传递的是对象的地址,对象只有一个。

例如:
将实参对象引用a中的对象的地址复制到形参对象引用s中,s和a指向同一个对象。

class IntClass {
   int value;   
}   
public class RunIntClass {
   public static void modifyValue(IntClass s, int val){ 
        s.value = val; 
   } 
   public static void main(String[] args) { 
        IntClass  a = new IntClass();     
        modifyValue(a,8);
        System.out.println(a.value);  
   }
}

三,对象初始化顺序是怎样的?请举例说明

java类初始化顺序是:

(1)初始化类变量(即static修饰的成员变量),并未赋值。不管写的位置在哪里,只要是类变量,系统总会先找到它进行变量初始化。
(2)执行静态代码块和类变量定义式,两者根据写的位置来决定先后,先写先执行。
(3)初始化实例变量(即未被static修饰的成员变量),并未赋值。同样的,不管写的位置在哪里,在创建对象时执行到这步时,系统总会找到它进行变量初始化。
(4)执行构造代码块和实例变量定义赋值式,两者同样根据写的位置先后来决定执行顺序先后。
(5)执行构造函数。构造函数同样可以调用静态变量和实例变量。

关于这个初始化顺序,其实一句话可以概括: 先初始化类变量然后赋值,再初始化实例变量然后赋值。
例如:

package hello;

class IntClass{
	int value;//自动初始化,默认值为0
	//int value=5; //在定义时指定初值
	
	public IntClass() {}
	
	//定义构造方法将属性value初始化
	public IntClass(int val) {
		value=val;
	}
}
public class IntClassConstructor {
	public static IntClass getInstance() {
		//调用构造方法从而省略了s.value代码
		IntClass s=new IntClass(8);
		//s.value=8;
		return s;
	}
	public static void main(String[] args) {
		IntClass a=new IntClass();
		System.out.println(a.value);
		a=getInstance();
		System.out.println(a.value);
	}
}

四,类的static字段与非static字段的区别是什么?什么场景应该使用static修饰符?请举例说明

1.static字段
(1).修饰数据成员:用static修饰符修饰的数据成员是不属于任何一个类的具体对象,而是属于类的静态数据成员;
访问方式为通过类名加点操作符来访问,也可通过对象引用来访问。
《Java开发手册》强制使用类名(而不是该类的对象引用)访问静态方法和静态变量。

例如: static数据成员初始化:

class IntClass{
	static int num=0;//静态数据成员初始化
	int value=5; //在定义时指定初值
	
	public IntClass() {}
	
	//定义构造方法将属性value初始化
	public IntClass(int val) {
		value=val;
	}
}

(2).static类方法:但可以被所有对象所访问,引用这个方法时,可以使用对象名做前缀,也可以使用类名做前缀。
《Java开发手册》强制使用类名(而不是该类的对象引用)访问静态方法和静态变量;
static方法内部的代码,只能访问类中的static属性或方法,不能直接访问类中的非static属性或方法(因为那是对象方法),但非static方法(对象方法)可以访问static数据成员;
main方法是特殊的静态方法,是application程序入口点,必须写成public static void main(String [] args)的形式。

例如: static方法:

static int countNum() {
		return num;
	}//静态方法

(3).静态代码块:一个类中可以使用不包含在任何方法体中的静态代码块,当类被装载时,静态代码块被执行,且只被执行一次,静态代码块经常用来对类中定义的属性进行初始化。
例如:

public class Test2 {
	 static int value ;
	   static {  
	            value = 3;
	            System.out.println("value="+value); 
	   }
	   public static void main(String[] args){   }

}

2.非static字段:
(1).数据成员:被复制到对象中,每个对象中都有其各自的属性,通过对象引用访问。
(2).方法:通过对象引用调用,在调用时系统会为方法开辟一个栈空间,用于存放方法中的局部变量和形式参数,并且方法在执行时还能访问复制到对象中的属性,其效果如同方法也被复制的对象中一样。
方法执行完毕之后,栈空间被释放。

3.什么时候使用static修饰符:
如类里对象公有的属性,比如类中所有对象的个数等等,就可定义为静态属性为类所共享。

五,Java中final修饰符都有什么作用?请举例说明

1.final修饰属性,则属性为常量
例如:

final int NUM = 20; 
       NUM = 30; // 编译错误

2.如果修饰方法,则该方法在子类当中不能被覆盖,可防止任何继承类修改此方法,保证了程序的安全性和正确性。
例如:

class Parent {
     public final void method1(){}//这个方法不能被子类覆盖    
} 
class Child extends Parent { 
     public final void method1(){}//编译错误

3.final修饰,则该类不能被继承
例如:

class Parent {
            }
            final class Person extends Parent{
            } //可以继承Parent类        
           class Child extends Person{
           } //编译报错,不能继承Person类

六,Java中float[10] arr; 语句正确么?为什么?

不正确。Java语言数组声明时,不可在方括号内指定数组大小。因为此时并未分配数组空间,可以使用new给数组分配空间,指定数组长度。
例如:

 int[] arr = new int[10];  //此时分配了数组空间,每个单元初始化为默认值0

七,Java数组元素类型为基本类型和引用类型时,有什么不同?请举例说明

1.数组元素为基本数据类型
例如:

int[] arr = new int[10];  //此时分配了数组空间,每个单元初始化为默认值0

产生一个有10个单元,类型为int的数组对象,所有单元的初值为0。

2.数组元素为引用类型
例如:

 String[] example = new String[10];  //对象引用数组

for(String x: example)
      System.out.println(x);    输出结果为10null

产生一个具有10个单元的数组对象,每个单元存放的是1个String对象的引用,所有单元的初值为null,此时并未创建具体的String对象。

example[0] = new String(“ab”); //创建String对象,赋值给example[0], 
//此时example的第一个元素指向String对象,从而可以操纵String对象 

为数组对象引用赋值后,才能使用数组元素,否则会抛出 NullPointerException异常。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:04:30  更:2021-10-06 12:07:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:02:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码