目录
一、类与对象:
- 面向对象:关注现实存在的事物的各方面的信息,从对象的角度出发,根据事物的特征进行程序设计。
- 类(抽象):是模板,确定对象将会拥有的特征(属性)和行为(方法),是具有相同属性和方法的一组对象的组合。属性是对象具有的各种静态特征,方法是对象具有的各种动态行为。
- 对象(一个看得到、摸得着的具体实体):是类的实例表现,是描述客观事物的一个实体。
二者关系:类是对象的类型,对象是特定类型的数据。
通常,先定义类,再由类去实例化对象。
一个类的成员属性是有默认初始值的,见下表。
基本类型 | 默认值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | '\u0000' |
boolean | false |
对象 | null |
重载:在同一个类中,相同方法名,不同参数。
二、单一职责原则:
单一职责原则:一个类应该有且只有一个引起功能变化的原因,即一个类最好只有一个功能,只干一件事。(因为如果一个类承担的功能越多,其交融耦合性就越高、被复用的可能性越低)
所以在程序设计中,我们尽量把不同的职责放在不同的类中,把不同的可能引发变化的原因封装在不同的类中,这样当一方发生变化时对其他参与者的影响会大大减少。尤其main方法通常要放在一个单独的类中。
三、对象实例化:
实例化对象的过程可分为2部分:先栈后堆
①声明对象:
如:Cat one
在内存的栈空间中开辟了一块区域名为one,但此时还非真正有效的对象,里面是空的。
②实例化对象:
如:new Cat()
在内存的堆空间中开辟了一块区域完成了对象的相关信息的初始化操作。
这2部分通过赋值符号关联(Cat one=new Cat();):在栈中存储了堆中一个地址的引用,使钥匙和房间对应。
”Cat two=new Cat();“使又生成了一个该类的对象two,它拥有1把新的钥匙指向1个新的房间。
”Cat one=two;“ 使对象one和two指向同一块内存,就像1个房间有2把钥匙。
四、构造方法:
1.结构:
public 构造方法名() {
}
①构造方法名与类名相同。
②无返回值。
③只能在对象实例化时调用,不能通过对象名调用。(与new配合使用)
在对象实例化时,会去调用它的构造方法并完成相应的构造方法中的操作,调用结束后再回到实例化语句中依次完成其后操作。
④当没有指定构造方法时,系统会自动添加无参构造方法。
⑤当有指定构造方法时(无论有参、无参),系统都不会自动添加无参构造方法。
⑥一个类中可有多个构造方法。
2.举例:
Cat类:
package comm;
public class Cat {
String name;
int month;
double weight;
//带参构造方法
public Cat(String name,int month,double weight) {
name=name;
month=month;
weight=weight;
}
}
CatTest类:
package comm;
public class CatTest {
//单一职责原则
public static void main(String[] args) {
//对象实例化,调用构造方法
Cat c=new Cat("荣耀",5,1000);
System.out.println("昵称:"+c.name);
System.out.println("年龄:"+c.month);
System.out.println("体重:"+c.weight);
}
}
结果:
通过构造方法传递的参数没有赋值给类的属性!
分析:因为该构造方法的参数名和类的属性名完全一样,赋值时根据就近原则,会优先把值赋给同一作用域中同名成员。找不到时才会扩大搜索范围,到它所在的类中查找。
解决:
法①修改构造方法的参数名(麻烦,不推荐)
Cat类:
package comm;
public class Cat {
String name;
int month;
double weight;
//带参构造方法
public Cat(String newName,int newMonth,double newWeight) {
name=newName;
month=newMonth;
weight=newWeight;
}
}
法②使用this关键字
this代表当前对象(谁调用谁就是当前对象)。
package comm;
public class Cat {
String name;
int month;
double weight;
//带参构造方法
public Cat(String name,int month,double weight) {
this.name=name;
this.month=month;
this.weight=weight;
}
}
this还可以调用方法。
注意构造方法在类内使不能被普通成员方法直接调用。但是同一个类的构造方法间可以直接相互调用,通过this(),带参的把参数写在括号里。
this用法总结:
①调用成员属性,解决成员属性与局部变量同名的冲突:this.name=name;
②调用同类中的其他成员方法:this.eat();
③同类中的重载的构造方法间相互调用:this(); 必须放在构造方法的第一条!
五、封装:
1.概念:
- 将类的某些信息隐藏在类内部,不允许外部程序直接访问。
- 通过该类提供的方法来实现对隐藏信息的访问。
- 隐藏对象的信息。
- 留出访问的接口。
2.特点:
①只能通过规定的方法访问数据。
②隐藏类的实例细节,方便修改和实现。
3.实现步骤:
六、包:
1.包名(全部小写)命名规范:域名倒序+模块名+功能名
语法:package 包名;
注意:①必须放在Java源文件的第一行。
②一个Java源文件中只能有一个package语句。
2.如何跨包调用类?
①导入该包所有类:import 包名.*;(效率低且只能访问指定包名下的类,无法访问子包下的类)
②导入该包特定类:import 包名.类名;(推荐,高效)
③在使用该类时直接写明“包名.类名”。(麻烦,不推荐)
注意:加载类的顺序和import导入语句的位置无关。
④其他:
java.lang | 包含Java语言基础的类,该包系统加载时默认导入。 如:System、String、Math... |
java.util | 包含Java语言中常用工具。 如:Scanner、Random... |
java.io | 包含输入、输出相关功能的类。 如:File、InputStream... |
七、static关键字:
被static修饰的成员是静态成员、类成员。在成员方法中可以直接访问类中的静态成员。
静态成员/类成员:
①是类对象所共享的。
②在类加载时产生,直到类销毁时猜释放,生命周期长。
③访问方法:a.通过“对象.成员”访问
b.通过“类.成员”访问
具体:
- 被static修饰的属性是静态属性、类属性。可以通过this.调用。
- 被static修饰的方法是静态方法、类方法。由上可知,调用可通过“类.成员”(推荐)或“对象.成员”。注意静态方法中不能直接访问非静态成员,只能直接调用静态成员。若一定要访问非静态成员,则只能通过对象实例化后、“对象.成员方法”访问。静态方法中不能使用this。
- static不能修饰类。
- static不能修饰方法内的局部变量。
八、代码块:
在类中可以通过大括号去限定一个代码块,当代码块存在于方法中时,称之为“普通代码块”;存在于类中时,称之为“构造代码块”。构造代码块前加上static关键字时会变成“静态代码块”。
静态代码块只会执行一次,构造代码块在每次对象构造时调用,普通代码块在每次调用方法时顺序调用。