一、面向对象概念
1、理解面向对象
-
面向对象是相对面向过程而言
-
面向对象和面向过程都是一种思想
-
区别:
1)面向过程:强调过程,功能行为,执行者
2)面向对象:将功能封装进对象,强调具备了功能的对象,指挥者
-
面向对象是基于面向过程的。
2、面向对象思想的特点:
A:它是一种更符合人们思考习惯的思想
B:它使复杂的内容简单化
C:它使我们从执行者变成了指挥者
3、面向对象开发、设计
1)完成需求时:
先要去找具有所需的功能的对象来用。
如果该对象不存在,那么创建一个具有所需功能的对象。
这样简化开发并提高复用。
2)开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
3)设计的过程:其实就是在管理和维护对象之间的关系。
4、面向对象的特征:
? 封装(encapsulation)
? 继承(inheritance)
? 多态(polymorphism)
二、类与对象
1、类与对象的关系
1)类是具体事物的抽象,概念上的定义。
2)对象是该类事物实实在在存在的个体。
2、类的定义
1)类:对现实世界中事物的描述(属性和行为)
? 属性:对应类中的成员变量。
? 行为:对应类中的成员函数。
3、成员变量和局部变量的区别
成员变量:
? 成员变量定义在类中,在整个类中都可以被访问。
? 成员变量随着对象的建立而建立,存在于对象所在的堆内存中。
? 成员变量有默认初始化值。
局部变量:
? 局部变量只定义在局部范围内,如:函数内,语句内等。
? 局部变量存在于栈内存中。
? 作用的范围结束,变量空间会自动释放。
? 局部变量没有默认初始化值。
4、对象
1)创建对象
格式:类名 对象名 = new 类名();
例如:Car c = new Car(); //建立汽车类对象
2)使用对象
方法:通过"."点运算符来操作类的属性和方法
格式:
A:静态、非静态成员均可:
格式:对象名.属性名 = 属性值; //调用属性
例如:c.color = "black";
格式:对象名.方法名(); //调用方法
例如:c.show();
B:仅用于静态成员:
类名.属性名 = 属性值; //调用静态属性
类名.方法名(); //调用静态方法
3)对象内存结构
4)匿名对象
A:匿名对象是对象的简化形式:
B:匿名对象两种使用情况
? 当对对象方法仅进行一次调用的时
格式:new 类名().方法名();
? 匿名对象可以作为实际参数进行传递
格式:new 类名()
C:用匿名对象调用属性是没有意义的
三、封装
1)封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
2)好处:
? 将变化隔离。
? 便于使用。
? 提高重用性。
? 提高安全性。
3)封装原则:
? 将不需要对外提供的内容都隐藏起来。
? 把属性都隐藏,提供公共方法对其访问。
4)private关键字
private关键字:
? 是一个权限修饰符。
? 用于修饰成员(成员变量和成员函数)
? 被私有化的成员只在本类中有效。
常用之一:
? 将成员变量私有化,对外提供对应的set ,get方法对其进行访问。提高对数据访问的安全性。
四、构造函数
class Person {
int age;
Person(int age){}
}
1)特点:
A:函数名与类名相同(构造函数名:首字母大写;一般函数名:首字母小写)
B:不用定义返回值类型
C:不可以写return语句
2)作用:用于给对象中属性进行初始化。
A:格式类名(){code}Person(){}
B:Person(){}public Person(){}
3)默认构造函数:
若未手动定义空参数构造函数,系统会自动给一个空参构造;
若定义了构造函数,无论是有参还空参的,系统就不再给空参数的了。
4)多个构造函数是以重载的形式存在的。重载构造函数,是根据参数列表来区分是哪个构造函数。
A:Person(){}//Person p = new Person();
B:Person(int age,String name){}
C:Person(int age){}
D:Person(String name,int age){}
注意:构造还可以用于给属性赋值。
1 class Person{ 2 int age; 3 String name; 4 Person(){} 5 Person(int age,String name) {//age = 20,name = "zhangsan"; 6 this.age = age; 7 this.name = name; 8 } 9 public void speak(){ 10 System.out.println(age + "....." + name); 11 } 12 } 13 class Demo{ 14 public static void main(String[] args) { 15 //Person p = new Person(20,"zhangsan"); 16 Person p = new Person(); 17 p.speak(); 18 } 19 }
五、this关键字
1)代表本类对象的引用。使用的时候,谁调用方法,this就代表谁。
2)什么时候使用this呢?
A:当局部变量和成员变量重名的时候,可以用this进行区分。
B:写功能的时候,需要调用本类的对象时,可能用到this。比如比较两个对象的年龄compare()
C:构造函数中使用this
this() 必须放在第一行。
同下面的道理:
1 Person(String name){ 2 this.name = name; 3 } 4 5 Person(String name,int age){ 6 7 this("张三");//是找带一个字符串类型参数的构造方法 8 this.name = name; 9 this.age = age; 10 //this("zhangsan"); 11 12 } 13 Person p = new Person("lisi",20);
六、代码块
1)局部代码块 控制变量的生命周期{int x}
2)构造代码块 每创建一次对象就执行一次。
3)思考下面的问题
Person p = new Person();
它在内存中做了哪些事情?
A:将Person.class文件加载到内存中。
B:在栈内存中声明Person类型的变量P。
C:在堆内存中创建一个对象Person。分配地址值
D:把Person中的属性进行默认初始化。
E:把Person中的属性进行显示初始化。
F:调用构造代码块(如果没有,不执行这个操作)。
G:调用构造函数进行初始化。
H:把堆内存的地址(引用)赋给了栈内存中P。
七、static关键字
1、static关键字
1)静态的意思。可以修饰类的成员(成员变量和成员方法);
2)静态成员的特点:
A:随着类的加载而加载,生命周期最长。
B:优先于对象存在。
静态成员一编译就存在:javac Demo 生成Demo.class
对象在运行时才创建:java Demo{ Demo d = new Demo();}
C:被所有的对象所共享。
D:比非静态成员多了一种访问方式,可以通过类名直接调用。建议用类名.调用
3)什么时候需要使用static修饰呢?
当类中的成员需要被所有对象共享时,用static修饰。不需要被共享时,就不用static修饰。
简单说:共性用static修饰,特性不用static修饰。
4)注意事项
A:静态方法只能访问静态成员的。
B:静态方法中不能使用this,super关键字。
C:main是静态的。
格式如下:
public static void main(String[] args){}
由于它被jvm调用,所以权限要足够大,所以用public权限修饰符。
为了jvm可以不用创建对象直接调用它,所以用static修饰。
void:jvm不需要任何返回。但是方法体结尾默认有return;
main:jvm只认识这个名字。
String[]:有可能需要传入参数。
args:字符串数组的名字,只要符合标识符的命名规则可以随便起。
5)静态代码块
类中加载流程?
静态代码块--构造代码块--构造方法。
2、静态的应用
工具类ArrayTool
因为使用的都是class文件。所以你应该先编译ArrayTool,然后再编译ArrayToolDemo,最后执行ArrayToolDemo。
但是如果引用的工具类特别多的情况下,这样就很麻烦,所以java提供好的方式:只编译ArrayToolDemo即可。
(其实它首先在classpath下找ArrayTool.class,如果没有,接下来在当前类下找ArrayTool.class文件。
如果还没有,它就会找ArrayTool.java文件,并且进行编译。如果都没有,就报错。)
制作工具说明书:代码中有文档注释,用javadoc解析。
javadoc -d myAPI -author -version ArrayTool.java
-d 后面跟目录
ArrayTool.java 源代码文件
javadoc: 错误 - 找不到可以文档化的公共或受保护的类。
改用public修饰一下即可
API(Application programming Interface):应用程序编程接口。
JavaAPI:java的帮助文档。
八、单例设计模式
java中有23种设计。
单例设计模式:保证类在内存中只有一个对象。
如何保证类在内存中只有一个对象呢?
(1)控制类的创建,不让其他类来创建本类的对象。private
(2)在本类中定义一个本类的对象。Single s;
(3)提供公共的访问方式。 public static Single getInstance(){return s}
单例写法(掌握1和2两种):
(1)饿汉式 开发用这种方式。
1 class Single{ 2 private Single(){ 3 } 4 5 static Single s = new Single(); 6 7 public static Single getInstance(){ 8 return s; 9 } 10 }
(2)懒汉式 面试写这种方式。多线程的问题?
1 class Single { 2 private Single(){} 3 4 private static Single s; 5 6 public static Single getInstance(){ 7 if(s==null){ 8 s = new Single(); 9 } 10 return s; 11 } 12 }
(3)第三种格式
1 class Single { 2 private Single() {} 3 4 public static final Single s = new Single();//final是最终的意思,被final修饰的变量不可以被更改 5 }