第三章 类与对象
1、面向对象概述
面向过程(POP)与面向对象(OOP) 二者都是一种思想,面向对象是相对于面向过程而言的。
面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。5W里的How
面向对象,将功能封装进对象,强调的是具备了功能的对象,以类/对象为最小单位,考虑谁来 做,这个是5W里的WHO
面向对象更加强调 运用人类在日程的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚 合、多态等。
5W是who where when how why
概述
面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的 面向对象的概念实际上是由IBM提出的,在70年代的Smaltalk语言之中进行了应用,后来根据面向对象 的设计思路,才形成C++,而由C++产生了Java这门面向对象的编程语言。
但是在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题。面向过程的 操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是 要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,增强可维护性,所以,面 向对象的开发更像是一个具备标准的开发模式。
在面向对象定义之中,也规定了一些基本的特征:
(1)封装:保护内部的操作不被破坏 ,将方法和属性封装在类中,类就是载体,调用方法或者属性时,只需先将该类实例化就行;
(2)继承:在原本的基础之上继续进行扩充,例如平行四边形在四边形的特点上加上自己新特性,其中四边形的特点被平行四边形使用就是继承;
(3)多态:在一个指定的范围之内进行概念的转换,父类对象应用于子类的特征就类似于多态。 第二节:类与对象
1.类与对象概述 类与对象是整个面向对象中最基础的组成单元。
类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);
对象:对象是一种个体的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性值来区 分不同对象,实实在在存在的。
可以一句话来总结出类和对象的区别:类是对象的模板,对象是类的实例化。
类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。
现在先这样记住:类不能直接使用,对象是可以直接使用的。
例如scanner类
使用格式
Scanner scan = new Scanner();
其中scan就是Scanner类的实例化对象
2、java中的成员
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的细胞构成的,同理,java代码世界是由诸多 个不同功能的类构成的。
常见的类的成员有:
属性:对应类中的成员变量。
Filed = 成员变量 = [域、字段]
行为:对应类中的成员方法。
Method = 方法 = 成员方法
构造方法
constructor
代码块
{
}
3、类的定义
权限修饰符 class 类名{
属性
方法
}
public class Person{
String name;//姓名
int age;//年龄
double height;//身高
boolean sex;//性别
}
4、对象的定义和使用
public class Student{
int id;
String name;
int age;
String address;
}
类 对象名 = new 类();
Scanner scan = new Scanner();
三、方法的定义和使用
1、什么是方法
方法是指一段可以直接被另一段程序引用(调用)的具有特定功能的程序。也叫做子程序、(OOP 中)方法。
2、方法的语法定义和调用
语法定义:
权限修饰符 [static] 返回值类型/void 方法名(参数列表){
//执行业务逻辑 代码块
return 变量/常量;
}
1、权限修饰符
public protected 缺省/friendly private
如果不写权限修饰符就默认为缺省
2、返回值类型 有返回值的 VS 没有返回值
有返回值的:在方法声明的时候,一定要指定对应的返回值类型。同时在方法体中,要加上return 对应
类型的常量、变量。
没有返回值的:在方法声明的时候,写void。在方法体中,可以不写return。如有需要的话,有可以写
rentun。 return; 表示方法结束。
3、参数列表:数据类型 参数名1,数据类型 参数名2,数据类型 参数3
可以有0个、1个、2个...无数个。
调用:
对象名.属性名
对象名.方法名()
3、返回值、参数列表进行分类讲解方法
返回值类型:有返回值类型 没有返回值类型
返回值类型:如果没有返回值,就是void 否则 根据具体的返回值的类型来写。
参数列表:有参数的 没有参数
a、没有返回值 没有参数列表
public void Person(){
System.out.println(1);
}
b、没有返回值 有参数列表
调用时,需要传入参数
public void Person(int i){
System.out.println(i);
}
c、有返回值 没有参数列表
调用时,需要接收返回值
public int Person(){
int num=1;
return num+1;
}
d、有返回值 有参数列表
调用时,需要传入参数,并且接收返回值
public int Person(int j){
int num=1;
return num+j;
}
4、方法使用过程中的注意事项
1. 使用类中的方法或者属性之前,一定要先创建对象 先new。
2. 对象中的属性和方法的调用 对象名.方法名/属性名
3. 调用方法时传入方法的数据类型和顺序,都要跟定义方法时定义的参数数据类型和顺序完全一致。
4. 方法的返回值类型根据**自己的需求**,看是否有返回值,如果没有返回值,就写void,如果有返回值,
就写上与返回值数据类型相同的数据类型。
5. 参数列表中不能有同名参数。
6. 方法返回值的类型要大于等于 return 数据的类型;
四、构造方法
构造方法的的名字要与类名相同,构造方法可以重载
public class Constructor {
String name = "张三";//若不赋值,则使用默认值张三
int age = 18;
int id = 1001;
//构造方法 格式:权限修饰符 类名(){}
//没有返回值 也没有void new对象的时候调用
//当系统没有自定义的构造方法时,会有一个默认的无参构造方法,
//如果自定义构造方法后,系统提供的构造方法将会被覆盖
public Constructor(){
System.out.println("这是一个空参构造方法");
}
public Constructor(int age){
this.age=age;//this 代表当前类,本类中调用自己的成员变量在this
System.out.println("这是一个int参构造方法"+age);
}
public Constructor(String name, int age, int id){
System.out.println("这是一个三参构造方法");
}
}
public class Contstuctor1Test {
public static void main(String[] args) {
Constructor con=new Constructor();//调用空参构造方法
Constructor con2=new Constructor(12);//调用单参构造方法
Constructor con3=new Constructor("Martin",21,5934345);//调用三餐构造方法
}
}
五、方法的重载
public class Overload {
//方法重载能够减少方法的命名
//在同一个类里,方法名相同,参数的个数 顺序 类型不同都能构成方法的重载
//方法重载与返回值的类型无关
String name="zs";
public int add(int a,int b){
System.out.println("这里是int int");
return a+b;
}//参数类型不同
public double add(double a,int b){
System.out.println("这里是double int");
return a+b;
}//参数个数不同
public double add(double a,double b,int c){
System.out.println("这里是double double int");
return a+b+c;
}//参数顺序不同
public double add(int a,double b,double c){
System.out.println("这里是int double double");
return a+b+c;
}
}
public class Overlaod1Test {
public static void main(String[] args) {
Overload ov1=new Overload();
System.out.println(ov1.add(12,13));//调用的是int int 方法
System.out.println(ov1.add(12.0,13));//调用的是double int 方法
System.out.println(ov1.add(12.0,13.0,12));//调用的是double double int方法
System.out.println(ov1.add(1,2.3,3.3));//调用的是 int double double方法
}
}