整体介绍:
- 学完这部分内容后,你能够:
- 会创建类和对象
- 掌握面向对象的三大特性:封装、继承、多态
- 掌握抽象类和接口的使用
- 掌握程序中的异常处理
- 会使用面向对象思想进行编程
一.目标
- 掌握类和创建对象的关系
- 定义类
- 定义对象
- 定义和调用方法
1.1 开发方法的不同
结构化开发
- 面向功能划分软件结构
- 自顶而下
- 最小的子系统是方法
- 制约了软件的可维护性和可扩展性
面向对象开发
- 把软件系统看成各种对象的集合
- 系统结构较稳定
- 子系统相对独立
- 软件可重用性、可维护性和可扩展性强
二.概念
类:具有相同属性和方法的一组对象的集合
对象:用来描述客观事物的一个实体,由一组属性和方法构成
方法——对象执行的操作
类是对象的抽象,对象是类的具体体现
三.使用方法
1.定义类
定义类: * 访问修饰符 class 类名{} * 说明: * 1)访问修饰符可以写成public(公共的)、默认的(什么单词都不写) * 2)类名要使用大驼峰命名法、做到见名知意
2.定义属性
定义属性: * 语法规则: * 访问修饰符 数据类型 属性名; * 说明: * 1)属性的访问修饰符有如下4个: * public:公共的 * protected:受保护的 * :默认的,什么也不写,也不用写default * private:私有的 * 2)数据类型可以是8大基本数据类型,也可以是3大引用数据类型 * 3)属性名的命名规则与变量命名规则一样,因为你会发现,所谓的属性定义与变量定义一模一样
3.定义方法
定义方法: * 语法规则: * 访问修饰符 返回值类型 方法名([数据类型 参数名1,数据类型 参数名2,...,数据类型 参数名n]){ * //方法体代码 * } * 说明: * 1)方法的访问修饰符可以有如下4种: * public:公共的 * protected:受保护的 * :默认的,什么也不写,也不用写default * private:私有的 * 2)返回值类型: * 1)描述执行方法会得到的结果的类型,可以是8大基本数据类型,也可以是3大引用数据类型 * 2)方法也可以没有返回值,没有返回值的时候,返回值类型写void(空) * 3)方法名: * 1)使用小驼峰命名法 * 2)方法命名也需要做到见名知意 * 4)[数据类型 参数名1,数据类型 参数名2,...,数据类型 参数名n]:参数列表 * 执行这个方法需要的参数,可以没有,那么[数据类型 参数名1,数据类型 参数名2,...,数据类型 参数名n]就省略不写 * 如果方法需要参数,就按照规则定义参数列表即可 * 5)方法体代码: * 方法体代码描述的是方法要执行功能的代码 * */
4.创建对象
//类是一个模板,根据模板来创建对象 //创建对象的语法规则:类名 对象名 = new 类名();Student student1 = new Student();
5.方法的详细定义
* 方法的详细定义: * 1)根据方法是否有返回值,将方法分为无返回值的方法和有返回值的方法 * --》无返回值的方法,返回值类型写void * --》有返回值的方法,返回值类型写返回数据的类型 * 有返回值的方法,需要通过return关键字返回指定的数据类型public void m1(){ System.out.println("m1()是一个无返回值的方法"); } //定义一个返回int类型数据的方法m2() public int m2(){ int num = 300; return num; } //定义一个返回String类型数组的方法 public String[] m3(){ String[] strs = {"qwert","asdfg"}; return strs; } }
调用//创建MethodDemo01对象 MethodDemo01 methodDemo01 = new MethodDemo01(); //调用无返回值的方法m1 //调用没有返回值的方法时,直接调用方法,不需要再做其他任何操作 methodDemo01.m1(); //调用有返回值的方法m2 //方法返回什么类型的结果,就使用什么类型的变量接收返回值 int result1 =methodDemo01.m2(); System.out.println("result1:"+result1); //不适用变量接收方法返回值,直接将返回值输出 System.out.println(methodDemo01.m2()); //调用有返回值的方法m3 String[] strings =methodDemo01.m3(); System.out.println(Arrays.toString(strings)); } }
* 2)根据方法是否有参数来分类: * --》无参方法:没有参数的方法 * --》有参方法:有参数的方法,参数可以是一个或者多个,可以是相同类型的也可以是不同类型的 * * 根据MethodDemo01类中的分类,方法最终的表现形式有四种: * 1)无返回值的无参方法 * 2)无返回值的有参方法 * 3)有返回值的无参方法 * 4)有返回值的有参方法 * 方法的调用原则: * 1)给什么接什么:方法返回什么类型的值,要么直接输出返回值,要么拿对应类型的变量接收返回值 * 2)要什么给什么:方法需要什么样的参数,按照参数列表的要求传递参数 * *///定义一个无参方法 public void m1(){ System.out.println("没有参数的方法m1()"); } //定义一个需要传递一个int类型数据的方法 public void m2(int num){//num是一个形式参数,简称形参 System.out.println("你传递过来的值:"+num); } //定义一个需要传递两个int类型数据的方法 public void m3(int num1,int num2){ System.out.println("你传递过来的两个数据之和:"+(num1+num2)); } //定义一个需要传递一个int类型数据和一个double类型数据的方法 public void m4(int num1,double num2){ System.out.println("你传递过来的两个数据是:"+num1+","+num2); } //定义一个方法,需要传递一个int类型的数组,然后将传递过来的数组元素进行求和,将结果和返回 public int arraySum(int[] nums){ //声明一个变量sum用来累加数组之和 int sum = 0; //通过循环进行累加 for(int i =0;i<nums.length;i++){ sum+=nums[i]; } return sum; } }
调用
public static void main(String[] args) { //创建MethodDemo02类对象 MethodDemo02 methodDemo02 = new MethodDemo02(); //调用无参方法:不需要传递参数 methodDemo02.m1(); //调用有参方法,传递一个int类型数据 methodDemo02.m2(200);//调用方法时传递的实际参数是200,简称实参 int a =300; methodDemo02.m2(a);//调用方法时传递的实际参数是a,简称实参 //methodDemo02.m2(199.99); m2方法需要的是int类型的,你传递的是double类型的数据,不负好参数列表要求 //调用有参方法,传递两个int类型数据 methodDemo02.m3(100,200); //调用有参方法,传递一个int类型数据和一个double类型数据 methodDemo02.m4(100,99.99); //methodDemo02.m4(99.99,100); //调用有参方法时需要根据参数的类型、个数、顺序传递参数 //总结:调用有参方法时,必须按照方法参数列表的数据类型、个数、顺序要求传递参数 //定义一个int类型数组 int[] array1 = {11,22,33}; int result1 = methodDemo02.arraySum(array1); System.out.println("array1数组元素之和:"+result1); int[] array2 = {11,33,44,55,66}; System.out.println(methodDemo02.arraySum(array2)); }
6.方法调用的三种方式
方法的三种调用方式: * 1)通过对象调用方法:在其他类中调用非静态方法 * 2)通过类名直接调用方法:要求方法使用static修饰,直接通过类名.方法名() * 3)在同一个类中,方法之间可以直接调用,无需创建对象或者通过类名调用 * 非静态方法(没有使用static修饰的方法)既可以调用非静态方法,也可以调用静态方法 * 静态方法只能调用静态方法 *
public void m1(){
System.out.println("无返回值的无参方法m1()");
}
public void m2(){
System.out.println("无返回值的无参方法m2()");
m1();
m3();//非静态方法中既可以调用非静态方法,也可以调用静态方法
}
public static void m3(){
System.out.println("使用static修饰的无参回值的无参方法m3()");
}
public static void m4(){
System.out.println("使用static修饰的无参回值的无参方法m4()");
m3();
//m1(); 静态方法中只能调用同一个类的静态方法,不能调用非静态方法
}
}
public static void main(String[] args) {
//调用方法的方式一:通过对象调用方法
MethodDemo03 methodDemo03 = new MethodDemo03();
methodDemo03.m1();
//调用方法的方式而:通过类名调用方法
methodDemo03.m3();//使用static修饰的方法也可以通过对象名调用
//类名调用方法
MethodDemo03.m3();
System.out.println("--------------------");
methodDemo03.m2();
System.out.println("--------------------");
MethodDemo03.m4();
}
Eg1
public class TicketUtils {
//定义一个门票工具类
//定义一个方法,根据游客的年龄来收取不同价位的门票
public static void calTicket(String name,int age){
//12以下 65以上免费
if(age<=12||age>=65){
System.out.println(name+"的年龄为"+age+",门票免费");
}else{
System.out.println(name+"的年龄为"+age+",门票20元");
}
}
}
public class Visitor {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//获取一次姓名和年龄
System.out.println("请输入姓名");
String name=scanner.next();
while (!name.equals("n")){
System.out.println("请输入年龄");
int age=scanner.nextInt();
TicketUtils.calTicket(name,age);
System.out.println("请输入姓名");
name=scanner.next();
}
System.out.println("程序退出");
}
}