JAVA面向对象1

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()执行前被初始化 因此它可以直接调用或者用类名调用;创建对象后可以用对象名调用。

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值