- 面向对象编程:
- 什么是面向过程:
- 什么是面向对象:
- 如何定义类:
- 如何创建对象:
- 如何访问对象:
- 成员的初始化默认值:
- this 指针:
- 构造方法(Constructor):
- 构造方法的细节:
- this调用构造方法
- 构造代码块:
- static 关键字:
- 静态内部类:
- 静态方法:
- 静态属性:
- 静态代码块:
- 静态变量与成员变量的区别
- 成员的加载顺序:
- 重写函数:
- Java(权限)访问修饰符:
面向过程也是解决问题的一种思想,当我们在解决问题时,会按照预先设定的想法和步骤,一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。
上述描述的每一个具体步骤我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向
过程最直接的体现。
通过上面简单的描述发现,面向过程,其实就是面向着具体的每一个步骤和过程,就是面对具体的
每一个功能函数。这些功能函数相互调用,完成需求。
提出问题, 分解问题, 一一解决
实质上是函数的调用
什么是面向对象:OOP(Oriented Object Programming):
当不再面对具体的每一个方法时,发现操作也变的简单了很多。而封装具体功能的这类,是我们需
要面对的。而基于这个封装了具体功能的类,那怎么使用呢?
当面向封装了具体功能类,若要使用这个类,一般情况下,在Java中需要通过创建这个类的实体来 使用。这个实体称之为对象。在开发中,我们是在不断的找封装不同功能的类。基于这些类,创建其对 象,使用这些对象完成相应的操作。
通过上面的讲解和分析得出:面向对象是基于面向过程,对象是将功能进行了封装。只要找到了具
体的类,创建出对象,就可以调用其中的具体功能。面向对象也是用来解决问题的一种思维模式。
在以后开发中,先找对象,调用对象中的具体功能。如果真的没有能够完成需求的对象,这时就自
己创建对象,并将所需的功能定义到对象中,方便以后使用。
面向对象的思想也就是人认识世界所采用的方式: 分门别类的思想:
世界上的万物人都进行了分类, 按照相似性把数不清的事物分归类到有限的类别中, 比如不管是百灵鸟还是麻雀都是鸟类, 每个人有姓名都是不一样的个体但都叫人类
类(class): 类别
在java中, 使用class关键字定义类
属性:
类的固有特征
行为和动作:
函数 function(方法 method)
对象(object): 一个类别中的具体案例
如何定义类:类的成员:
- 属性
- 方法
- 构造方法
- 静态属性
- 静态方法
- 构造代码块
- 静态代码块
访问修饰符 类型 属性名称 = 属性值;
public class Test {
public static void main(String[] args) {
}
}
// 定义了一个狗类
class Dog {
// 固有属性, 类的固有特征
// 访问修饰符 类型 属性名称 = 属性值;
public String name;
public int age = 3;
// 狗会跑
public void run() {
}
// 狗会吃
public void eat() {
}
// 构造方法
public Dog() {
}
}
局部变量与成员变量的区别:
定义位置不同:
- 成员变量定义在类中
- 局部变量定义在方法中或者语句里面
在内存中的位置不同:
- 成员变量存储在堆内存的对象中
- 局部变量存储在栈内存的方法中
声明周期不同:
- 成员变量随着对象的出现而出现在堆中, 随着对象的消失而从堆中消失
- 局部变量随着方法的运行而出现在栈中, 随着方法的弹栈而消失
初始化不同:
- 成员变量因为在堆内存中, 所有都是默认的初始化值
- 局部变量没有默认的初始值, 必须手动给其赋值才可以使用
定义类, 在根据类来创建对象
可以通过类的构造方法创建对象, 使用new关键字
类型 对象名称 = new 构造函数();
Scanner scan = new Scanner(System.in);
Random rand = new Random();
public class Test{
public static void main(String[] args) {
Dog dog = new Dog();
Dog dog_2 = new Dog();
}
}
如何访问对象:
对象.属性
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(dog.name);
Dog dog_2 = new Dog();
dog2.name = "screl";
System.out.println(dog2.name);
}
成员的初始化默认值:
整形和浮点型默认值是 0
字符默认值是 ‘u0000’ 0
对象的默认值是 null
this 指针:在java中, 存在this关键字, 这个关键字默认会指向当前对象
每一个对象都带有一个this指针
非静态的属性和方法不能在静态方法中使用, this只能用在非静态方法中
非静态的方法可以使用静态属性和方法
构造方法(Constructor):与类名相同, 没有返回值, 访问修饰符为public, 非static
如果声明了返回值jvm会将其解释为普通方法
在构造对象的时候自动调用构造方法
调用其他构造函数的语句必须定义在构造函数的第一行, 原因是初始化动作要最先执行
构造函数之间禁止出现相互调用的情况
注意:
- 在java类中如果没有自己定义构造函数, jvm会自动生成一个无参的构造函数, 构造出来的成员的值为默认值, 当定义了一个构造函数之后, jvm就不会生成
- 定义构造函数时, 一定要定义一个无参构造
- 构造方法如果是private不能从类外部实例化
- 一个类中可以有多个构造函数, 多个构造函数是以重载的形式存在的
- 构造方法中也是有return语句的, 用于结束初始化动作
- 构造方法是可以被private修饰的, 作用:其他程序无法创建该类的对象
class Dog {
public String name;
public String color;
// 自定义构造方法
public Dog(String name, String color) {
this.name = name;
this.color = color;
}
// 一定要定义一个无参的构造方法
public Dog() {
}
}
this调用构造方法
在之前学习方法之间调用时, 可以通过方法名进行调用. 可是针对构造方法, 无法通过构造方法名来相互调用.
构造方法之间的调用可以通过this关键字来完成
构造方法调用格式:
this(参数列表);
调用其他构造方法的语句必须定义在构造函数的第一行,原因是初始化动作要最先执行。
构造方法之间禁止出现相互调用的情况。
class Dog {
String name;
int age;
String master;
public Dog() {
}
public Dog(String name, int age, String master) {
this(master); // 调用另一个构造方法
this.name = name;
this.age = age;
}
public Dog(String master) {
this.master = master;
}
}
构造代码块:
在类中可以用{ } 表示构造代码块
class Dog {
{
System.out.ptintln("这是一个构造代码块");
}
}
static 关键字:
static 关键字可以修饰(属性, 方法, 类, 语法块, 导包)
static 还可以修饰内部类
被static修饰的只能执行一次
static 修饰的代码(方法或者属性), 会提前加载到内存中, 并且只有一份属于该类, 因此:
- 静态方法中, 无法直接调用非静态方法(或者属性)
- 被static 修饰的属性和方法, 不属于对象, 属于该类, 直接可以使用类名称.属性(或者方法)来调用
- 非静态的方法可以使用静态属性和方法
- 在静态方法中调用非静态方法和非静态属性, 需要先实例化
class Test {
// 静态内部类:
static class Test_2 {
}
}
静态方法:
public static void function() {
}
静态属性:
class Test {
static int num;
}
静态代码块:
static { } 表示静态代码块, 只会执行一次
class Dog {
static {
System.out.println("这是一个静态代码块");
}
}
静态变量与成员变量的区别
-
变量所属不同:
- 静态变量所属与类, 也称为类变量
- 成员变量所属于对象, 也称为实例变量(实例变量)
-
内存中的位置
- 静态变量存储于方法区中的静态区中
- 成员变量存储于堆内存中
-
在内存中出现的时间
- 静态变量随着类的加载而加载, 随着类的消失而消失
- 成员变量随着对象的创建而在堆内存中出现, 随着对象的消失而消失
-
调用方式
- 静态变量可以用类直接调用, 也可对象调用
- 成员变量只能被对象调用
静态属性最先运行, 然后是普通属性, 然后是静态代码块, 然后是构造代码块, 再然后是构造方法, 再是静态方法, 最后是普通方法
重写函数:在打印对象的时候自动调用toString()方法
打印一个继承Object的类, 不重写则默认调用的是Object的toString()方法, 打印出来的是地址的哈希值
用@override 标记重写
class Dog {
public String name;
public String color;
// 构造函数
public Dog(String name, String color) {
this.name = name;
this.color = color;
}
// 重写
@override
public String toString() {
return this.name + this.color;
}
}
Java(权限)访问修饰符:
注意: 只有 缺省 和 public修饰符能修饰类
public: 任何地方都可以正常访问
protected: 只能在同包, 同类, 同子类中访问 // 主要用于修饰方法, 为继承设计
缺省(默认): 只能在同包和同类中访问
private: 只允许当前类中访问



