一、面向对象简述
在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题。面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。
在面向对象定义之中,也规定了一些基本的特征:
(1)封装:保护内部的操作不被破坏;
(2)继承:在原本的基础之上继续进行扩充;
(3)多态:在一个指定的范围之内进行概念的转换。
二、类与对象的基本概念
类:类是一个模板,它描述一类对象的行为和状态。
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类名一般遵循的规则:
1.由一个单词组成,类名首字母要大写
2.由多个单词组成,每个单词首字母要大写
变量名和方法名一般遵循的规则
1.由一个单词组成,用小写
2.由几个单词组成,第一个单词首字母小写,其余单词首字母大写
*局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
*成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
分为两种:实例变量和静态变量
实例变量:不用关键词static修饰;一个类中不同对象的实例变量将分配不同的存储空间;只能通过对象访问实例变量;
静态变量(类变量):用关键词static修饰;一个类中所有对象的某个静态变量被分配同一个内存,所有对象共享这个静态变量;可以通过 类名访问静态变量,也可以通过某个对象访问静态变量;
如果一个成员变量修饰为final,那么就变成了常量(习惯用大写字母)
*this关键字
this.属性名称 指的是访问类中的成员变量,用来区分成员变量和局部变量
this 可以出现再实例方法和构造方法中,但是不可以出现在类方法中
构造方法:代表使用该构造方法所创建的对象
实例方法:代表使用该实例方法所创建的对象
使用this区分成员变量和局部变量:
如果成员变量和局部变量的名称相同,则成员变量被隐藏,即成员变量在方法内暂时失效,如想在方法中使用成员变量,对于实例方法,应使用“this.成员变量”,对于类方法,应使用“类名.成员变量”;this不能省略;
*构造方法:类创建对象时,需要使用构造方法完成对象的初始化工作
构造方法的名称必须与类名相同
构造方法没有任何返回数据类型,包括关键字void
对象不可以调用构造方法
任何一个类都有构造方法。如果我们没有显式的定义,系统会定义一个默认的无参数的构造方法。一旦我们定义了构造方法,这个默认的无参数的构造方法就不再创建
一个类中可以有若干个构造方法(名称相同),但参数必须不同
*一般方法:实例方法和类方法
*实例方法:方法声明中不用static修饰,必须通过对象来调用
*类方法(静态方法):方法声明中用static修饰,可以通过类名调用
*参数传值
(1)基本数据类型参数的传值:实参和形参占有不同的内存空间,形参的改变不影响实参;实参的级别要低于形参的级别
例:
1 class Exchange{ 2 int a,b; 3 void exchange(int a, int b){ 4 this.a=a; 5 this.b=b; 6 int temp = this.a; 7 this.a=this.b; 8 this.b=temp; 9 } 10 } 11 12 public class TestBasicParameter{ 13 public static void main(String[] args){ 14 int x = 10; 15 int y = 20; 16 System.out.println("交换前,x=" + x + ";y=" + y); 17 Exchange test=new Exchange(); 18 test.exchange(x,y); 19 System.out.println("交换后,x=" + x + ";y=" + y); 20 } 21 }
x,y是实参,test.exchange中的x,y传到exchange方法中是形参,形参的改变不会改变实参,所以交换后x,y还是10、20。
(2)引用类型参数的传值:引用类型数据包括对象、数组以及接口和泛型等;
实参和形参指向共同的内存,改变形参引用的实体会导致实参实体发送同样的变化
1 class Exchange{ 2 int a,b; 3 void exchange(Exchange u){ 4 int temp = u.a; 5 u.a=u.b; 6 u.b=temp; 7 } 8 } 9 10 public class TestClassParameter2{ 11 public static void main(String[] args){ 12 Exchange test=new Exchange(); 13 test.a=10; 14 test.b=20; 15 System.out.println("交换前,test.a=" + test.a + ";test.b=" + test.b); 16 test.exchange(test); 17 System.out.println("交换后,test.a=" + test.a + ";test.b=" + test.b); 18 } 19 }
三、对象的创建
(1)格式一:声明并实例化对象
类名称 对象名称 = new 类名称 () ;
(2)格式二:先声明对象,然后实例化对象:
类名称 对象名称 = null ;
对象名称 = new 构造方法名 () ;
对象的使用:通过使用运算符".",对象可以实现对自己的成员变量和成员方法的访问
对象名.成员变量
对象名.成员方法
四、对象引用传递分析
范例一:
class Person { String name ; int age ; public void tell() { System.out.println("姓名:" + name + ",年龄:" + age) ; } } public class TestDemo { public static void main(String args[]) { Person per1 = new Person() ; // 声明并实例化对象 per1.name = "张三" ; per1.age = 20 ; Person per2 = per1 ; // 引用传递 per2.name = "李四" ; per1.tell() ; } }
对应内存分配:
范例二:
1 class Person { 2 String name ; 3 int age ; 4 public void tell() { 5 System.out.println("姓名:" + name + ",年龄:" + age) ; 6 } 7 } 8 public class TestDemo { 9 public static void main(String args[]) { 10 Person per1 = new Person() ; // 声明并实例化对象 11 Person per2 = new Person() ; 12 per1.name = "张三" ; 13 per1.age = 20 ; 14 per2.name = "李四" ; 15 per2.age = 30 ; 16 per2 = per1 ;// 引用传递 17 per2.name = "王五" ; 18 per1.tell() ; 19 } 20 }
对应内存分配: