JavaSE基础——面向对象1:类与对象005
JavaSE基础——面向对象1:类与对象
一、编程思想
一般来说,计算机语言要处理的就两个方面的内容:数据和算法。数据是程序使用和处理的信息;算法是程序使用的方法。
1.面向过程编程(POP, Procedure Oriented Programming)
核心思想:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
举例说明:以把大象放入冰箱为例,我们首先定义一个拿到大象的函数,然后定义一个开冰箱的函数,然后定义一个放大象的函数,然后定义一个关冰箱的函数,最后依次调用就可以实现功能了。
代表语言:C语言
面向过程编程在考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现,因此比较强调算法方面。
2.面向对象编程(OOP,Object Oriented Programming)。
核心思想:通过将现实世界中的物体抽象成一个具体的类,通过调用类的相关方法来完成一系列行为。
举例说明:以把大象放入冰箱为例,我们先定义一个人的类,有拿大象、放大象、开冰箱、关冰箱的方法(也就是人可以做这些事情),再定义一个大象类,再定义一个冰箱类,然后创建相应的对象调用相关的方法即可。**
代表语言:C++、C#、Java等等。
关于面向对象:
-
以类的方式组织代码,以对象的方式组织(封装)数据。
-
面向对象的三大特征是:封装、继承和多态。
-
从认识的角度上来说,是先有对象后有类。对象是具体的事物,类是抽象的,是具体事物的抽象概括(属性:对象是什么样子的;方法:对象能干些什么。属性+方法= 类)。
-
从代码运行角度来说,是先有类后有对象,类是对象的模板,有了类才能实例出对象。
在考虑问题时,以对象为单位,考虑它的属性及方法。因此面向对象编程更多的是强调数据。
3.面向接口编程(IOP,Interface Oriented Programming)
定义(规范,约束)与实现(名实分离的原则)的分离。
接口的本身反映了系统设计人员对系统的抽象理解。
4.面向切面编程(AOP,Aspect Oriented Programming)
通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
5.函数式编程(Function Programming)
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。主要思想是把运算过程尽量写成一系列嵌套的函数调用。
代表语言:Python、JavaScript语言等。
二、类与对象
类是对象的抽象,对象是类的实例化。
1.初识类与对象
类是什么?
类是引用类型的一种。
类是一种抽象的数据类型,它是对某一类事物的整体抽象性的概括/定义。但并不能代表某一个具体的事物。
属性+方法= 类
属性:对象是什么样子的;方法:对象能干些什么
对象是什么?
对象是抽象概念的具体实例,能够体现出特点,展现出功能。
package com.oop.www;
//一个项目中应该只有一个main方法,这里将main方法放在Application类中
//该文件只是用来创建一个Student类,因此该文件中不需要main()方法
public class Student {
//属性 + 方法 = 类
//因此Student类中需要抽象出student对象共有的特征(属性)和功能(方法)
//属性:所有student对象共有的特征
//在实例化对象的时候,定义属性,从而得到不同的对象
int age;
double score;
String name;
//方法:所有student对象共有的功能
//定义一个非静态的study方法,所有Student类实例出来的对象都可调用该方法
public void study () {
//this关键字就代表该类,this.name即访问该类的name属性
System.out.println(this.name + "在学习");
}
//定义一个静态的play方法
public static void play() {
System.out.println("学生在玩耍!");
}
}
package com.oop.www;
?
?
public class Aplication {
public static void main(String[] args) {
//通过new将类实例出对象
//这里就通过new将Student类实例出了两个对象,xiaoming和xiaohong
//通过new实例对象的时候,除了分配内存空间,还会给实例出的对象进行默认的初始化以及对类中构造器的调用
Student xiaoming = new Student();
Student xiaohong = new Student();
//new实例化对象的同时也会对对象进行初始化(即数据类型的默认值)
System.out.println(xiaoming.name);
System.out.println(xiaoming.age);
System.out.println("************************");
//将对象的属性进行赋值并打印
xiaoming.name = "小明";
xiaoming.age = 8;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age);
System.out.println("************************");
//调用对象的非静态方法
xiaohong.study();
//调用类的静态方法
Student.play();
//Student.study(); 由于study是非静态方法,只能通过对象调用,因此该语句报错
}
}
?
---------------------------------------------------
运行结果:
null
0
************************
小明
8
************************
null在学习
学生在玩耍
?
2. 构造器(构造方法)
构造器也称为构造方法,是在创建对象的时候必须要调用的,使用new关键字来创建对象的本质就是在调用构造方法。构造方法常用来初始化对象。
2.1 构造方法的特点
构造器(构造方法)有以下特点:
-
构造方法的方法名必须与类名一样。
-
构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
-
构造方法可以重载,以参数的个数,类型,或排序顺序区分。
-
所有的类都有构造方法。当未定义构造方法时, Java 会自动提供一个默认的构造方法,默认构造方法的访问修饰符和类的访问修饰符相同(类为 public,构造函数也为 public;类改为 protected,构造函数也改为 protected)。
一旦自定义了构造方法,默认构造方法就会失效。
2.2 有参构造与无参构造
在使用new关键字实例化一个对象的时候,会分配内存空间、调用构造方法并进行对象的初始化。
构造方法的主要功能就是完成对象的初始化,根据是否有参数分为有参构造和无参构造。
1. 无参构造:
无参构造方法就是构造方法没有任何参数。构造方法在创建对象调用,无参构造方法中一般用于给属性赋值默认值。
当未定义构造方法的时候,JVM会默认给类分配一个无参构造,默认的无参构造方法里什么也没有,参数还是数据类型的默认值。
//创建一个类,类名为Dog,该类不是主方法类,文件中不含main()方法
public class Dog {
//属性
String name;
int age;
double length;
//构造方法:与类同名,无返回值,不应void关键字
//作用:当用new实例化对象时调用构造方法,对属性赋值默认定义值
public Dog() {
System.out.println("构造方法");
age = 2;
length = 80;
}
//其他类方法
public static void play() {
System.out.println("一般类方法:正在玩耍!");
}
}
?
当未定义构造方法的时候,JVM会默认给类分配一个无参构造,形如:
public Dog(){
}
2. 有参构造:
当构造/实例化一个对象时,可以向构造方法中传递参数,这样的构造方法称为有参构造。
//创建一个类,类名为Dog,该类不是主方法类,文件中不含main()方法
public class Dog {
//属性
String name;
int age;
double length;
//无参构造方法:与类同名,无返回值,不用void关键字
//作用:当用new实例化对象时调用构造方法,对属性赋值默认定义值
public Dog() {
System.out.println("构造方法");
age = 2;
length = 80;
}
//有参构造方法,与类同名,无返回值,不用void关键字,但接收参数
//作用:用new实例化对象时调用构造方法,对属性赋值接收的参数值
//与无参构造方法属于方法重载的关系
public Dog(String _name, int _age, double _length) {
name = _name;
age = _age;
length = _length;
}
//其他类方法
public static void play() {
System.out.println("一般类方法:正在玩耍!");
}
public void showInfo() {
System.out.println("我的名字是:" + name);
System.out.println("我的年龄是:" + age);
System.out.println("我的身高是:" + length);
}
}
3. 有参构造的问题
如果一个类提供了有参构造方法,JVM就不会给类自动分配无参构造方法了。因此,需要显式地提供一个无参的构造方法。
当定义了有参构造方法的时候,应该习惯于再定义一个无参的构造方法
-
IDEA生成构造方法的快捷键:
Alt + insert
(insert 在F2旁边) -
可以有多个构造方法,它们之间属于方法重载的关系。
JavaSE基础——面向对象1:类与对象005
原文地址:https://www.cnblogs.com/morangu/p/14650338.html