1. 对象
通常将对象划分成两个部分,静态方法和动态部分。
静态方法,就是不动的部分,这个部分被称为“属性”,任何对象都会就要自身的属性,如一个人,其属性包括高矮,胖瘦等。
动态部分是这个人具有的行为,如微笑,行走等
(1) 抽象出对象
(2) 识别对象的属性(静态属性)
(3) 识别对象的动态行为
可以将这些属性和行为封装在一起来描述这个对象
2. 类
不能将所谓的一个事物描述成一类事物,如一个鸟不能说成鸟类,如果要对一类事物统称,就需要引入类这个概念。
类是一类事物的统称,如人类,鸟类。类是构造对象所依赖的规范,如一只鸟有一对翅膀,它可以利用翅膀来飞行,而基本上所有的鸟类都具有翅膀和飞行的技能,这样具有相同属性和行为的一类事物就定义类
3. 面向对象的三个特征
1. 封装性
将对象的属性和行为封装在一起,其载体是类,类通常对客户隐藏其实现的细节。
保证了类内部数据结构的完整性,应用该类的用户不能轻易直接操作此数据结构,只能执行类允许公开的数据。这样就避免外部操作内部数据的影响,提高了程序的可维护性
2. 继承性
类与类之间同样具有关系,主要利用特定对象之间的特定的共有属性,例如,平行四边形是四边型,正方形和矩形也是四边形,可以把平行四边形看作四边形的延伸,平行四边形复用了四边形的属性和行为,同时添加了平行四边形独有的属性和行为,这里可以将平行四边形看作是从四边形类中继承的。平行四边形称为子类,四边形称为父类,子类的事例都是父类的事例。
3. 多态性
每个图型都有自己的特征,抽象类不能实例化对象。在多态的机制中,父类通常定义为抽象类,在抽象类中提供给一个方法的标准,而不给出的具体的实现流程,实际上这个方法也是抽象的,在多态机制中,比抽象类更方便的方式是将抽象类定义为接口,其抽象方法组成的集合就是接口。
1. 成员变量
在java中对象的属性也称为成员变量
2. 成员方法
在java语言中使用成员方法对应类对象的行为。
权限修饰符 返回值类型 方法名(参数类型 参数名){
//方法体
Return 返回值
}
3. 权限修饰符
1. Private
如果一个类的成员变量或成员方法被修饰为private,则该成员变量只能在本类中被使用,在子类也是不可见的,并且对其他包的类也是不可见的。
2. Public
除了在本类中使用这些数据外,还可以在子类和其他包的类中使用。
3. Protected
只有本包内的该类的子类能够使用
Class anyclas{
Public void doString(){
...//方法体
}
}
如果一个类不被public private protected设置类的权限,则这个类预设为包存取范围,其只有一个包中的类可以调用这个类的成员变量或成员方法。上面这个例子中使用默认修饰符,即只有一个包内的其他类和子类可以对该类进行访问,但是doString()方法是被public修饰,但是根据JAVA语言的规定,类的权限设定会约束类成员的权限设定
4. 局部变量
在成员方法中定义一个变量,那么这个变量被称为局部变量。
局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化。
Public String getName(){
Int id=0; //局部变量
setName(“java”);
Return id+this.name;
}
5. 局部变量的有效范围
可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止
6. this关键字
有以下例子
public void setName(String name){ //定义一个setname()方法
This.name=name; //将参数值赋予类中的成员变量
}
在java语言规定中,用this关键字来代表本类对象的引用。This关键字被隐式地用于引用对象的成员变量和方法,在上述代码中,this.name指的就是BOOK类中的name成员变量,而this,name=name中的第二个是形参name.
事实上,this引用的就是本类的一个对象,当局部变量或方法参数覆盖了成员变量时,上面这个例子就是添加this关键字明确引用的是类成员还是局部变量或方法参数。
如果省略this关键字直接写成name=name;那么只是把参数name赋值给参数变量本身而已,成员变量name的值并没有改变,
Public Book getBook(){
Return this; //返回BOOK类的引用
}
方法的返回值类型为book类,所以方法体中使用return this 这种形式将book类的对象进行返回
4. 类的构造方法
在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类名的方法,对象的创建就是通过构造方法完成的。每当实例化一个对象时,类会自动调用构造方法。
构造方法有以下特点:
1. 构造方法没有返回值
2. 构造方法的名称要与本类的名称相同。
3. 格式为:
public book(){
...//构造方法体
}
在构造方法中可以为成员变量赋值,这样当实例化一个本类对象时,相应的成员变量也将被初始化。
如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认的构造方法。
5.静态变量,常量和方法
有static修饰的变量,常量和方法被称为静态常量,静态变量,静态方法
静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和”.”符调用静态成员。
class $5{
final static double PI=3.1415;//此处如果没有用static修饰,在别的方法里面无法调用
int id;
public static void method1() {
System.out.println("6666");
}
public void method2() {
System.out.println($5.PI);
System.out.println($5.id);//此处无法调用参数Id,非静态变量
$5.method1();
}
}
Java语言规定对于静态方法有两点规定:
1. 在静态方法中不可以使用this关键字。
2. 在静态方法中不可以直接调用非静态方法
3. 不能将方法体内部的局部变量定义为static
4. 如果执行类时,希望先执行类的初始化动作,可以先使用static定义一个静态区域。
Public class example{
Static{
//some
}
}
红色块先执行
6.类的主方法
Public class example(){
Public static void main(String[] args){
//dosomethings
}
}
1. 主方法是静态的,所以如要在主方法中调用其他方法,则该方法也要是静态的。
2. 主方法没有返回值 void
3. 主方法的形参为数组。其中args[0]-args[n]分别代表程序的第一个参数到第n个参数,可以使用args.length获取参数个数
7. 对象
Java是一门面向对象的语言,对象由类抽象出来,所有的问题通过对象来处理,对象可以操作类的属性和方法 解决相应的问题。
1. 对象的创建
Test test =new Test();
类名 创建Test类对象 创建对象操作符 构造方法的参数
test被创建出来后,就是一个对象的引用,这个引用在内存中为对象分配了存储空间
2.访问对象的属性和行为
$4 test=new $4();
test.showArrays(array);
test.transfer(array, array2);
System.out.println();
test.showArrays(array2);
2. 对象的引用
类名 对象引用名称
3. 对象的比较
String c1=new String("abc");
String c2=new String("abc");
String c3=c1;
System.out.println((c2==c3));//比较对象的地址 false
System.out.println((c2.equals(c3)));//true,形式上比较
System.out.println((c1==c3));//引用相同所以是true
4. 对象的销毁
每个对象都有生命周期,当对象的生命周期结束时,分配给对象的内存地址将会被回收,在其他语言中需要手动回收废弃的对象,但java拥有一套完整的垃圾回收机制
以下两种情况
1. 对象的引用超过其作用范围,这个对象将被视为垃圾
{
Example e =new Example();
}
2. 将对象赋值为Null
{
Example e= new Example();
e=null; //此时对象消亡
}
虽然垃圾回收机制已经很完善,但只能回收由new操作符创建的对象。如果某些对象不是通过New操作符在内存中获取一块内存区域,这种对象可能不能被垃圾回收机制所识别,所以在java中提供了一个finalize()方法。这种方法是object类,它被声明为protected,用户可以在自己的类中定义这个方法。如果用户在类中定义了finalize()方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作发生时,才能真正被对象占用。
有时候垃圾回收机制没有按预期的来执行,java提供了System.gc()方法强制启动垃圾回收器。
作 业
1. 尝试编写一个类,定义一个private变量,并定义两个成员方法,一个成员方法实现为此成员变量赋值,另一个方法获取这个成员变量的值,保证其他的类继承时能获取该成员变量的值。
public class $89 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
$78 test=new $78();
test.test();
}
}
class test2 {
private int a; //只允许本类使用这个变量
void method(int a) {
this.a=a;
}
public int method2() {
return a;
}
}
class $78 extends test2{
public void test(){
super.method(78);//super关键字调用父类方法利用method方法修改a的值
int a=super.method2();//将修改改过的值赋给a
System.out.println(a);
}
}