4.1 类
1.声明类:
class 类名{
......
}
2.类体构成
(1):变量(成员变量)的声明:用来储存属性的值,如果没有指定初值,java会为其指定默认值。boolean变量默认值false;char默认值'\0';float和double默认值为0.0,引用型变量默认值为null
(2):方法的定义: 方法可以对类中声明的变量进行操作,即给出算法,体现对象的行为
class Ladder{
float above;
float bottom;
float height;
float area;
float computerArea(){
area=height*(bottom+above)/2
return area;
}
void setHeight(float h){
height=h;
}
}
4.2方法
4.2.1.方法头和方法体
- 方法头:由方法的类型、名称、名称之后的小括号以及参数列表构成(可分为有参和无参)
- 方法体:花括号之间的内容就是方法体,可在此之间对成员变量和方法体中的局部变量(方法体中声明的变量或者是方法的参数)进行操作
int getSum(int n){ //参数n是局部变量
int sum=0; //sum也是局部变量,局部变量只能在方法体中有效
for(int i =1;i<=n;i++){
sum=sum+i;
}
return sum;
}
4.2.2区别成员变量和局部变量
1.方法中的局部变量和类中的成员变量名字相同,那么成员变量被覆盖,成员变量被隐藏
2.如果要使用该隐藏的成员变量需要使用关键字this
3.局部变量没有默认值
class Tom{
int x=10,;y
void f(){
int x=5;
y=x+x; //这个得出来是10
y=x+this.x; //y=15
}
}
4.需要注意的问题:
- 对成员变量的操作只能放在方法中(比如说赋值操作a=1)
- 但是声明成员变量时可以赋予初值
4.2.3 UML图
Ladder |
above:float bottom:float height:float area:float |
computerarea():float setHeight(float):void |
简单介绍:第一层是名字层常规字形表示该类是具体类,如果类的名字是斜体字形,表明该类是抽象类。第二层是变量层,列出成员变量及其类型。第三层是方法层,也称操作层列出类中的方法,格式是方法(参数):方法类型
4.3构造方法与对象创建
前言:在面向对象语言中,用类声明的变量用类声明的对象。和基本数据不同,在用类声明对象后还必须创建对象,即为对象分配所拥有的变量。没有类就没有对象!
4.3.1 构造方法
- 当程序用类创建对象时需要用它的构造方法
- 允许一个类中有多个构造方法但是保证参数不同(参数个数不同/参数个数相同,参数类型不同)
Class Point{ int x,y; Point(int a,int b){ x=a; y=b; } Point(short a,short b){ x=a; y=b; } }
- 没有编写构造方法,系统会默认该类只有一个构造方法,该默认的构造方法是无参数的,且方法体中没有语句;如果提供了构造方法,Java则不会提供默认构造方法
- 构造方法没有类型
4.3.2 创建对象
- 对象的声明: 类的名字 对象名字
- 创建对象: 使用new运算符和创建类的构造方法为声明的对象分配变量,这个过程就称为创建对象。
class Point{ int x,y; Point(inta,int b){ x=a; y=b; } } public class Examplie4_2{ public static void main(String args[]){ Point p1,p2; p1=new Point(10,10); p2=new Ponit(20,20); } }
-
对象的储存模型: 声明一个对象,此时该对象没有任何实体(成员变量)不能进行任何操作,用new运算符和构造方法为其分配变量。此时类中的成员变量会被分配内存空间,并返回一个引用值给该对象,不同对象的引用和内存空间不一样
4.3.2 使用对象
- 通过" . "访问符,实现变量的调用和方法的访问
4.3.3 对象的引用和实体
- 输出对象的引用值:
下面通过一个小例子说明:
package 类的引用;
public class Example4_4 {
public static void main(String args[]) {
Point p1 =null,p2=null;
p1= new Point();
p2= new Point();
System.out.println("p1的引用是"+p1);//输出的是十六进制的
System.out.println("p2的引用是"+p2);
p1.setXY(100, 100);
p2.setXY(30, 20);
System.out.println("p1的x,y的坐标:"+p1.x+","+p1.y);
System.out.println("p2的x,y的坐标:"+p2.x+","+p2.y);
p1=p2;
System.out.println("将p2引用值赋给p1后:");
int address= System.identityHashCode(p1);
System.out.printf("p1的引用:%x\n", address); //原本输出的不是十六进制的,通过转化变成十六进制的
}
}
4.4 参数的传值
4.4.1 传值机制
- 什么是实参什么是形参: 首先,reverse方法中传递一个arr 数组的引用和和一个int 型 k 。这里方法的参数习惯上被称为形参,而向其传值的变量或者常量为实参。这里第一个红箭头指的是形参,第二个指的是实参(方法中的参数被称作形式参数,)
- 值传递和引用传递: 值传递就是在调用方法时,实参把它的值给到形参,形参把这个值拷贝一份,再拿到方法里用。所以传参之后它俩互不相关了,形参的改变就不会影响到实参。而引用传递,在调用方法时传递的是值的引用,也就是说形参拿到的是实参所对应的内存空间的地址,那么传参之后形参和实参指向的就是同一个内存空间,理所当然实参会跟形参一起改变。(但是为什么说改变实参的值(实参为变量),形式参数不变。不太懂是指的是先给形参传值,然后再改变实参的话形参不会遍吗?)
4.5 可变参数
- 指在声明方法时不给出参数列表中从某项开始直至最后一项参数的个数和名字,但是这些参数的类型必须相同,可以前面几个都是不同类型的但是x的参数列表必须是最后一个
public void f(int...x)
public void f(double a,int...x)
- 用于计算整数个数变化且又无规律可循的情况
public int getSum(int...x){ int sum=0; for(int i=0;i<x.length;i++){ sum=sum+x[i] //参数代表可以通过下标来访问,类似于数组 } return sum; }
-
还有可以用for循环加强
for(int param:x){
sum=sum+param;
}
4.6 对象的组合(关联关系)
1.对象A组合了对象B,就可以委托对象b调用其方法
2.见书上一个例子p81和p84的例子
重点:区别关联关系(p84和p83)和依赖关系(p81),改错。
4.7实例成员(方法)与类成员(方法)
4.7.1 成员
1.成员变量细分为实例变量和类变量
class Dog{
float t; //实例变量
static int y; //类变量,也被称作静态变量
}
2.所有对象共享类变量,并且该类变量在创建新对象时就会被分配相应的内存,不同对象的该变量 的内存空间相同。
3.可直接通过类访问类变量
4.7.2 方法
1. 方法前是否加static,加则为类方法,不能用static修饰类方法
2.实例方法可以操作类变量也可以操作实例变量,类方法可以直接通过类调用也可以通过对象调用
4.8 方法重载
4.8.1 方法重载的语法规则
1. 参数个数不同
2.参数个数相同,但参数列表中对应的某个参数的类型不同
class People{
float hello(int a, int b){
return a+b;
}
}
float hello(long a, int b){
return a-b;
}
public class Example4_12{
public static void main(String args[]){
People tom=new People();
System.out.println(tom.hello(10,20));
System.out.println(tom.hello(10.20));
}
}
4.9 this 关键字
1. 在构造方法中使用this代表使用该方法所创建的对象
2. 在实例方法中出现this,代表当前使用该方法的对象
3. 在一个实例方法中调用类方法或者其他方法,可以省略this.或者类名.