------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
“我们之所以将自然界分解,组织成各种概念,并将其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定一语言的形式固定下来……除非赞成这个协定中的有关语言信息的组织和分类,否则我们根本无法交谈。”——Benjamin Lee Whorf(1897~1941) 摘自——java编程思想
一、面向对象
1.概念:面向对象是相对于面向过程而言的一种编程思想,面向过程是强调功能行为,而面向对象强调将功能封装在对象中,强调 具有功能的对象
2.特点:
(1)是一种符合人们思考习惯的方式
(2)可以将复杂的事情简单化
(2)将程序员从执行者转化为指挥者
(4)简化开发并提高复用
3.表现:
开发过程:寻找对象,没有对象就创建对象。开发过程就是一个不断创建对象,使用对象
设计过程:管理和维护对象之间的关系
4.三大特征:封装(encapsulation)、继承(inheritance)、多态(polymorphism)
二、类与对象
1.关系:生活中的事物可以用计算机语言来描述,java语言就是通过类来描述事物,类是具体事物在语言中的抽象表现,对象是该类所描述事物真实存在的个体。
在上图中,类就是图纸,汽车就是对内存中的对象
2.表现:用class定义类,描述对象,对象的属性就是类中变量,对象的功能就是方法(函数),变量和函数都是类的成员(成员
变量和成员函数)
3.成员变量和局部变量的区别?
成员变量:
成员变量定义在类中,在整个类都可以访问。
成员变量随着对象的建立而建立,存在于对象所在的对内存中。
成员变量都有默认的初始化值。
局部变量:
局部变量只定义在局部范围内,如函数、语句内。
局部变量只在栈内存中。
作用范围结束,变量空间会自动释放。
局部变量没有默认初始化值。
4.匿名对象
(1)、当对象的方法值调用一次时,使用匿名对象,简化代码。
(2)、可以将匿名对象作为实际的参数进行传递。
三、封装(encapsulation)
1.概念:将对象的属性和实现细节进行隐藏,仅对外提供公共的访问方法。
2.好处:将变化隔离;便于使用;提高重用性;提高安全性
3.private关键字:
概念:是一种权限修饰符,用来修饰成员(成员变量和成员函数),被修饰的成员只在本类中有效。
常用:将成员属相封装后,对外提供get和set方法对其访问,提高安全性。
4.构造函数:
特点:函数名与类名一致
没有具体返回值并且不定义返回值类型
每一个类都有默认的空参数的构造函数,当在类中自定义了构造函数后,默认的构造函数就不存在了
多个构造函数以重载的形式存在
对象一建立,就会调用与之对应的构造函数
作用:用于给对象初始化
class Student {
private String name;
private int age;
private int score;
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;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
// 具有姓名、年龄、成绩的构造函数
public Student(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
}
上面的程序就是将学生(student)类进行封装,将姓名、年龄、成绩属性隐藏,对外提供get和set方法,并且定义了一个构造函数
5.构造代码块:
作用:给所有对象进行统一初始化
特点:先于构造函数执行
什么时候用:当对象具有共性的属性时,可以放在构造代码块中初始化
6.this关键字:代表本类对象,哪个对象调用this所在的函数,this就代表哪个对象。
注意:this只能写在构造函数的第一行,因为要进行初始化。
class Person
{
private int age;//人的年龄属性
Person(int age)
{
this.age = age;
}
//比较两个人的年龄是否相同
public boolean compare(Person p)
{
return this.age == p.age;
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p1 = new Person(24);
Person p2 = new Person(20);
System.out.println(p1.compare(p2));//p1调用compare方法,this代表p1对象
}
}
7.static关键字:是一种修饰符,用于修饰成员(包括成员变量和成员函数),被static修饰的成员可以直接被类名调用。
特点:(1)随着类的加载而加载
(2)优先于对象而存在,所以内部不能定义this和super
(3)静态只能访问静态
什么时候用?
当类中出现共享数据时,可以将定义为静态
当函数中没有访问到非静态数据时,可以将函数定义为静态。
class Person
{
private String name;
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
static String country = "china";//中国人的国籍属性共有的属性
public static void show()//静态函数
{
System.out.println("静态函数被调用");
}
}
class StaticDemo
{
public static void main(String[] args)
{
Person p = new Person();
p.setName("lee");
System.out.println("name="+p.getName()+"+++country="+p.country);//结果:name=lee+++country=china
Person.show();//结果:静态函数被调用
}
}
8.静态代码块:
格式:
static
{
}
特点:随着类的加载而执行,而且只执行一次,先于构造函数执行。
9.实例变量和类变量的区别:
(1)存放位置。
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
(2)生命周期:
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
10.对象的初始化过程:
Person p = new Person("zhangsan",20);</span>
该句话所做的事情:
1.new用到了Person.class,首先找Person.class文件并加载到内存中。
2.执行该类中的静态代码块,给Person.class进行初始化
3.在堆内存中开辟空间,并分配内存地址值
4.在堆内存中建立对象的特有属性,并进行默认初始化
5.对对象的属性进行显示初始化
6.对对象进行构造代码块的初始化
7.对对象进行对应构造函数初始化
8.将堆内存中的地址值赋给栈内存中的p变量
四、设计模式:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
单例设计模式:保证一个类在内存中只有一个对象
懒汉式:
class Single
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
饿汉式:具有延时加载的特点,但是在多线程下会不安全,可以加同步解决问题,但是效率会降低,可以加双重判断来提高效率
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance ()
{
if (s == null)
{
synchronized(Single.class)//加锁,更安全
{
if (s == null)
{
s = new Single();
}
}
}
return s;
}
}