如何定义类的方法
public 返回值类型 方法名(){
//方法的主体
}
return: 如果有返回值 跳出方法、返回结果、
如果一个方法有返回值的话,那调用这个方法就会得到这个方法的返回值
方法名一般采用驼峰命名法
Admin admin = new Admin();
对象是通过类来创建出来的,所以对象的类型是 Admin 也就是说 类是对象的类型
admin.方法名(); //调用无参的构造方法
同一个类中的方法,直接使用方法名调用该方法
不同类的方法,首先创建对象,再使用 对象名.方法名() 来调用
成员变量和局部变量
成员变量:
1、成员变量定义在类中,在整个类中都可以被访问。
2、成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
3、成员变量有默认初始化值。
局部变量:
1、局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
2、局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
3、局部变量没有默认初始化值
在使用变量时需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找。
JavaDoc 注释
javadoc 注释以 /**开头 */ 结尾
通过javadoc技术就可以同时生成程序的开发文档
javaDoc 是有标签的
生成JavaDoc文档:
选择 File --> Export 选项 ,弹出 导出 对话框, 选择 java 菜单中的 javaDoc 选项 提交即可
定义带参方法
<访问修饰符> 返回值类型 <方法名> (<参数列表>){
//方法的主体
}
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。 1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能 再使用该形参变量。 2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值, 输入等办法使实参获得确定值。 3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。 4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变, 而实参中的值不会变化。 数组作为参数的方法 对象作为参数的方法
public class Student { //学生类 public int id; public String name; public int age; public int score; public void showinfo(){ System.out.println(id+"\t"+name+"\t"+age+"\t"+score); } public class StudentsBiz { /** * 学生管理类 */ Student[] students = new Student[30]; //增加学生 public void addstudent(Student stu){ for (int i = 0; i < students.length; i++) { if (students[i]==null) { students[i]=stu; break; } } } //显示本班的学生信息 public void showStudents(){ System.out.println("本班的学生列表"); for (int i = 0; i < students.length; i++) { if (students[i]!=null) { students[i].showinfo(); } } System.out.println(); } public static void main(String[] args) { /** * 对象作为参数的方法 * 示例5. * 实例化学生对象并初始化 */ Student student1 = new Student(); student1.id=10; student1.name="王二"; student1.age=18; student1.score=99; Student student2 = new Student(); student2.id=11; student2.name="张三"; student2.age=18; student2.score=100; //新增学生对象 StudentsBiz biz = new StudentsBiz(); biz.addstudent(student1); biz.addstudent(student2); biz.showStudents(); }
包(package)
包(package)用于将完成不同功能的类分类,放在不同的目录(包)下。
包的命名
包的命名规则:将公司域名反转作为包名。
包名一般每个字母都要小写。
把类定义在某个包下面,一般在源文件开头加上package xxx.yyy;
则类的全名是xxx.yyy.类名
如果定义类的时候没有使用package指定包名,则Java认为类位于默认包里面(default package)。
编译执行
如果程序中声明了包名,即首行写了package com.xxx;
那么如果按照一般的编译方式 javac 源文件名.java
会在当前目录下生成class文件。
然后直接用:java源文件名执行,则会报错。
出现java.lang.NoClassDefFoundError
产生问题的原因
包的意义在于产生一种目录结构,所以class文件必须位于相应的目录层次结构中。
以package com.xxx为例:
一种解决方式是手工建立com文件夹,里面建立xxx文件夹,把生成的class文件放在目录结构中,并且执行的时候采用java 完整类名(即带上包名)才能够执行。
不需要手动建立文件夹的解决手段
使用编译参数 -d的解决方法:
编译的时候可以在javac命令中采用-d指定存放生成的类文件的位置。
-d . 可以在当前目录下生成。
用如下命令:
javac –d . 源文件名.java
则编译后在当前目录下,编译器会生成包的文件目录层次结构,并且把class文件放入其中。
如果不用“.”,也可以指定目录。
用java命令执行的时候需要将包的信息全部带上,即用完整的加包名的形式执行。
执行:
java 完整类名
子包
有两个包名,分别是aa.bb.cc与aa.bb.cc.dd,那么我们称后者为前者的子包。
导入
导入(import),将使用package分离的各个类导入回来,让编译器能够找到所需要的类。
使用在同一个包下的类不需要导入可以直接用,使用不同的包下的类才需要导入。
使用格式:
import aaa.bbb.ccc;
可以使用通配符“*”代替类名,将包中的所有类导入:
import aaa.bbb.*;
注意:
import aaa.bbb.*;并不会导入import aaa.bbb.ccc包下面的类。
顺序问题
关于package、import、class的顺序问题:
1.首先需要定义包(package),可选;
2.接下来使用import进行导入,可选;
3.class或者interface的定义。
包导入与访问权限
访问权限修饰符有四类:
public:允许所有类访问。
private:允许本类访问。
protected:允许本类、子类、同一个包中的类访问。
默认情况:即不加访问修饰符的情况,允许本类和同一个包中的类访问。
import相应的包之后只是使相应的类可见,是否可以访问其中的成员还是由访问修饰符所决定。如默认修饰的成员,即便将相应类的包导入,但是如果当前类不在同一个包中,还是不能访问。