Java基础[03-面向对象]

一、面向对象概念

1、理解面向对象

  • 面向对象是相对面向过程而言

  • 面向对象和面向过程都是一种思想

  • 区别:

1)面向过程:强调过程,功能行为,执行者

2)面向对象:将功能封装进对象,强调具备了功能的对象,指挥者

  • 面向对象是基于面向过程的。

2、面向对象思想的特点:

A:它是一种更符合人们思考习惯的思想

B:它使复杂的内容简单化

C:它使我们从执行者变成了指挥者

3、面向对象开发、设计

1)完成需求时:

先要去找具有所需的功能的对象来用。

如果该对象不存在,那么创建一个具有所需功能的对象。

这样简化开发并提高复用。

2)开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。

3)设计的过程:其实就是在管理和维护对象之间的关系。

4、面向对象的特征:

? 封装(encapsulation)

? 继承(inheritance)

? 多态(polymorphism)

二、类与对象

1、类与对象的关系

1)类是具体事物的抽象,概念上的定义。

2)对象是该类事物实实在在存在的个体。

2、类的定义

使用计算机语言就是不断的在描述现实生活中的事物,java中描述事物通过类的形式体现。

1)类:对现实世界中事物的描述(属性和行为)

? 属性:对应类中的成员变量。

? 行为:对应类中的成员函数。 

2)定义类其实在定义类中的成员(成员变量和成员函数)。

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){}

注意:构造还可以用于给属性赋值。

Java基础[03-面向对象]
 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 }
Java基础[03-面向对象]

五、this关键字

1)代表本类对象的引用。使用的时候,谁调用方法,this就代表谁。

2)什么时候使用this呢?

A:当局部变量和成员变量重名的时候,可以用this进行区分。

B:写功能的时候,需要调用本类的对象时,可能用到this。比如比较两个对象的年龄compare()

C:构造函数中使用this

this() 必须放在第一行。

同下面的道理:

Java基础[03-面向对象]
 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);
Java基础[03-面向对象]

六、代码块

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)饿汉式 开发用这种方式。

Java基础[03-面向对象]
 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 }
Java基础[03-面向对象]

(2)懒汉式 面试写这种方式。多线程的问题?

Java基础[03-面向对象]
 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 }
Java基础[03-面向对象]

(3)第三种格式

1 class Single {
2     private Single() {}
3 
4     public static final Single s = new Single();//final是最终的意思,被final修饰的变量不可以被更改
5 }

Java基础[03-面向对象]

上一篇:浏览器缓存


下一篇:离线渲染中的不规则光源(Meshlight)