1.面向对象的基本概念
- 类是同种对象的集合与抽象,类是一种抽象的数据类型,它是具有一定共性的对象的抽象,二属于累的某一对象则被称为是类的一个实例,是类的一次实例化结果。
注意,无论类写得多么庞大,系统都不会给类分配内存空间,因为类的抽象的概述,系统不可能给抽象的东西分配空间,而对象是具体的,实际存在的。
- 属性是对象的特征,属性可以是数据,也可以是另一种对象。
2.面向对象的基本特征
- 抽象性
- 封装性
- 继承性
- 多态性
以上将在学习笔记(2)中具体介绍。
3.类的使用
包含main方法的类叫主类
Java语言的命名规则是什么?
修饰符public代表该类能被所有类访问,修饰符public表明所定义的类为公共类,注意一个Java文件可以包含多个类,但最多包含一个公共类。
4.成员变量与成员方法
- 构造方法
下面列举一个简单例子,学习如何通过构造方法初始化新建对象的成员变量public修饰符:表明所有能访问该方法所在类的对象,都能使用该方法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25文件名:JStudent.java
public class JJStudent{
String name;
char sex;
int stuID;
//构造方法1
public JStudent(String stuName,char sex,int stuID){
name=stuName;
this.sex=sex;
this.stuID=stuID;
}
//构造方法2
public JStudent(){}
//定义main方法
public static void main(String args[]){
//通过构造方法1初始化变量
JStudent s1=new JStudent("张三",'男',20130301);
//通过构造方法1初始化变量
JStudent s1=new JStudent();
}
}
static修饰符:如果一个方法被声明为static,他能够在类的任何对象被创建之前访问,而不必引用任何对象。
5.对象的生成与使用
- new运算符为对象动态分配内存空间,并返回对它的一个引用值,引用值就是系统分配给对象的内存地址,由于类是一种引用数据类型,因此变量中该存储的值不是对象本身,而是引用值。
- 一个Java文件只能有一个public类(公共类),但不同文件可以有另外public公共类,且相互之间可以调用生成具体类的对象。
String也是引用数据类型,因此变量name存储的值也仅仅是String对象存放的地址。
6.方法参数的传递
根据参数的数据类型,值传递也可以分为两种情况:
- 参数是基本数据类型,参数传递为实际值,如int型参数a的值为10,传递的值即为该参数的实际值10.
- 参数是引用数据类型,由于参数值存储的只是引用对象的地址值,因此参数的传递为引用对象的地址值传递。
7.this关键字
- 对于方法中与类中变量重名时,要改变全局变量时,必须使用this关键字。
1
2
3
4public void test(String a)
{
this.a=a;//必须使用this才能改变全局变量
} - this关键字在同名构造函数中的运用
1 | public class JthisConstructTest { |
通过this(参数)来表示执行哪个构造函数,执行完this表示的构造函数后,会重新跳转执行自己的构造函数。
8.static关键字
- 加了关键字static的成员具有静态属性,如果是成员变量加上来static关键字,成为静态成员变量;如果是成员方法加上了static关键字,称为静态成员方法。
- static不用来修饰类(可以用来修饰实名内部类),只是修饰类的成员,它在该类所有实例之间是共享的。
- 无论产生多少对象,并不产生static变量的拷贝,而是该类所有实例变量共用同一个static变量,所有静态变量都统一存储在内存的静态存储区内。
- static修饰的变量称为类变量,调用方法如下:
类名.类变量
- static修饰的方法称为类方法,带用方法如下:
类名.类方法
1.类方法不能访问所属类的非静态变量和方法,只能访问方法体内的局部变量、参数和静态比变量。
2.类方法中不能出现this和super关键字。
static语句块
如果需要通过计算来初始化static变量,则可以在程序中声明一个static语句块该static语句块仅在该类第一次加载是执行。
1 | public class JStaticUse { |
static语句块仅在类第一次实例化时才执行,因此虽然程序生成两个对象,但语句“b=a*a”仅被执行了一次。
9.final关键字
- 关键字final可以用来修饰变量方法类。当final修饰基本数据类型是,该变量就成为了常量,值无法改变;当final修饰引用数据类型时,该变量的值不能改变,即值中存储的对象内存地址值不变,该变量不能再去指向别的对象,但对象内的成员可以改变。
- 当final修饰变量时,第一次赋值后就不能改变。
- final修饰的类,称为最终类,该类不能被继承。
- final修饰的方法不能被其所在类的子类覆盖。
- final修饰方法的参数,表示该方法不期望被传进来的参数有任何改变,示例如下:
1
2
3
4
5public void setValue(final int a,int b)
{
a=b; //编译出错,参数a用final修饰,无法改变值
b=10;
}
10.import和包
- 包可以使同名类在不同的包内共存,它既是一种命名机制也是可见度控制机制,可以在包内定义类,而且使包外的代码不能访问该类。
- 使用
*
形式导入整个包,尤其是在引入多个大包时,可能会增加编译时间,因此,明确指明你想导入的具体类而不是引入整个包在编译效率上可能会更好写。
(1)如果程序导入的两个不同包中存在具有相同类名的类,会发生什么情况?
假如程序导入了chap1和chap2这两个包中所有的类,并且两个包中都有JHelloWorld类,此时编译器不会报错,但是如果在程序中用到了JHelloWorld类,必须要指明该类来自哪个包,不然程序无法编译。指明的方法一种是在程序中需要用到JHelloWorld类的地方写明该类来自哪个包,另一类方法是在import的语句中专门指明该类,下面给出了一个例程:
1 | 文件名JPackageTestSameName.java |
(2)包与包之间是否有嵌套关系?
包与包之间是没有嵌套关系,假设存在包chap3.study.help外,还存在另一个包chap3.study,它们都是独立的包,包chap3.study.help并不是包chap3.study的子包,因此仅导入包chap3.study,是无法使用chap3.study.help中的类的。所以有时候见到下列代码,不用感到以疑惑,因为系统导入的是两个完全不同的包:
1 | import chap3.study.help.*; |