面向对象与面向过程的区别
(1)面向过程设计思想
分析出解决问题所需要的步骤,然后用函数把这些函数把这些步骤一步一步实现
以算法为核心
自顶向下设计,要求一开始必须对问题有很深的了解
将大问题转化为若干小问题来求解
表现形式:用函数来作为程序的基本单位
直接面向问题
(2)面向对象设计思想
确定该问题由那些事物组成,先用类模拟出该事物
通过类间接的解决问题
自下而上设计,从问题的一部分着手,一点一点地构建出整个程序
表现形式:用类来作为划分程序的基本单位
对于需求不明确、变动较大、规模很大的问题非常适合
对于“需求明确、规模不大、变动较小的问题”则显得十分累赘
什么是类
把一类事物的静态属性和动态可以执行的操作组合在一起所得的这个概念就是类
类是抽象的,用来模拟一类事物,是一个概念
一旦被定义,类的概念就永远存在了
类的定义
class Person {
int age;
void shout() {
System.out.println("oh, my god! i am " + age);
}
}
age是类的属性,也叫类数据成员,也叫字段,也叫域
shout是方法,也叫类的成员函数
shout方法可以直接访问同一个类中的age变量
什么是对象
类的一个个体
具体的,实实在在存在的事物
生命周期是短暂的,会生成和消亡
类与对象的关系
如果将对象比作汽车,那么类就是汽车的设计图纸
内存分配
A.java文件
class A {
int i;
int j;
}
class TestMemo {
public static void main(String[] args) {
A aa = new A(); // (A *)malloc(sizeof(A));
// new A(); 在堆中动态分配一块区域,被当做了A对象
// aa本身的内存是在栈中分配的
// 堆中内存的地址赋给了aa
// aa指向堆中的内存,aa代表了堆中的内存
// aa.i 代表:aa这个静态指针变量所指向的动态内存中的A对象的i这个成员
// aa.j 代表:aa这个静态指针变量所指向的动态内存中的A对象的j这个成员
aa.i = 50;
aa.j = 80;
System.out.println("%d, %d\n", aa.i, aa.j); // 50, 80
//int i = 10;
}
}
程序执行过程
访问控制符
class Triangle {
int a, b, c; // 如果不加访问控制符private,默认是default
void set(int i, int j, int k) {
a = i;
b = j;
c = k;
}
int zhouchang() {
return a + b + c;
}
double area() {
double p = 1.0*(a+b+c) / 2;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
}
class TestTriangle {
public static void main(String[] args) {
Triangle t = new Triangle();
t.a = 3;
t.b = 4;
t.c = 5;
// t.set(3, 4, 5);
System.out.println("%d %f\n", t.zhouchang(), t.area());
}
}
在类的成员前面加上private访问控制方,就能很好地保护类里面数据,提高成员的安全性,加了private之后,别的类就不能直接访问类的成员了,要通过他的set方法来访问
类的访问控制符
class A {
private int i;
public int j;
protected int m;
private void f() { // OK
i = 1;
j = 2;
m = 3;
k();
g();
}
protected void k() {
}
public void g() { // OK
i = 1;
j = 2;
m = 3;
k();
g();
}
}
class TestAccess {
public static void main(String[] args) {
A aa = new A();
// aa.i = 10; // error; 因为 i 是私有的
aa.j = 20; // OK 因为 j 是public
aa.m = 30; // OK 因为 m 是 protected
}
}
(1)类的访问控制符有4中:public、protect、default【默认】、private
(2)在一个类的内部,所有的成员可以相互访问,访问控制符是透明的;访问控制符是针对外部访问而言。
(3)外部访问包括两种方式:1. 通过类名访问类内部的成员 2. 通过类对象名访问类内部成员
(4)public:可以通过外部访问方式访问类内部的public成员
(5)private:不可以通过外部访问方式访问类内部的private成员
(6)其他内容在继承和包中再讨论
总结:private修饰符(重点)
- 在一个类的内部,所有的成员可以相互访问,访问控制符是透明的
- 在一个类的外部:通过
类对象名.私有成员名
的方式是无法访问该对象中的私有成员的,这样写编译时会出错的!
类的构造函数
(1)特点:1. 函数名与类名是相同的;2. 不能有返回值;3. 可以有参数,也可以没有参数;4. 可以有多个
(2)说明:声明一个对象,系统首先为该对象分配内存,然后立即自动调用该对象的构造函数
(3)注意
任何一个类对象被生成时一定会调用该类的构造函数
无论一个类有多少个构造函数,生成一个对象时一定只会调用其中的某一个构造函数
构造函数的返回值问题
(1)在一个类中可以定义多个函数名与类名相同但却有返回值的函数,返回值为void或int或double都可以,这些有返回值的函数只要能满足重载的特点,就可以同时存在一个类中,不过要注意:这些有返回值的函数(包括返回值为void的函数)都不是构造函数,都不会被类对象自动调用
(2)当然也可以定义多个没有任何返回值的函数,注意连void都不可以加,这些函数才是构造函数,无返回值的函数才会被对象自动调用
(3)如果定义了有返回值并且方法名与类名相同的方法,程序并不会报错,但容易产生歧义,所以强烈建议不要在构造方法前面加返回值
构造函数数据成员的赋值问题
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值
成员变量类型 | 初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0D |
char | ‘\u0000’ |
boolean | False |
All reference bype | Null |
(1)如果在定义的时候不初始化,则它的值是系统自动分配好的默认值!
(2)如果在定义的同时赋初值,则是可以的,也就是说该值是生效的。注意在C++中不可以
(3)如果在定义的同时赋初值,当然生效,但如果在构造函数中又改变了定义时赋的初值,则该数据成员最终的值就是构造函数中修改之后的那个值。因为系统会先执行定义时赋的初值,然后再执行构造函数中赋的初值
多个构造函数可能带来的冲突
一旦编程者为类定义了构造方法,系统就不再提供默认的构造方法了