1.面向对象初识
面向过程强调的是功能行为,面向对象是相对面对过程而言的,面向对象将功能封装成对象,强调具备了功能的对象。面向过程和面向对象都是一种编程思想。
万物皆对象,凡是真实存在的个体都是对象
(1)分析该系统中包含哪些对象
(2)明确每个对象可以做什么
(3)明确各个对象之间的关系
将大象装进冰箱
步骤:
(1) 包含哪些对象:名词提取法——UML(统一建模语言)
大象
冰箱
测试
(2) 每个对象有什么:
大象:in()
冰箱:open()
close()
测试:main( )
(3) 明确对象
class 大象
{
public static void in( )
{
System.out.println(“装进大象”);
}
}
class 冰箱
{
public static void open( )
{
System.out.println(“打开冰箱”);
}
public static void close( )
{
System.out.println(“关闭冰箱”);
}
}
class 测试
public static void main( )
{
冰箱.open( );
大象.in( );
冰箱.close( );
}
面向对象的特征——继承、封装 、多态
以后的开发过程就是找对象来用,没有对象,就创建一个对象。
找对象,建立对象,使用对象,并维护对象的关系。
类和对象的关系:
类:就是对现实生活中事物的描述,是属性和行为的集合,可以理解为一张图纸,是 一个抽象的概念
对象:就是这类事物,实实在在存在的个体。
想要描述:提取对象中共性内容。对具体的抽象。
映射到Java中描述就是class定义的类。类中属性即成员变量,行为即成员函数,定义类就是定义类的成员(成员变量+成员函数)
具体对象就是对应Java在堆内存中用new建立实体。
格式: 类名 对象名=new 类名();
成员变量:对象名.成员变量;
成员方法:对象名.成员方法();
成员变量和局部变量的区别
定义位置的区别:成员变量定义在类中,方法外;局部变量定义在方法中,或者是方法的形参
初始化值的问题:成员变量有默认初始化值;局部变量没有默认初始化值,必须定义后赋值才能使用。在使用变量的时候,首先在局部范围找,没有的话在成员变量找,在使用过程中,遵循一个就近原则
存储位置的区别:成员变量定义在堆中,随着对象的存在而存在,随着对象的消失而消失;局部变量存储在栈中,随着方法的调用而存在,随着方法调用完毕而消失
局部变量前只能加final关键字
匿名对象
匿名对象是对象的一种简化方式
格式:new 类名()
调用:new 类名(). 成员名称;
使用情况:1.只使用一次的时候;2.作为实参传递给方法;
2.封装
是指把不需要让外界知道的信息隐藏起来,尽可能隐藏对象的字段和实现细节,仅对外提供公共访问方式。
优点:将变化隔离,便于使用,提高重用性和安全性
封装机制在程序中的体现是:把描述对象的状态用字段表示,描述对象的行为用方法表示,把字段和方法定义在一个类中,并保证外界不能任意更改其内部的字段值,也不允许任意调动其内部的功能方法。
程序中的一种体现:通常将类中的成员变量私有化(private),通过对外提供方法(setXxx,getXxx),可对该变量(xxx)进行访问。
boolean 类型的变量没有getXX,只有 isXX;
/*封装演示*/
class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3.访问权限修饰符
private 类访问权限:本类内部可以访问,不能继承到子类;
default 什么都不写,包访问权限:本类内部可以访问,同包其他类也可以访问,同包可继承;
protected 子类访问权限:本类内部可以访问,不同包的子类也可以访问,同包其他类也可以访问,能继承到子类;
public 公共访问权限:任何地方都可以访问,能继承到子类;
4.构造函数(constructor)
用于给函数进行初始化。
特点:方法名与类名完全相同
构造函数没有返回值类型(没有void!)
不能有具体的返回值
注意事项:1.若没有定义类的构造方法,那么系统会默认给出一个无参的构造
方法;
2.若定义了类的构造方法(不论是有参还是无参),系统将永远不再提供默认的无参构造方法。推荐有缘手动给出无参构造方法。
3.构造方法可以重载,即可以定义多个构造方法用于接收不同的参数
4.构造函数仅在创建对象实例的时候由JVM调用一次,无法像成员方法一样随时调用
给成员变量赋值的方式:1.直接在定义的时候或者是通过对象名.成员变量赋值
2.通过setter赋值
3.在实例化对象时通过构造方法为成员变量赋值
/*构造函数示例*/
class Person
{
private String name;
private int age;
//系统默认的构造方法,若你定义了构造方法,该方法将不被执行
public Person(){ }
//自己定义的无参构造方法
public Person()
{
System.out.println("这里是自己定义的无参构造方法");
}
//有参数的构造方法
public Person(String n,int a)
{
name=n;
age=a;
}
//getter&setter
public void setName(String n)
{
name=n;
}
public String getName()
{
return name;
}
public void setAge(int a)
{
age=a;
}
public int getAge()
{
return age;
}
}
5.this关键字
this代表其所在函数所属对象的引用。换言之,this就代表本类对象的引用。谁调用,this就代表谁。每一个成员方法里面都有一个this代表当前对象。
什么时候用this——当函数内部需要用到调用该函数的对象时
1.局部变量隐藏成员变量 this.name=name;
2.构造方法中相互调用,但是此时this([参数])必须写在构造方法第一行。
this不能用在static修饰的方法里和static修饰的代码块里;
6.代码块
由{ }括起来的代码。
分类:1.局部代码块:定义在方法中的代码块,用于控制变量的生命周期和作用域,让变量尽可能早的从内存中消失,提高效率
public void show()
{
System.out.println("下一步进入局部代码块");
{
System.out.println("这里是局部代码块");
}
System.out.println("离开局部代码块");
}
2.构造代码块:定义在方法外的代码块,用于将所有构造函数中共同的部分定义在构造代码块
class Test
{
String name="执行否";//成员变量先初始化,在执行构造代码块和构造函数
//构造代码块先于构造函数执行,用于放构造函数公用的代码
//构造代码块和构造函数一样,仅在实例化的时候执行一次
{
System.out.println("构造代码块"+name);
}
public Test()
{
System.out.println("无参构造函数"+name);
}
public Test(int i)
{
System.out.println("参数值为"+i+"的构造函数");
}
}
5.Person p=new Person()在内存中如何执行
(1)把Person.class文件加载到内存(类加载器)
(2)在栈内存开辟一个变量空间,给p用
(3)new Person( )在堆内存开辟空间
(4)方法进方法区,用类名做标记。并且,同时成员变量进堆内存,进行默认初始化
(5)对成员变量进行显示初始化
(6)如果有构造代码块,执行构造代码块
(7)执行构造方法
(8)到此为止,变量初始化操作完成
(9)将对象在堆中的地址复制给栈中的p
6.Static关键字
用于修饰成员变量和成员函数。
特点:(1)随着类的加载(即class文件进内存的时候)而加载(所以static
不用于修饰构造方法);
(2)静态的优先于对象存在
(3)为什么要使用静态?如果某个内容是被所有对象所共享,那么该
内容应该用静态修饰。没有被静态修饰的内容,其实是属于对象的特殊描述。
(4)static修饰的内容可以直接被类名调用(所以也叫类变量)
注意事项:1.在静态方法中是没有this、super关键字的。因为静态随着类的
加载而加载,而this是对象创建之后才存在的。
2.静态方法只能调用静态成员变量和成员方法,但是非静态方法
既可以访问静态的也可以访问非静态的。
3.静态的内容可以通过对象调用,也可以通过类名调用,但是一
般推荐类名
|
|