第四章 面向对象编程 上
1面向对象与面向过程
- 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程强调的是功能行为,以函数为最小对象,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象。以类/对象为最小单位,考虑谁来做。
- 面向对象三大特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
2 java基本元素:类和对象
类:属性 方法
3 对象的创建与使用
class Person{
String name;
int age;
boolean isMale;
public void eat(){
System.out.println("人可以吃饭");
}
public void sleep(){
System.out.println("人能睡觉");
}
}
Person p = new Person();
= "Tom";
p.isMale = true;
p.age = 18;
p.eat();p.sleep();
4类的成员之一:属性
属性 vs 局部变量
- 相同点
- 定义变量的格式一样, 数据类型 变量名 = 变量值
- 先声明,后使用
- 变量都有相对应的作用域
- 不同点
- 在类中声明的位置不同
属性:直接定义在类的{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量 - 关于权限修饰符的不同
属性:可以再声明属性是,指明权限,使用权限修饰符。
局部变量:不可以使用权限修饰符。
常见的权限修饰符:private、public、缺省、protected、final - 默认初始化值
属性:类的属性,根据其类型,都有默认的初始化值。
类型 |
默认值 |
整型byte、short、int、long |
0 |
浮点型double、float |
0.0 |
字符型char |
0 |
Boolean |
false |
引用数据类型类、数组、接口 |
null |
局部变量:无默认值。
特别的:形参在调用的时候,赋值即可
- 在内存中加载的位置不一样
属性:加载到堆空间
局部变量:加载到栈空间
5类的成员之二:方法
- 举例
- 按照是否有形参分类
无返回值 |
有返回值 |
|
无形参 |
void method(){} |
返回值类型 method(){} |
有形参 |
void method(形参列表){} |
返回值类型 method(形参列表){} |
- 方法的声明:
权限修饰符 返回值类型 方法名(形参列表){
方法体
} - 方法名:属于标识符,要见名知意
- return关键字的使用
- 使用在方法中
- 作用:
结束方法
针对于有返回值的方法,使用return返回想要的数据。
例子1:
public class CircleTest{
public static void main(String[] args){
Circle c1 = new Circle();
c1.radius = 2;
System.out.println("圆的面积为:" + c1.findArea());
System.out.println("矩形的面积为:" + method(12,8));
}
public static void method(int m,int n){
return m * n;
}
}
class Circle{
double radius;
public double findArea(){
return Math.PI * radius * radius;
}
}
例子2:
public class StudentTest{
public static void main(String[] args){
Student[] students = new Student[20];
for(int i = 0;i < students.length;i++){
students[i] = new Student();
students[i].number = (i + 1);
students[i].state = (int)(Math.random() * 6 + 1);
students[i].score = (int)(Math.random() * (100 - 0 + 1) + 1);
}
}
}
class Student{
int number; //学号
int state; //年级
int score; //得分
}
6 扩展一
6.1 匿名对象的使用
public class InstanceTest{
public static void main(String[] args){
Phone p = new Phone();
p.sendEmail();
p.playGame();
//匿名
new Phone().sendEmail();
new Phone().playGame();
}
}
class Phone{
double price;
public void playGame(){
System.out.println("玩游戏");
}
public void sendEmail(){
System.out.println("发邮件");
}
}
6.2 方法的重载
- 定义
在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可
public class OverLoadTest{
public static void main(String[] args){
OverLoadTest olt = new OverLoadTest();
System.out.println(olt.getSum(1.2,2.0));
//如不想声明对象,直接输出getSum();需将方法声明为静态(static)方法
//静态方法可以再没有对象实例的情况下直接调用
}
//如下的方法构成了重构
public int getSum(int i,int j){
return i + j;
}
public double getSum(double i,double j){
return i + j;
}
}
6.3 可变个数形参的方法
- 可变个数形参的格式 数组类型 … 变量名
public void show(String ... strs){
//TODO
}
//调用可变个数形参时,传入参数随意个
- 可变个数形参与数组类型不能同时存在
public void show(String ... strs){}
public void show(String[] strs){}
//JDk5.0以前用数组,所以不能同时存在
- 可变个数形参在方法的形参中,必须声明在最后,且只能声明一个可变形参
public void show(int i,String ... strs){}
- 引用类型的值转换 用类
class Data{
int m;
int n;
}
main(){
Data data = new Data();
data.m = 10;
data.n = 20;
swap(data.m,data.n);
}
swap(){
int temp = data.m;
data.m = data.n;
data.n = temp;
}
7 扩展二
7.1 OOP特征一:封装性
- 属性私有化,方法公有化
class Animal{
//私有化属性,公有化方法
private String name;
private int age;
private int legs;
//自动化生成Getter和Setter方法
public void setName(String name){
= name;
}
public String getName(){
return name;
}
//当一个属性没有配套的getter、setter方法时直接用属性名当做方法名
public int legs(){//实际上的方法全名是getLegs()
return legs;
}
//JavaBean
}
- 权限修饰符
修饰符 |
类内部 |
同一个包 |
不同包的子类 |
同一个工程 |
private |
√ |
|||
缺省 |
√ |
√ |
||
protected |
√ |
√ |
√ |
|
public |
√ |
√ |
√ |
√ |
7.2 类的成员之三:构造器
- 作用
创建对象
- 说明
- 如果没有显式的定义类的构造器的话,则默认提供一个空参构造器 (权限跟随类的权限)
- 定义构造器的格式: 权限修饰符 类名(形参列表){}
- JavaBean
- 类是公共的
- 有一个公共的无参构造器
- 有属性和对应的get、set方法
8 关键字的使用
8.1 this关键字的使用
- this可以用来修饰:属性,方法,构造器
- this修饰属性和方法:
- this理解为:当前对象
- this调用构造器
- 可以在构造器内用this()调用其他构造器,具体调用哪个看形参
- 构造器中不能通过this(形参列表)调用自己本身
- 规定:this(形参列表)必须放在本构造器的首行,且只能调用一个
8.2 package关键字的使用
- 为了更好的实现项目中类的管理
- 使用package声明类或接口所属的包,声明在首行
- 需要见名知意,一般为域名的反写
- 每个 “ . ” 代表一层文件目录