12面向对象
传统的C语言属于面向过程编程语言。 面向过程解决问题的思路: 面向过程的抽象是将实现一个功能的一组命令组合成为一个函数,这个函数就能实现这一个功能,是对功能实现的一种抽象,有了函数,我们就没有必要重复写很多的代码(特殊地譬如递归,可通过循环替代),仅仅一个代码集合名称以及参数就能调用抽象的命令集合。
Java语言属于面向对象编程语言 面向对象解决问题的思路: 从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。
面向对象编程包括 面向对象的分析(OOA,Object Oriented Analysis) 面向对象的设计(OOD,Object Oriented Design) 面向对象的编程实现(OOP,Object Oriented Programming) 面向对象思想说明 OOA:通常是把构成问题域的事务分解成各个对象,给对象赋予相应的属性和行为,通过多个对象的相互协调来解决问题。 建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为 。支持面向对象编程是Java 语言的重要特点。 OOD:这些对象没有先后顺序,共同作用才构成了整个系统。我们只要用代码设计出这几个类型的对象,然后让他们互相通信、传递消息就可以完成系统功能。 面向对象编程思想实际上就是一种运用对象、类、继承、封装、聚合、关联、消息、多态性等概念来构造系统的软件开发方法。 OOP:编写代码
12.1 面向对象概念
抽象(abstract):
从事物中舍弃个别的非本质特征,抽取共同的本质特征
只考虑与问题域相关的信息,而忽略与问题域不相关的部分
对象(object):是系统中用来描述客观事物的一个实体。
可以是有形的,也可以是无形的(如一个客户,一张银行卡,窗体中的一个按钮等等)
对象是构成世界的一个独立单位
具有自己的静态结构(属性)和动态行为(方法)
每个对象有自己的唯一标识
类(class):
类是一组具有相同属性和行为的对象的抽象,类的作用是用来创建对象,对象是类的一个实例
类和对象的关系
抽象和具体的关系。
每一个类在某一时刻都有零个或更多的实例, 类是生成对象的模板
一个类定义了使用哪些数据来描述属性,每一个对象都有相应的属性值数据,一个类通过一系列方法来定义行为,这些方法能在每个对象中被激活
12.2类的定义
什么是类 把相似的对象划归成一个类。 在软件设计中,类,就是一个模板,它定义了通用于一个特定种类的所有对象的属性(变量)和行为(方法)。
[类修饰符] class 类名{
类的成员
…
}
实例
public class Human {
String name;
int age;
public void eat(){
System.out.println("吃喝");
}
public void play(){
System.out.println("xxx游戏");
}
}
12.3 对象的创建
什么是对象
类(class) — 是对某一类事物的描述
对象(object) — 是实际存在的某类事物的个体
也称为实例(instance)
创建语法语句
类名 对象名 = new 类名();
实例
//对象的声明和创建
Human zhangfei = new Human();
12.4 对象的使用
在其他类中,使用对象名点运算符调用属性和方法 引用类的属性:对象名.属性 引用类的方法:对象名.方法名(实参)
在类内的方法中,访问本类的属性和方法可以直接访问
package com.neusoft.oo;
/**
* 项目: javaadvice
* 类名: Human
* 创建时间: 2020/11/15 16:29
* 描述 : 人类
* 作者 : 张金山
* QQ: 314649444
* Site: https://jshand.gitee.io
*/
public class Human {
//属性,全局的变量
String name ="人类";
int age;
public void eat(){
//在方法中声明的变量称之为 局部变量
System.out.println("吃喝");
}
public void play(){
System.out.println("xxx游戏");
}
public void sayHello(){
System.out.println("大家好 我是xxx");
}
public static void main(String[] args) {
// int xx = 0;
int[] ages = new int[30];
//对象的声明和创建
Human zhangfei = new Human();
////给属性赋值
zhangfei.name = "张飞";
//调用变量的属性
System.out.println("zhangfei.name\t"+zhangfei.name);
//调用方法 对象名.方法名();
zhangfei.sayHello();
}
}
12.5 创建对象原理
java程序是交由JVM执行的,根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。
我们在实例化一个对象时,同时操作了栈内存和堆内存。
在栈内保存对象的首地址,即引用; 在堆内存中保存了对象的属性。 对对象的所有操作只能通过引用完成,一旦引用出栈释放没有任何引用指向该对象,对象就变成垃圾失效。
12.6 垃圾回收机制
垃圾回收(Garbage Collection,GC),JDK7以后使用G1(Garbage First)机制: 当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。 垃圾回收机制作用于堆内存,与栈内存无关。 垃圾回收机制是JVM内部运行的一个优先级比较低的后台线程,自动进行垃圾回收。它是保证程序健壮的主要手段,不用程序员参与,避免了由于程序员忘记回收内存而引起的内存泄漏,同时也避免了回收内存带来的代码繁琐。 对象会被回收情况: 1、对象的引用被赋值为null: Person p = new Person( ); p = null; 2、使用的匿名对象: new Person( ).sayHello( ); 3、超出生命周期的,如: for( int i = 0; i< 100; i++){ Person p = new Person( ); } 这里,创建了100个对象,循环赋值给变量p,每结束一次循环,变量p就超出生命周期,对象变为垃圾。
12.7 java中的值传递
package com.neusoft.oo;
/**
* 项目: javaadvice
* 类名: MyMath
* 创建时间: 2020/11/15 16:51
* 描述 : 算数
* 作者 : 张金山
* QQ: 314649444
* Site: https://jshand.gitee.io
*/
public class Human {
//属性,全局的变量
String name ="人类";
int age;
}
public class MyMath {
public void plus(int num){
num ++;
System.out.println(num);
}
public void plus(Human h){
h.age ++;
System.out.println("inner "+h.age);
}
public static void main(String[] args) {
int num = 100;
new MyMath().plus(num);
System.out.println("num:"+num);
Human h = new Human();
h.age = 100;
new MyMath().plus(h);
System.out.println("outer h.age:"+h.age);
}
}
12.7 构造方法
this 关键字
构造方法(构造器,Constructor) 构造方法也是方法,但是它是特殊的方法而已 所有的对象都是通过构造器来创建的 创建对象:
构造器(构造方法/构造器,Constructor)特点: 构造方法名必须与类相同的名称 不含返回值类型,也没有void 不能在方法中用return语句返回一个值
构造方法用来完成对象的创建,即完成对象的实例化 在Java中,每个类都至少要有一个构造器 一个类可以不写出构造方法,编译器会自动的给这个类增加一个构造器,该构造器没有任何参数,我们称之为“默认的空构造器”。
package com.neusoft.oo;
/**
* 项目: javaadvice
* 类名: Tiger
* 创建时间: 2020/11/16 8:47
* 描述 : 老虎
* 作者 : 张金山
* QQ: 314649444
* Site: https://jshand.gitee.io
*/
public class Tiger {
String name;
int age;
public static void main(String[] args) {
//Tiger
Tiger t = new Tiger();//默认无参构造器
}
}
12.8 构造方法的重载
当声明了带参的构造器,如果需要无参构造器,必须显示的声明。
this代表本类对象 或者是构造器
package com.neusoft.oo;
/**
* 项目: javaadvice
* 类名: Tiger
* 创建时间: 2020/11/16 8:47
* 描述 : 老虎
* 作者 : 张金山
* QQ: 314649444
* Site: https://jshand.gitee.io
*/
public class Tiger {
String name;
int age;
String address;
/**
* 构造器不需要声明返回类型
* 构造方法跟类名必须一样
* 没有return语句
* @return
*/
Tiger(){
}
//构造器重载
//this代表本类对象
Tiger(String name,int age){
this.name = name;
this.age = age;
}
//this() 在此处代表本类的构造器
Tiger(String name,int age,String address){
this(name,age);
this.address = address;
}
public static void main(String[] args) {
//Tiger
Tiger t = new Tiger();
Tiger t1 = new Tiger("东北虎",10);
Tiger t2 = new Tiger("华南虎",5);
System.out.println("t1.name\t"+t1.name);
}
}
12.9 构造方法调用
12.10 Java包的概念
在Java中,包主要有以下用途 : 包允许将类组合成较小的单元 有助于避免命名冲突 包允许在更广的范围内保护类、数据和方法 将类放入包中,语法为:
package 包名;
使用包注意问题: 在java中位于包中的类,在文件系统中的存放位置, 必须有与包名层次相对应的目录结构 package语句作为java源文件的第一条语句 每个源文件只能声明一个包 如果没有package语句,则默认为无名包 Java类库中常用的包 java.lang Java默认包,任何程序中,该包都被自动导入。 java.io 输入/输出操作有用的类的组成。
12.10.1 package和import说明
声明
package com.neusoft.p1;
/**
* 项目: javaadvice
* 类名: PackTest
* 创建时间: 2020/11/16 9:23
* 描述 :
* 作者 : 张金山
* QQ: 314649444
* Site: https://jshand.gitee.io
*/
public class PackTest {
}
import
同一个包下不需要,访问不同包中的类,使用import关键字引入其它包中的类 必须在package声明后面,类声明前面 import语句可以出现多次
package com.neusoft.app;
import com.neusoft.p1.PackTest;
/**
* 项目: javaadvice
* 类名: Main
* 创建时间: 2020/11/16 9:23
* 描述 : 入口类
* 作者 : 张金山
* QQ: 314649444
* Site: https://jshand.gitee.io
*/
public class Main {
public static void main(String[] args) {
//com.neusoft.p1.PackTest
//使用全限定名 包名+类名
// com.neusoft.p1.PackTest pt = new com.neusoft.p1.PackTest();
PackTest packTest = new PackTest();
}
}
import通配符
只能导入当前包,不包含子包
import com.neusoft.p1.*;
注意:java.lang包中的类几乎所有代码都会用到,因此无论写没写 import java.lang.*,编译器都会自动帮你补上
12.11 静态:static关键字
static关键字可以修饰的元素
- 属性 注意:只能修饰属性,不能修饰局部变量。
- 方法
- 代码块
static修饰属性:
- 所有对象共享,称为静态变量或类变量
- 不用static修饰的属性称为实例变量
static修饰方法:
不需要实例化,可以直接访问,称为静态方法或类方法
static修饰语句块:
类中由static关键字修饰的,不包含在任何方法体中的代码块,称为静态代码块
package com.neusoft.st;
/**
* 项目: javaadvice
* 类名: Math
* 创建时间: 2020/11/16 9:58
* 描述 :
* 作者 : 张金山
* QQ: 314649444
* Site: https://jshand.gitee.io
*/
public class Math {
//static 属性
static double PI = 3.14;
static {
PI = 4;
System.out.println("静态代码块,优先执行");
}
// ALT +INSERT
public Math() {
System.out.println("构造器.....");
}
//静态方法
public static int plus(int numa ,int numb){
return numa + numb;
}
public static void main(String[] args) {
new Math();
System.out.println(Math.PI);
System.out.println(Math.plus(10,20));
}
}
12.12 单例模式
package com.neusoft.st;
/**
* 项目: javaadvice
* 类名: Earth
* 创建时间: 2020/11/16 10:28
* 描述 : 地球
* 作者 : 张金山
* QQ: 314649444
* Site: https://jshand.gitee.io
*/
public class Earth {
private Earth(){
}
private static Earth earth ;
/**
* 懒汉模式
* @return
*/
public synchronized static Earth instance(){
if(earth == null){
earth = new Earth();
}
return earth;
}
}
