1.类和对象的概率
对象有以下特征:
1.1.隐蔽性:也就是对象的封装性,隐藏对象的内部数据和功能,从外面无法直接进来,要访问必须通过预先设计的通道。当然,可以直接设置对外开放,让外部直接进入对象
1.2.抽象性:类是对象的抽象。在设计时,不会将一些无关内容出现在类上,只关系一些重要问题。重点关系的是需要保存那些数据,实现那些功能,即数据抽象和方法(过程)抽象
1.3.继承性:要实现继承就要在“类”这一级进行设计,实现层次模型
1.4.多态性:同样一个方法,用不同的参数个数、不同的参数类型调用,实现不同的功能
2.类的概念:
类是一个概念,是对某一具体事物进行具体抽象的概念,是对事物进行描述的模型;根据观测事物的需要,构建一个描述事物主要特征、行为的框架,叫做类
2.1.成员变量(属性)定义:
[修饰符] 变量类型 变量名[=初始值]
修饰符:public、private、protected、static、final
变量类型:可以是简单类型、复合类型、自定义类型
变量名:合法标示符
初始值:也叫默认值,当变量没有重新赋值之前的值,在大部分情况下,不对变量赋初值
例如:
private int age=24
String Name;
2.2.成员方法定义:
[修饰符] 方法类型 方法名称([形式参数列表])
{
方法体;
}
修饰符:public、private、protected、static、final
方法类型:就是该方法的返回值类型。如果没有类型,则定义为void类型;如果方法有返回类型。则为返回值的类型。此时需要用:
return 表达式 或者 return(表达式)
return该语句给出方法的返回值。
注意:一个方法中,执行到return语句直接返回;如果return语句后面还有语句,则成为无效语句
方法名称:要符合标识符定义规则
方法体:符合java语句规则的语句块
形式参数列表:形式为“类型 变量名1,类型 变量名2,……”,其中的类型可以为简单类型、复合类型、自定义类型,变量名要符合标识符定义规则
构造方法定义:形式同成员方法,名称要求与类名同名
一个对象定义以后,在实例化、执行new时,执行的是构造方法。在java中,构造方法不是必须的,如果在类中没有定义声明构造方法,JVM会给这个类一个默认的构造方法;一个类也可以定义多个构造方法
注意:
1.创建多个类时,不管是否写在一块,在生成字节码文件时一定是多个的
2.如果某个类的关键字class的前面用public修饰,则源程序的文件名一定要与这个类名一致,也就是说public修饰的类一定要与文件名同名;如果class前面没有public关键字修饰,则类名不用与文件名一致。一个文件中,出现多个用public修饰的类,则编译字节码文件的过程中是会发生编译错误
3.只有自定义的类,没有main()方法,生成的字节码文件无法执行
4.由于面向对象程序设计的封装性,在成员变量中,不让外部访问的数据,外面是无法访问的。如果允许直接访问对象内部的数据,需要加上public修饰符,表示该信息允许直接外部访问的。如果允许外部直接引用的方法,也需要加上public修饰符
5.类只是一个描述某类事物、概率的模型,类在内存中是不分配存储空间的,无法在其中存储数据的
3.对象
在构建类的基础上,我们可以创建对象
class teacher
{
public String id;
public String name;
public String sex;
public String add;
}
public class code1 {
public static void main(String[] args) {
teacher ant;
ant=new teacher();
ant.id="231010";
ant.name="zhangshang";
ant.sex="M";
ant.add="url:www.baidu.com";
System.out.println("教师ID:"+ant.id);
System.out.println("教师名字"+ant.name);
System.out.println("教师性别"+ant.sex);
System.out.println("教师地址"+ant.add);
}
}
输出结果:
教师ID:231010
教师名字zhangshang
教师性别M
教师地址url:www.baidu.com
注意:
1.在类体中声明的变量叫成员变量,也是类的成员或者属性
2.静态方法不能引用非静态的成员变量,否则编译错误。在静态(static)方法中,类的非静态的成员变量不能直接引用,一定要实例化对象后,通过对象引用成员变量。
3.类的成员变量可以不赋初始值,如果没有初始值,系统会自动为它们赋初始值,例如整型变量为0,字符类型为“A”,复合类型为“null”
4.成员变量的作用域为整个类体
public class text1 {
public String name;
public String id;
public int score;
public String tel;
public void pro(){
System.out.println("name:"+name+" id:"+id+" score:"+score+" tel:"+tel);
}
public static void main(String[] args) {
text1 n=new text1();
n.name="zhangshang";
n.id="23111106";
n.score=99;
n.tel="12347657397";
n.pro();
}
}
结果:
name:zhangshang id:23111106 score:99 tel:12347657397
成员变量的注意事项
1.在实例化过程中,如果成员变量没有赋初始值,系统会自动赋初始值:int类型为0 double和float类型为0.0 boolean类型为false char类型为“A” 引用类型(复合类型)为null,成员变量在整个类体中有效
2.在main()方法中,在定义对象变量、对象实例化之前,不能、也无法为成员变量赋值。因为实例化之前,这些成员变量还没有分配存储空间
3.在Date类中,在最新的版本中,已经没有构造方法Date(String),因此编译时会出现“使用或覆盖了已过时的API”的警告,应尽量避免使用,但也是可以正常运行的。
当前有效的Date类的构造方法有Date()或Date(long ms):用不带参数的构造方法直接实例化为系统当前日期时间;或者用一个long类型的参数构造方法,它实例化一个Date对象,这个对象是从1970.01.01 08:00:00加上ms毫秒表示的日期
3.变量
3.1局部变量
在某个方法体内声明的变量,叫做局部变量。
局部变量的使用规则:
1.局部变量前没有权限修饰符
2.局部变量一定要赋初值方可使用;不赋初值的局部变量值为随即值;在没有赋值前不能访问局部变量
3.局部变量的作用域为定义该局部变量的方法体,其生命周期用方法体
3.2 成员变量、类变量、静态变量、静态代码块、实例块
成员变量:也叫作实例变量,是在定义类时定义的变量。这类变量在对象实例化时,直接存储在堆区的对象实例中,同一个成员变量在不同对象中各自保存一个自己的副本,副本之间没有关系,可以理解成“对象局部变量”
类变量:在定义成员变量的类型前面加上“static”的变量,也叫作静态变量
在定义成员变量的类型前面没有加上“static”的变量均为成员变量
静态方法:在定义方法类型(返回值类型)前面加上“static”,则为静态变量
静态代码块:
用“static”+复合语句形成的代码块
static{
类型 变量名列表;
语句;
……
}
实例块:是在定义成员属性后,用一对“{}”括起来的代码。它是在对象实例化时,执行构造方法之前执行的一段代码
注意:
1.类变量属于类本身的变量,所以不需要定义对象、实例化,可以直接用类名访问
2.用同一类定义的不同对象之间,共享类变量;通过类变量,可以实现对象间的信息交换
3.静态(static)方法的性质与静态变量类似,也可以直接用类名访问;且静态方法只能访问静态变量
4.在一个类中,允许定义多个静态代码块
如此我们得到以下结论:
1.静态变量可以被静态代码块、静态方法、对象访问
2.无论是在哪里对静态变量(类变量)进行修改,都将影响所有对象 即无论在静态代码块、对象中对静态变量进行修改,都将直接影响到所有对象访问的值
3.静态变量a的三种访问方法:a(直接访问)、StaticVariables.a(类名访问)、sv1.a(对象名访问)
4.在main运行前,先运行静态代码块,如果有多个静态代码块,则按照它们在类中的排列,顺序执行
5.静态方法必须被调用才能被执行,其调用方式可以用类名调用,也可以直接调用,或者在对象中调用
6.在对象实例化过程中,先执行实例代码块再执行构造方法
为了更容易理解Java程序的执行过程,在这里先介绍Java字节码程序的执行过程:
1.将字节码文件加载进入内存的方法区
2.JVM对字节码程序进行合法性检查
3.生成所有字节码对应的class对象
4.初始化静态成员、静态方法、静态代码块
5.执行main()方法
也就是说,静态成员(变量)、静态代码块是在main方法执行前先行执行的同时,存储在方法区中的静态变量被初始化。
对象名sv1 sv2先在栈中申请空间,并指向堆空间中实例化的对象。其中,sv1.a和sv2.a被初始化指向在方法区的静态变量。sv1和sv2是共享同一内存。由于所有引用均指向同一地址,所以只要静态变量修改,所有访问静态变量的值都一样
而在类中,b是成员变量。成员变量在对象sv1和sv2被实例化之前没有指定存储空间的,因此,b必须实例化后才能赋初值,同时,由于sv1.b和sv2.b的存储空间不一样,所有一个被修改不会影响到另一个
由于静态方法info()是在main()执行前被初始化的,在初始化静态方法info的时候,成员变量还没有存储空间,因此,在静态方法中不能访问非静态成员变量。此外,静态方法在main()执行前被初始化 因此它可以直接调用或者用类名调用;创建对象后可以用对象名调用。