文章目录
面向对象程序设计简介
1.面向过程程序设计
-
概念
- 以功能为基础,采用自顶向下,逐步细化的方法。
- 将大问题划分为若干个小问题,再将小问题细化为每个功能
-
缺陷
- 代码的重用性和可维护性差。
- 数据和对数据的操作分离,数据安全不能保证。
2.面向对象程序设计
-
概念
- 将属性及其方法封装为类,以类的对象作为程序的基本元素
- 通过向对象发送消息,从而调用相应方法完成各种功能。
-
特点
- 对象为基本元素,数据较为安全
- 程序的维护量较小、代码的重用率高(继承)
-
三大特性:封装、继承、多态
三大特性简介
1.封装
-
概念
- 将数据和处理数据的方法封装为类
- 可以将某些成员声明为
private
从而达到信息隐藏的目的
-
封装性
- 将属性(数据)和处理这些属性(数据)的行为(方法)结合起来
- 仅对外公开接口以达到信息隐藏的目的。
2.继承
-
概念
-
如果一个类B继承自另一个类A,就把这个B称为A的派生类,而把A称为B的父类也可以称「A是B的超类或基类
-
继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。
-
-
优势:提高了代码的重用率,提高了编程效率。
3.多态
-
概念
- 同一操作作用于不同的类的对象,将产生不同的执行结果 。
- 一个对外接口,多个内在实现方法
-
优势:增强了程序的灵活性。
-
举例
类与对象
1.概念
-
类与对象
-
对象:现实世界中某个具体的物理实体在计算机逻辑中的映射和体现。
-
类:是一种抽象的数据类型,是同种对象的集合与抽象,是具有共同行为和属性的若干对象的统一描述体。
-
-
二者间的关系
- 类是一个模板,它描述一类对象的行为和状态,对象是类的一个实例,有状态和行为。
- 类是创建对象的模板,对象是类的实例
2.相关语法
-
类
-
定义语法
//[访问权限修饰符] class 类名 { // 成员的声明和定义 ; //} //定义一个学生类 public class Student { //成员属性(保存数据) int num; //学号 String name;//姓名 String gender;//性别 private int age;//年龄(加上private意味着age属性只能在当前类内进行访问) //成员方法(行为,不是静态方法,不能加static修饰 void study(){ System.out.println("我爱学习"); } }
-
注意
- class是声明类的关键字,<类名>是标识符,通常以首字母大写开头,用来与对象名,方法和变量名区分。
- 类体可以包含成员属性和成员方法两部分,成员属性声明必须以分号结束。
- 访问权限修饰符有:
private/protected/public
-
-
对象的实例化
-
类只是抽象的数据类型,类的对象才是具体可操作的实体。利用对象使用类提供的功能。
-
格式:
<类名> <对象名> = new <类名> ([参数1,参数2,…]) ;
或<类名> <对象名>;<对象名> = new <类名> ([参数1,参数2,…]) ;
Student stu1 = new Student(); Student stu2; stu2 = new Student();
-
-
类成员的访问
-
访问属性的一般形式:
<对象名>.<属性名>;
-
访问方法的一般形式:
<对象名>.<方法名>([<参数1>,<参数2>,…]);
stu1.num = 14132;//存储数据对象名+点号+方法名 stu1.name = "吴小祖"; stu1.gender = "男"; System.out.println(stu1.name);//吴小祖 stu1.study();//打印“我爱学习”
-
-
public、private访问权限修饰符的作用
访问权限修饰符 类内 类外 被本类成员方法访问 被本类对象引用 public √ √ private √ × public class Student { private int age;//年龄(加上private意味着age属性只能在当前类内进行访问) void setAge(int val) { if (val < 0) { System.out.println("输入年龄不合法"); } else { age = val; } } //获取属性的值(设置私密是类内输出) int getAge(){ return age; } }
类的成员
1.成员方法
-
定义语法
[方法修饰符] 方法返回值类型 方法名([<参数列表>]) { 方法体; }
-
方法的返回值类型
-
不需要返回值,返回值类型被说明为
void
。public static void triplesalary(Employee x){ x.setSalary(x.getSalary() * 3); }
-
有返回值,return语句要加返回表达式,且表达式的值必须与方法中的返回值类型一致。
public String getName(){ return name; }
-
-
方法名
- 是Java语言合法的标识符。
- 尽量做到见到名字知道做什么用。
-
方法体
- 包含了实现方法功能的Java语言程序代码。
- 方法体中可以定义局部变量
- 作用域仅在方法体内。方法体用“{}”括起来。
2.方法传参
-
值传递:方法不可以改变实参的值
public class Aitthmetic { public static void main(String[] arges){ double percent = 10.0; System.out.println("brfore:" + percent); tripleValue(percent); System.out.println("behind:" + percent); } //形参是基本数据类型:采用值传递,方法内修改实参,不会影响实际参数的值 public static void tripleValue(double x){ x *= 3; } }
-
引用传递:方法体内,通过引用改变了实际参数对象的内容
public class EmText { public static void main(String[] arges){ Employee harry = new Employee(); harry.setName("harry"); harry.setSalary(4000.0); harry.printMassage(); triplesalary(harry); harry.printMassage(); //定义一个静态方法实现两个数的交换 } //形参是引用数据类型:采用引用传递(地址传递),方法内对形参修改,实参也会被修改 public static void triplesalary(Employee x){ //将工资提高为原来的三倍 x.setSalary(x.getSalary() * 3); } }
-
总结
- 当参数是基本数据类型时,方法不能修改实际参数的值。
- 当参数是引用类型时,方法通过地址引用改变了实际参数对象的内容。
方法重载
1.概要
- 同一个类中两个或以上的同名方法,参数类型、个数或顺序不同,称为方法的重载。
2.方法重载依据
-
方法名相同
-
参数列表必须不同(传参个数、传参类型
public void add(int left, int right){ System.out.println(left + right); } //参数类型不同 public void add(double left, double right){ System.out.println(left + right); } //顺序不同 public void add(int left, double right){ System.out.println(left + right); } //注:此类不算做重载,未满足要求 public void add(int right, int left){ System.out.println(left + right); }
3.注意
-
返回值类型可以不同(返回值类型不作为重载的依据)
-
是否是静态的也不作为重载依据
-
重载的方法之间可以互相调用
public void add(int x, int y, int z){ add(x + y, z); }
构造方法
1.概要
功能 | 方法名 | 参数 | 返回值 | 内容 | 调用方法 |
---|---|---|---|---|---|
初始化对象 | 与类名相同 | 可有可无 | 不指定 | 通常只包含成员赋值语句,但原则上是任意的 | 使用 new创建对象时自动调用 |
public class Student {
//成员属性(保存数据)
int num; //学号
String name;//姓名
String gender;//性别
private int age;//年龄(加上private意味着age属性只能在当前类内进行访问)
//定义构造方法:初始化对象的属性,也可以用访问权限修饰符修饰
public Student(){
//给属性赋值的语句(理论上可以写任意代码)
num = 221001212;
name = "吴小祖";
age = 20;
}
public Student(int num, String name, int age){
this.num = num;
this.name = name;
this.age = age;
}
public void printMassage(){
System.out.println("姓名:"+ name + "\n" + "学号:" + num + "\n"
+ "年龄:" + age);
}
//当一个类中没有显示定义任何构造方法时编译器会生成一个默认构造方法
// public Student(){
//
// }
}
//为定义构造方法之前
//stu1.printMassage();//姓名:null 学号:0年龄:0
//定义构造方法之后
stu1.printMassage();//姓名:吴小祖 学号:221001212 年龄:20
2. this 关键字
-
this用于引用本类中的属性和方法
this.属性、this.方法()
-
this调用本类的构造方法(只能放在重载的构造方法中的第一行)
使用this()、this(参数)的形式
public Student(int aId){
this();//必须放在某个构造方法的第一行
num = aId;
}
//成员属性与方法参数名重名必加 this
void setName(String name){
this.name = name;
}
//注:(编码规范)参数名与属性名相同
垃圾收集器
1.概述
- 内存管理的一种自动解决的方案
- 缺点:不能完全控制“垃圾收集器”什么时候执行或不执行。
2.何时运行
垃圾收集器受JVM
的控制,JVM
决定什么时候运行垃圾收集器。
- 当
JVM
感到内存不足时会运行垃圾收集器 - 在Java程序中可以请求
JVM
运行垃圾收集器,但无法保证JVM
会答应请求
3.如何运行
- 当没有引用能够访问对象时,该对象就是适合进行垃圾收集的。
- 空引用、隔离引用