面向对象编程1(类)
绪论:面向对象与面向过程
- 面向对象(OOP)与面向过程(POP)
- 二者都是一种思想,面向对象是相对于面向过程而言的。
- 面向过程,强调的是功能行为。
- 面向对象,将功能封装进对象,强调具备了功能的对象。
- 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
- 面向对象的三大特征
封装 (Encapsulation)
继承 (Inheritance)
多态 (Polymorphism)
ps:
OOP: Object Oriented Programming
面向过程:procedure oriented programming
一、类的语法格式
- 修饰符 class 类名
{
属性声明;
方法声明;
}
说明:
①修饰符public:类可以被任意访问
②类的正文要用{ }括起来
- 步骤:
- 定义类(考虑修饰符、类名)
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
③类的成员变量可以先声明不用初始化,有默认值
举例1:
/**
* 人
* @author 才子先生
*
*/
public class Person
{
// 属性,成员变量
String name;//类的成员变量可以先声明不用初始化,因为有默认值String——null
int age;//默认值为0
// 行为,方法 函数
/**
* 打印姓名
*/
public void showName()//方法的命名使用驼峰命名法
{
System.out.println("姓名:"+name);
}
/**
* 返回一个年龄
* @return
*/
public int getAge()//如果有返回值的方法那么方法体有return返回定义的类型
{
return age;
}
}
举例2:
public class Animal
{
String name;
int eye;//方法局部变量(方法内的)
int legs;
public void eat(String food)//方法的参数,即形参。可并列多个形参,以逗号分隔
{
System.out.println("此物种的食物是:"+food);
}
public void move(String moveType)
{
System.out.println("此动物的移动方式为:"+moveType);
}
}
二、类的实例化(即创建类的对象)
对象的创建和使用
- 使用new +构造器创建一个新的对象;
- 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法);
(下面举两个例子,分别对应上面的的两个类)
举例1:
public class test2
{
public static void main(String[] args)
{
//实例化person类(创建person对象)
Person person=new Person();
//前半句声明一个Person类的对象,名称是person;new Person()实例化person类;整句实例化Person类,并且给person赋值为当前的实例
person.name="张三";//给person对象的属性赋值
person.showName();//对象方法的调用。
int i=person.getAge();//有返回值的方法再返回后有一个值,这个值就是方法中return返回的值
System.out.println(i);
person.age=155;//给person对象的age属性赋值
int a=person.getAge();//有返回值的方法再返回后有一个值,这个值就是方法中return返回的值
System.out.println(a);
}
}
结果:姓名:张三
0//未给age赋值所以默认为0
155
举例2:
public class test1
{
public static void main(String[] args)
{
//实例化一个Animal的对象
//创建对象和使用对象
Animal ani=new Animal();
ani.eat("炸鸡块");
ani.move("八条腿飞");
}
}
结果:此物种的食物是:炸鸡块
此动物的移动方式为:八条腿飞
三、类的成员之一:属性
- 语法格式:
修饰符 类型 属性名 =初值 ; - 说明:
- 修饰符private:该属性只能由该类的方法访问。
- 修饰符public:该属性可以被该类以外的方法访问。
- 类型:任何基本类型,如int、boolean或任何类。
举例:
public class Person{
private int age; //声明private变量 age
public String name = “Lila”; //声明public变量 name
}
补:变量的分类:成员变量与局部变量
- 成员变量:在方法体外,类体内声明的变量
- 局部变量:在方法体内部声明的变量称为局部变量。
见一中的例子
具体分类见:http://naotu.baidu.com/file/8c9d75765a7a98da6b3c01e30a11046d?token=24f3e7debb73eedd百度脑图
注意:
- 1.类变量是静态的不需要实例化成对象就可以使用可以通过:类名.属性 使用
- 2.实例变量得new一个对象才能使用。
- {int a=1;}为代码块局部变量
辨析:成员变量(属性)与局部变量的区别
成员变量:
- 成员变量定义在类中,在整个类中都可以被访问。
- 成员变量分为类成员变量和实例成员变量,实例变量存在于对象所在的堆内存中。(即实例变量只能在类实例化后的对象中使用)
- 成员变量有默认初始化值。
- 成员变量的权限修饰符可以根据需要,选择任意一个
局部变量:
- 局部变量只定义在局部范围内,如:方法内,代码块内等。(即局部变量只能在他所属的方法范围内可以使用)
- 局部变量存在于栈内存中。
- 作用的范围结束,变量空间会自动释放。
- 局部变量没有默认初始化值,每次必须显式初始化。
- 局部变量声明时不指定权限修饰符。(public等)
四、类的成员之二:方 法
- 什么是方法(函数)?
方法是类或对象行为特征的抽象,也称为函数。
ps:Java里的方法不能独立存在,所有的方法必须定义在类里。
语法格式1(无形参):
修饰符 返回值类型 方法名 ( 参数列表)
{
方法体语句;
}
- 说明:
- 修饰符:public, private, protected等。
- 返回值类型:return语句传递返回值。没有返回值:void。
举例:
public class Person
{
private int age;
public int getAge()
{
return age;
} //声明方法getAge
public void setAge(int i) //形参i
{ //声明方法setAge
age = i; //将参数i的值赋给类的成员变量age
}
}
语法格式2(有形参):
修饰符 返回值类型 方法名(参数类型 形参1,参数类型 形参2,….)
{
** 程序代码**
** return 返回值;**
}
其中:
- 形式参数:在方法被调用时用于接收外部传入的数据的变量。
- 参数类型:就是该形式参数的数据类型。
- 返回值:方法在执行完毕后返还给调用它的程序的数据。
- 返回值类型:方法要返回的结果的数据类型。
- 实参:调用方法时实际传给函数形式参数的数据。
具体实例见animal例。
ps:方法内可以调用方法却不能定义方法
同一个类中所有方法可以直接相互调用,不用new一个对象
五、对象的创建和使用
普通对象
如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。
下面是一个学生和老师信息输出的例子:
public class Teacher
{
public String name;
public String major;
public String cause;
public int teachingtime;
public void showInfo()
{
System.out.println("姓名:"+name);
System.out.println("专业:"+major);
System.out.println("教授的课程:"+cause);
System.out.println("教龄:"+teachingtime);
}
}
public class Student
{
public String name;
public String interest;
public String cause;
public int age;
public void showInfo()
{
System.out.println("姓名:"+name);
System.out.println("兴趣:"+interest);
System.out.println("学习的课程:"+cause);
System.out.println("年龄:"+age);
}
}
public class Testinfo
{
public static void main(String[] args)
{
//教师实例化
Teacher tea=new Teacher();
tea.name="王铁柱";
tea.major="大熊猫的产后护理";
tea.cause="大熊猫的繁殖保护";
tea.teachingtime=20;
tea.showInfo();
//学生实例化
Student stu=new Student();
stu.age=20;
stu.cause="大熊猫的繁殖保护";
stu.interest="撸猫";
stu.name="李二蛋";
stu.showInfo();
}
}
输出结果:
姓名:王铁柱
专业:大熊猫的产后护理
教授的课程:大熊猫的繁殖保护
教龄:20
姓名:李二蛋
兴趣:撸猫
学习的课程:大熊猫的繁殖保护
年龄:20
匿名对象
-
我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。
如:new Person().shout(); 不给赋予某个变量 -
使用情况
1.如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
2.我们经常将匿名对象作为实参传递给一个方法调用。 (即将这个对象当成参数传到方法中)
计算圆的面积
public class Area
{
// public double radius;
// public static void main(String[] args)
// {
// Area a=new Area();
// a.radius=15;
// double s=3.14*a.radius*a.radius;
// System.out.println("圆的面积为:"+s);
// }
public double area(double r)
{
return 3.14*r*r;
}
public static void main(String[] args)
{
double s=new Area().area(15);
System.out.println("圆的面积为:"+s);
}
}
圆的面积为:706.5
注释部分是自己写的,另一种办法是老师给的例子。
类的访问机制:
-
在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(例外:static方法访问非static的成员变量[l例如:static int a],编译不通过。)
-
在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
面向对象思想“落地”法则(一)
1.关注于类的设计,即设计类的成员:属性 、方法
2.类的实例化,即创建类的对象(比如:Person p = new Person())
3.通过“对象.属性” 、 “对象.方法” 执行
六、方法的重载(overload)
重载的概念
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。(与参数的名称无关.参数顺序不同也可以构成重载)
重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
重载示例:
//返回两个整数的和
int add(int x,int y){return x+y;}
//返回三个整数的和
int add(int x,int y,int z){return x+y+z;}
//返回两个小数的和
double add(double x,double y){return x+y;}
练习
判 断:
与void show(int a,char b,double c){}构成重载的有:
a) void show(int x,char y,double z){} //no
b) int show(int a,double c,char b){} //yes顺序不同也是重载
c) void show(int a,double c,char b){} //yes顺序不同也是重载
d) boolean show(int c,char b){} //yes
e) void show(double c){} //yes
f) double show(int x,char y,double z){} //no
g) void shows(){double c} //no