实例常量和实例代码块day08

强调,创建任何一个实体类,都要定义无参的构造器(必须);

如果想让一个或多个方法为很多类所用,即做为一个公共的方法而非单个类所有(私有),则此方法为工具方法,可以创建一个工具类,将工具方法定义这个类中。

做我们的第一个工具类:Me.java:

工具方法的特点:公有、静态;

如果一个方法被static关键字修饰,则标明此方法是属于类的,而非类对象的;那么调用这个方法时,最好使用类名来调用;好处在于既调用了方法,又不需要构造对象;

 

构造器的作用有哪些?

有一点首先应该了解,就是类中的构造器可以重载(参数不同);

无论调用哪种方式的构造器,都会构造一个类对象;

无论构造器中有几个参数或有无参数,这个类对象中的所有实例字段都已经初始化了;

但只有每个实例字段具有了真正有意义的值,才会得到一个真正的有意义的对象;


通过调用类的构造器生成类的对象,生成的每个对象称为类的“一个实例”,也称类的“一个对象”,将只属于对象的成员数据称为“实例字段”或“实例数据”;

对于类中的“实例数据”,只能通过对象来操纵,通过settergetter方法。

只能通过对象调用的方法,称为“实例方法”。

属于对象的成员:实例数据和实例方法;

 

属于类的成员:静态数据和静态方法,强烈建议用类名操纵它们;

如果使用类对象来访问类中的静态成员(如方法),则会出现警告。

java的语法中:

如果有对象存在,访问静态成员时,如果访问级别允许,有两种方法,可以通过类名访问,也可以通过对象访问;

如果没有对象存在,只能通过类名访问,这也是我们强烈推荐的。

构造器的作用:

1、 根据对象的大小,向堆区申请内存;

2、 初始化类中的静态字段和实例字段

3、 构造对象

注意的是,静态字段,其初始化时间要早于实例字段,在类载入时,做初始化工作;

静态字段所在的内存区域与实例字段所在的内存区域不同;

实例方法和静态方法,则是存在一个地方。

 

栈区内存量小:效率高,静态分配

存储局部变量,块变量,内置类型的变量,引用

堆区:

存储对象内,存量大,效率低

方法区:

存放类中的实例和静态方法,都只有一份。静态变量,final修饰的

存放一些常量池,其中最重要的两类:字符串池,包装类对象池

 

通过类名调用静态方法时,无论调用多少次,或者用对象调用,调用的都是同一个方法;

通过对象只能调用实例方法,无论哪个对象调用,调用的都是同一个方法;

 

类中的静态字段,在一个类只有一份,无论谁来访问都是访问的同一个;

类中的实例字段则不同,每一个对象都有自己的一份;

unicode,[0,65535] 

‘0’=0+48

‘1’=1+48

….

小写字母比对应的大写字母编码值多32,比如’a’=’A’+32

2<<3

 

用字节byte类型的值来说明一个原码和补码的问题:

有两个数:5-5

原码:

5: 00000101

-5: 10000101

对于负整数来说,由原码到补码的转换过程中,有一个反码转换过程:

反码,只对负整数有效,符号位不变;

-5 11111010

对于正整数来说,其原码与补码完全相同;

对于负整数来说,其补码是其反码加1

补码:

5 00000101

-5 11111011

 

说到重载,构造器也可以重载,通常情况下,设计一个类时,要设计尽量多的构造器,使得可以调用多种方式构造对象;

在设计构造器时,在每个构造器中,都要保证对每个实例字段进行赋值;

 

JVM的理解:

java vritual machine的缩写,称为java虚拟机,是用软件在计算机操作上虚拟出来的计算机,虚拟机是个软件,并非硬件组成的机器。

sun公司根据不同的操作系统,开发了运行在不同操作系统上的jvm只要源代码相同,无论使用哪种操作系统上运行的Jvm,都可以编译成相同的类文件,运行得到完全相同的结果。

源代码  领导讲话

虚拟机(编译器): 翻译

类文件 翻译后的领导讲话

类对象数组:

类对象的比较:

变量的比较:

保存内置类型数据的标识符,称为变量;

用来保存非内置类型数据的标识符,称为引用,或称对象;

 

对于变量的比较,相对简单,只比较其表示的值,就是它所在内存块中的数据;只用“==“号进行比较大小是否一样;



java中,对于对象之间的比较,不但有“值”的比较,还有“地址”的比较。

两种比较相比,地址的比较更加简单,就是比较两个地址是否是同一个,即两个引用指向的是否是同一个地址。

Student s1 = new Student(1, "jack", 19);

Student s2 = new Student(1, "jack", 19);

System.out.println(s1 == s2);

//问题:比较什么?,返回真还是假?

比较是两个对象的地址是否相同!

类的构造器没有返回值类型,但有返回值!返回的对象的地址。

如何比较对象的内容?

在两个类对象比较是否相同时,有两种比较:一是地址比较,除非两个对象指向一个内存块,比较为真;内容比较时,需要重写equalshasCode方法,如果所有字段都一样,则用equals比较内容是否相同;

final的部分用法:

1、 修饰局部变量,表示在方法中定义,初始化后不能修改;

2、 用于类中的实例字段,可以在声明时直接赋值,不能修改;

final修改的常量的初始化方式:

1)、声明时直接初始化,如上2中的;

2)、在构造器中给没有初始化的常量初始化

3)、在实例代码块中给常量初始化

红色部分为类No中的实例代码块,其中的代码在构造器调用时执行;

No no = new No();

no.show();


构造器,实例代码块,方法的调用顺序为:

实例代码块  》 构造器  》 方法

在一个类中,实例代码块可否有多个?可以

其调用顺序为在类的设计中从上到下。

如果一个类中既有显式的构造器,又有实例代码块,有一个未初始化的常量,那么如何初始化?因为先执行实例代码块中的代码,所以只能在实例代码块中优先初始化。构造器中如有赋值代码,则会报错。



你可能感兴趣的:(学习ing_任务向_每日任务)