面向过程-编程范式-c-行为
面向对象-能进行现实生活的抽象
面向接口编程
面向切面编程 - AOP
函数式编程范式 -Scala,Koltin
//lamdba表达式
()-> { }
面向对象三大特征:
a.封装
将客观事物封装为抽象的类,并且类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏。内部操作对不可信外部而言不可见(保护性)
b.继承
继承是指可以使用现有类的所有功能,并且在无须重复编写原有类的情况下对原有类进行功能上的扩展。(可重用)
c.多态(重要)
多态一个类实例相同方法在不同情况下有不同的表现形式。
多态机制是具有不同内部机构的对象可以共享外部相同接口。
名词扩展:Open Object
OOA(Analysis):面向对象分析
OOD(Design):面向对象设计
OOP(Programming):面向对象编程
OOT(Test):面向对象测试
UML类图(重要)架构师
2.类与对象的定义和使用
类:指的是共性的概念,而对象是一个具体的,可以使用的事物
首先先要有类(类是生产对象的蓝图),而后才可以产生对象。对象所具有的所有行为与属性,一定是在类中进行了完整的定义。
人类
类中的组成:
1.方法(操作的行为)
2.属性(操作的数据,每个对象应该具有的特征)
2.1Java中类的定义语法
calss 类名称{
属性类型 属性名称1;
属性类型 属性名称2;
...
方法1(){};
方法2(){};
...
}
定义一个Person类
class Person{
public String name;
public int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getPersonInfo(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class Test{
public static void main(String[] args) {
Person per=new Person("Dyson",20);
System.out.println(per.getPersonInfo());
}
}
类中的属性和方法不在由主方法直接调用,而需要通过对象来调用。
对象声明语法:
类名称 对象名称 = new 类名称();
Person per1=new Person();
Person per2=new Person(“Dyson”,20);
2.2类与对象内存分析
new 关键字 - 在堆上开辟了新的空间
栈内存:存放的是局部变量(包含各种基本数据类型以及对象引用--对象的名称)
堆内存:保存真正对象(对象的属性数据)
Person per=new Person();
内存图如下:
对象(引用数据类型)必须在实例化后调用,否则会产生NullPointerException(运行时异常)
垃圾空间:没有任何空间指向的堆内存空间
3.private实现封装处理 (仅限于本类中访问)
让内部操作对外部不可见(在类的外部不能直接使用对象来操作属性)
可以使用private对属性进行封装,称为类的私有属性。(主类和主方法称为客户端)
范例:无封装程序
Java规范,1.所有私有属性要想访问与设置内容,提供对应getter与setter方法
setter方法:进行属性内容设置与更改
getter方法:取得属性内容
范例:扩展Person类的内容
类的设计原则:
1.类中所有属性必须使用private封装
2.属性若要被外部访问,必须定义相应的getter与setter方法
4.构造方法
1.任何对象都应该有其对应的类,类是对象的蓝图 2.是一个唯一的标记,引用一块堆内存 3.表示开辟新的堆内 存空间 4.构造方法
(a)Person (b)per1=(c)new(d)Person();
特点:
a.方法名称必须与类名称 相同
b.构造方法没有返回值类型声明 (重要)
c.每个类必须至少存在一个构造方法(没有明确定定义的话,系统默认自动生成一个无参构造)
d.若类中定义的构造方法,则默认的无参构造不再生成。(先赋值,再传参)
构造方法无返回值,为什么没有void声明?
类的组成:属性,构造方法,普通方法
1,属性是在对象开辟堆内存时开辟的空间
2,构造方法是在使用new后调用的
3,普通方法是在空间开辟了,构造方法执行之后可以多次调用的
编译器是根据程序结构来区分普通方法与构造方法,因此构造方法前没有返回值类型声明
范例:使用构造方法设置对象属性
javap -c 反编译命令
构造方法的重载:参数个数不同(参数类型已经被定义)
范例:构造参数重载
建议:有若干个构造方法,请按照参数个数升序或降序
进行类定义时遵循以下顺序:
先定义属性->构造方法(构造方法按照个数大小排列)->普通方法
匿名对象
范例:
由于匿名对象不会有任何的栈空间所指向,所以使用一次后就成为垃圾空间。
5.this关键字
a.this调用本类属性
this.属性名 明确表示调用类中的同名属性
规范:在类的普通方法中访问本类属性,一定要加this关键字
实例:
b.this调用本类方法
调用普通方法 this.方法名称(参数)(虽然在本类普通方法不需要加this也可以正常调用。但建议加上,加上this的目的可以区分方法的定义来源(在继承中有用))
调用构造方法 this(参数):(重要)(编译器语言错误)
范例:this调用普通方法
范例:this调用构造方法
修改前:
修改后:
注意:
a.this调用本类其他构造方法必须放在首行调用
b.this调用构造方法不允许成环
c.this表示当前对象
范例:this表示当前对象
6.static关键字(重要)
6.1static属性(类属性)--通过类名调用(与对象无关,无对象可以直接使用)
a.访问static属性应该使用类名称-属性名(类属性)-描述共享概念
b.所有的非static属性(实例属性)必须在对象实例化后使用(与对象强相关,必须通过对象使用),而static属性(类属性)不受对象实例化控制
范例:static属性的内存分析
内存分析图如下:
传统属性所具备的特征:保存在堆内存中,且每个对象独享属性
描述共享属性,只需在属性前添加static关键字即可
static属性又称为类属性,保存在全局数据区的内存之中,所有对象都可以进行该数据区的访问
修改代码:
内存图分析如下: