1、 类的声明
抽象的目的是产生类,类的目的是创建具有属性和行为的对象,
对象的属性(对象操作自己的变量)
对象的行为功能(对象调用类中的方法)
在主类的main方法中使用类来创建对象
Java1
class 梯形{ //类体:类声明之后的“{ }”+括号里面的内容
float 上底,下底,高,laderArea;//变量声明:变量类型 变量名;
float 计算面积(){ ; //方法定义:方法返回类型 方法名 (方法的参数){ … }
laderArea=(上底+下底)*高/2.0f;/*方法体:方法声明之后的“{ }”
*+括号里面的内容*/
return laderArea;
}
void 修改高(float h){
高=h;
}
}
(注意:类名第一个字母大写)
2、变量(成员变量(类变量、实例变量)+局部变量)
(注意:变量名第一个单词第一个字母小写,其后单词第一个字母大写)
2.1(1)成员变量(类变量、实例变量):在变量声明部分声明的变量是类的成员变量
有效范围:在整个类内都有效,与其先后位置无关
(2)局部变量:①方法的参数 和 ②方法体中声明的变量 是局部变量
有效范围:①方法参数在整个方法体内有效;
②方法内的局部变量从声明它的位置之后开始有效(其声明在复合语句/循环语句,仅在其复合语句/循环语句中有效
2.2成员变量的隐藏
Java2
class Tom{
int x=98,y;
void f(){
int x=3;
y=x; //显示的是局部变量,y得到的值是3,而不是98
}
}
(方法体中局部变量名与成员变量名同,方法就隐藏了成员变量。用this关键字显示成员变量)
Java3
class三角形{
float sideA, sideB,sideC,lengthSum;
void setSide(float sideA, float sideB,float sideC){
this,sideA=sideA;
this,sideB=sideB;
this,sideC=sideC;
}
}
(this,sideA this,sideB this,sideC分别表示成员变量的sideA, sideB,sideC)
2.3类变量/静态变量:关键字static放在变量类型前修饰e.g:static int y;
实例变量:无static修饰 e.g:float x;
3、方法(构造方法+实例方法+类方法)
3.1 类方法/静态方法:static放在方法类型前修饰e.g:static void speak(String s){…};
只能对类变量进行操作
实例方法:无static修饰 e.g:void f(){…};
对类变量和 实例变量 都能操作
(注意: 一个类中的方法可以相互调用,实例方法可以调用类中的其他方法,类方法只能调用该类的类方法,不能调用实例方法,不可以操作实例变量(p84原因:因为在类创建对象之前,实例成员变量还没有分配内存,而且实例方法也没有入口地址。))
3.2 构造方法:是一种特殊的方法,用类创建对象时用构造方法
E.g: Xyjrw zhubajie=newXyjrw();//new运算符和默认的构造方法
①构造方法的名字必须和它所在的类的名字完全相同
②构造方法没有类型
③构造方法可以重载
④赋初值:构造方法对变量初始化or成员变量在声明时指定初值
(注意:对成员变量的操作只能放在方法中,方法可以对成员变量和该方法体重声明的局部变量操作。在声明类的成员变量时可以同时赋值。)
Java4
class A{
int a=12;//合法声明成员变量同时赋值
float b;
b=12.56f;//非法这是赋值语句,不是变量的声明,语句只能出现在方法体中
}
4、java中的2中多态性:
方法重载(Overload)+方法重写(Override)/覆盖
(1)方法重载(Overload)(一个类中)
目的:用自己的方法
Java5
class Area{
float getArea(float r){
return 3.14f*r*r; //浮点型+f
}
double getArea(float x, float y, float z,){ //参数个数不同
return (x*x+y*y+z*z)*2.0;
}
double getArea(float x,int y){ //参数类型不同
return x*y;
}
}
①一个类中可有多个方法具有相同的名字(getArea),但这些②方法的参数个数或 参数类型必须不同。(是参数类型,不是方法类型,方法类型不同也得保证参数类型不同)
(2)方法重写(Override)/覆盖(子类,继承extends,不属于新增的方法)
目的:子类通过重写可隐藏已继承的实例方法。
(隐藏父类的,用自己的方法;重写方法可操作继承的成员变量和子类新声明的成员变量;
子类想用隐藏的方法,必须使用关键字super
方法重写(Override)/覆盖:①在子类中定义一个方法,该方法的类型和父类的方法的类型or父类的方法的类型的子类型一致;②这个子类方法的名字、参数个数、参数类型和父类的方法完全相同;
5、对象
在主类的main方法中使用类(之前写好的类)来创建对象
5.1 创建对象(对象的声明+为声明的对象分配内存)
对象的声明:类的名字 对象名字;e.g:Xyjrw zhubajie;//声明对象
为声明的对象分配内存:new运算符 类的构造方法;e.g:zhubajie=new Xyjrw();
合:Xyjrw zhubajie=new Xyjrw();//声明对象并为其分配内存
(注意:
Java6
class Point{
int x,y;
Point(int a,intb){
x=a;
y=b;
}
}
Public class Haha{
Public staticvoid main(String args[]){
Point point1,point2; //声明对象point1和point2
point1=new Point(10,10);//合法:使用new和Point类中的构造方法
Point2=new Point():; /*不合法:若类中定义了一个或多个构造方法,那java就不*提供默认的构造方法了。此处用了默认的构造方法,解决:①Point类中提供默认的构造方法②用Point中的方法Point2=new Point(12,13);。*/
5.2使用对象
抽象的目的是产生类,类的目的是创建具有属性和行为的对象,
(1)对象操作自己的变量(对象的属性):对象.变量;
(2)对象调用类中的方法(对象的行为功能):对象.方法;
(3)体现封装:(注意:局部变量在声明时若无初始化,就无默认值,故在使用局部变量之前,要事先为其赋值。)
5.3对象的引用和实体
数据结构:堆栈
Java的对象在堆中分配内存,对象的引用在栈中分配内存。就是说,当用类创建一个对象时,类中的成员变量在堆中分配内存空间,这些内存空间称为该对象的实体或对象的变量,而对象中存放着引用,该引用在栈中分配内存,以确保实体由该对象操作。
p70
p1 12 x p1
0xAB 16 y 0xDD 6 x
P2 6 x p2 18 y
0xDD 18 y 0xDD
图1对象内存模型 图2 p1=p2后的对象内存模型
图1
Point p1=new Point(12,16);
Point p2=new Point(6,18);
图2
p1 = p2;
一个类创建的两个对象,如果具有相同的引用,那么久具有完全相同的实体。没有实体的对象称为空对象,空对象不能使用。注意:由于对象是动态地分配实体,故Java的编译器对空对象不做检查,在编写程序时要注意避免使用空对象。)
6、参数传值
方法在被调用时,若方法有参数参数必须要实例化,即参数变量必须有具体的值。
(1)对于基本数据类型的参数e.g:向float型参数传递一个int值(√)
向级别高型参数传递一个级别比它低的类型的值
(2)引用:p74
abstract修饰符用来修饰类和成员方法
a:用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化。
b:用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。
abstract的规则:
a:抽象类可以没有抽象方法,但是有抽象方法的类必须定义为抽象类,如果一个子类继承一个抽象类,子类没有实现父类的所有抽象方法,那么子类也要定义为抽象类,否则的话编译会出错的。
b:抽象类没有构造方法,也没有抽象静态方法。但是可以有非抽象的构造方法
c:抽象类不能被实例化,但是可以创建一个引用变量,类型是一个抽象类,并让它引用非抽象类的子类的一个实例
d:不能用final 修饰符修饰(修饰方法还是类?