前言:

我们前面讲过了java基础之自定义数据类型,今天我们接着聊java基础之类与对象,概念,代码,截图,引导图都对应贴相应位置,就是为了让兄弟们能看的懂,学的明白,咱们直接往下看!  

java之类与对象精选_代码

一.介绍 

      面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种优化,操作起来更加的方便,简化了过程。

面向对象有三大特征:

封装性:

指的是隐藏了对象的属性和实现细节,仅对外提供公共的访问方式,这样就隔离了具体的变化,便于使用,提高了复用性和安全性。

继承性:

就是两种事物间存在着一定的所属关系,那么继承的类就可以从被继承的类中获得一些属性和方法;这就提高了代码的复用性。继承是作为多态的前提的。

多态:

是说父类或接口的引用指向了子类对象,这就提高了程序的扩展性,也就是说只要实现或继承了同一个接口或类,那么就可以使用父类中相应的方法,提高程序扩展性,但是多态有一点不好之处在于:父类引用不能访问子类中的成员。

       举例来说:就是:比如说你要去饭店吃饭,你只需要饭店,找到饭店的服务员,跟她说你要吃什么,然后就会给你做出来让你吃,你并不需要知道这个饭是怎么错做的,你只需要面向这个服务员,告诉他你要吃什么,然后他也只需要面向你吃完收到钱就好,不需要知道你怎么对这个饭进行吃。

特点:

(1)将复杂的事情简单化。

(2)面向对象将以前的过程中的执行者,变成了指挥者。

(3)面向对象这种思想是符合现在人们思考习惯的一种思想。

(4)面向对象的三大特征:封装,继承、多态

二.知识点介绍

1、面向对象

2、类与对象

3、自定义类练习

4、对象的内存解释

三.知识点详解

1、概述

        我们回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现。一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。

        在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向过程最直接的体现。

         那么什么是面向过程开发呢? 面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。面向过程的代表语言:C语言

         当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。 可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了,这时就开始思索,能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。

1.2、特点

(1)是一种更符合我们思想习惯的思想;

(2)可以将复杂的事情简单化;

(3)将我们从执行者变成了指挥者,角色发生了转换;

1.3、举例

买电脑:在买电脑的流程中,我们只关注电脑的性能和价格,而不关心电脑是怎么生产的,如何组装的,此时就是将电脑当作一个对象,而人可以有去购买电脑的操作。

洗衣服:在洗衣服的流程中,我们将衣服和人可以看作为对象,而人可以有洗的动作,衣服则是洗的对象。

1.4、面向对象特性

(1)封装:封装是把对象的属性、操作结合在一起,构成一个独立的对象。一旦封装,内部信息对外界是隐藏的,也就象一个四周密封的房子一样,不允许直接对对象的属性进行操作,要想操作,只能通过局部接口(相当于房子的大门)。外部只能看到对象对操作的反应,而不知道对象是如何做出这一反应的。所以封装包含两个方面的含义,一个是信息隐藏,另一个局部开放。会在接下来的课程中详细学习。

(2)继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。会在接下来的课程中详细学习。

(3)多态:指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。会在接下来的课程中详细学习。

2、类与对象

      面向对象的思维方式在Java代码中表现为类的定义与对象的使用。理清类与对象的概念与关系是面向对象的重点。

2.1、类的基本概念

类是具有相同特征(属性)和行为(功能)的一类事物的抽象。

      我们将现实事物的特征抽象为类中的成员变量,现实事物的行为功能抽象为类中的成员方法。

      注意:实际上所属关系是直接属于类的,均称为成员,如成员变量、成员方法、后边学习的成员内部类,并不单指成员变量。

2.2、类的定义格式

类在Java中代码的体现形式:

(1)使用class(类)来抽象一个现实生活中的事物

(2)定义成员变量对应事物的属性,一般使用private修饰,提供get/set方法

(3)定义成员方法对应事物的功能,一般使用public修饰

定义格式:

public class 类名{
private 数据类型 变量名1;
private 数据类型 变量名2;
…其他成员变量
public 返回值类型 方法名(参数类型 参数名,参数类型 参数名2…){
方法体;
}
每个属性对应的get/set方法,使用this区分成员变量与局部变量
}

如:人类

package com.Test;


public class Person {
private String name;
private int age;


public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge (int age) {
this.age = age;
}
public int getAge() {
return age;
}
}

java之类与对象精选_代码_02

2.3、类的使用格式

类的使用非常简单,一般分为两个动作:创建对象与调用方法。

     类的定义是现实事物的抽象,真正使用的是类创建的对象。通常使用对象来调用方法。

对象创建格式:数据类型

对象方法的调用:无返回值:对象名.方法名(参数);

有返回值:返回值类型

2.4、成员变量

     直接定义在类中的变量称为成员变量,在面向对象思想设计上,是类的组成部分。

成员变量通常使用private修饰,阻止本类以外的其他类访问。

     成员变量不能重名,局部变量不能重名,成员与局部变量可以重名,但是需要使用this区分。

      使用this访问的为成员变量,直接访问的为局部。在方法内访问变量,如果没有该名称的局部变量会自动查找是否有该名称的成员变量。

2.5、成员方法

      正常定义成员方法时,一般是不需要添加static修饰符的。static修饰符会在后边详细简介。

成员方法一般可分为两类:

(1)没有业务的属性get/set方法,与属性对应

(2)有业务的普通方法,属于类的功能

代码示例:

package com.Test;

/*
* 定义自定义类型 Person类
*
* 属性(成员变量)
* 姓名 String
* 年龄 int
* 行为(成员方法)
* 吃饭
* 睡觉
* 敲代码
*
* 为成员变量赋值/获取成员变量的值的方法
*
* private 修饰的成员(成员变量,成员方法) 让外界无法直接访问 内部可以访问
*
* this区分成员变量与局部变量(注意:这是定义时所展现出来的功能,其功能本质,一会单独说)
*
* 成员方法 一般不使用static修饰
* 分为两种
* 1.get/set方法
* 2.属于类的功能的方法
*/
public class Person {

//定义成员变量
private String name;

private int age;

private String sex;


//吃饭
public void eat(){
System.out.println(name+"吃了");
}

//睡觉
public void sleep(){
System.out.println(name+"睡了");
}

//敲代码
public void hitBeanBean(){
System.out.println(name+"敲代码真得劲!");
}

//为name赋值的方法:方法名:setName;参数:String name;返回值 :void
public void setName(String name){
this.name=name;
}
//获取name的值的方法:方法名;getName;参数:无;返回值:String name
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}

java之类与对象精选_java_03

package cn.javahelp;
/*
* 测试Person类
*
* 导包 在同一个文件夹下不需要导包
* 创建对象 数据类型 变量名 = new 数据类型()
* 调用方法
* 返回值类型 新变量名 = 变量名.方法名(实际参数);
*
*
* 方法调用时,用static修饰的方法调用其他方法时,其他方法必须使用static修饰
* 指的是
* 在同一个类中,直接调用其他方法时,其他方法必须使用static修饰
* 如果使用对象名.方法名()这种方式 其他方法一般不使用static修饰
*/
public class Test {

public static void main(String[] args) {
//创建对象
Person p= new Person();
//调用方法
p.setName("磊哥");
p.setAge(25);
//因为age用private修饰了 所以外界不能直接访问了
//p.age = -1;
//如果使用对象名.方法名()这种方式 其他方法一般不使用static修饰
p.eat();
p.sleep();
p.hitBeanBean();
String name = p.getName();
System.out.println(name);
System.out.println(p.getAge());
//main方法直接调用method方法 method方法必须使用static修饰
//method();
}
public void method(){
System.out.println("我是一个方法");
}
}

java之类与对象精选_java_04

java之类与对象精选_代码_05

2.6、成员变量和局部变量的区别

(1)在类中的位置不同。成员变量:类中,方法外;局部变量:方法中或者方法声明上(形式参数)

(2)在内存中的位置不同。成员变量:堆内存;局部变量:栈内存

(3)生命周期不同。成员变量:随着对象的创建而存在,随着对象的消失而消失;局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

(4)初始化值的不同。成员变量:有默认值;局部变量:没有默认值。必须先定义,赋值,最后使用。

package com.Test;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";

int x;
public void show() {
int y = 0;
System.out.println(x);
System.out.println(y);
}
}

2.7、类与对象的关系

     类是抽象概念,对象是类的具体实例。我们通常真正使用的是某个类的实例对象,进而调用该对象的方法。

     一个类可以有多个对象,一个对象只属于一个类(在讲完多态后会有不同的理解)。

可以说创建对象并调用方法是类最主要的使用方式。

java之类与对象精选_代码_06

       我们学习编程语言,就是为了模拟现实世界的事物,实现信息化。比如:去超市买东西的计费系统,去银行办业务的系统。

我们如何表示一个现实世界事物呢?属性就是该事物的描述信息,行为就是该事物能够做什么。

举例:学生拥有班级、年纪等属性,拥有上课、考试等行为

      我们学习的Java语言最基本单位是类,所以我们就应该把事物用一个类来体现。

类:是一组相关的属性和行为的集合

对象:是该类事物的具体体现

举例:类:学生

对象:小明就是一个对象

2.8、类名作为形式参数和返回值(扩展)

类名作为形式参数案例: 需要的其实是该类的对象

代码示例:

package com.Test;
public class Person {

public void study() {
System.out.println("磊哥疯狂学java");
}
}
class Teacher {
public void test(Person p) {
p.study();
}
}
class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Person p = new Person();
t.test(p);
}
}

java之类与对象精选_代码_07

类名作为返回值案例: 返回的其实是该类的对象

3、自定义类练习

public class Student {
public void study() {
System.out.println("好好学习,天天向上");
}
}
public class Teacher {
public Student getStudent() {
Student s = new Student();
return s;
}
}
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = t.getStudent();
s.study();
}
}

java之类与对象精选_概念_08

       在自定义类型基础上,我们可以将现实生活中的任何事物抽象成一个更为完整的类,请自定义并使用一种数据类型。如人类、动物类、汽车类、衣服类、玩具类等

3.1、自定义人

代码示例:

package com.Test;
/*
* 定义自定义类型 Person类
*
* 属性(成员变量)
* 姓名 String
* 年龄 int
* 行为(成员方法)
* 吃饭
* 睡觉
* 敲代码
*
* 为成员变量赋值/获取成员变量的值的方法
*
* private 修饰的成员(成员变量,成员方法) 让外界无法直接访问 内部可以访问
*
* this区分成员变量与局部变量(注意:这是定义时所展现出来的功能,其功能本质,一会单独说)
*
* 成员方法 一般不使用static修饰
* 分为两种
* 1.get或set方法
* 2.属于类的功能的方法
*/
public class Person {
//定义成员变量
private String name;

private int age;

private String sex;

//吃饭
public void eat(){
System.out.println(name+"吃了");
}

//睡觉
public void sleep(){
System.out.println(name+"睡了");
}

//敲代码
public void hitBeanBean(){
System.out.println(name+"敲代码就是这么得劲!");
}

//为name赋值的方法:方法名:setName;参数:String name;返回值:void
public void setName(String name){
this.name=name;
}

//获取name的值的方法:方法名:getName;参数:无;返回值:String name;
public String getName(){
return name;
}

public void setAge(int age){
this.age=age;
}

public int getAge(){
return age;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}
}

java之类与对象精选_概念_09

package com.Test;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";
/*
* 测试Person类
*
* 导包 在同一个文件夹下不需要导包
* 创建对象 数据类型 变量名 = new 数据类型()
* 调用方法
* 返回值类型 新变量名 = 变量名.方法名(实际参数);
*
*
* 方法调用时,用static修饰的方法调用其他方法时,其他方法必须使用static修饰
* 指的是
* 在同一个类中,直接调用其他方法时,其他方法必须使用static修饰
* 如果使用对象名.方法名()这种方式 其他方法一般不使用static修饰
*/
public static void main(String[] args) {
//创建对象
Person p= new Person();
//调用方法
p.setName("磊哥");
p.setAge(25);
//因为age用private修饰了 所以外界不能直接访问了
//p.age = -1;

//如果使用对象名.方法名()这种方式 其他方法一般不使用static修饰
p.eat();
p.sleep();
p.hitBeanBean();
String name = p.getName();
System.out.println(name);
System.out.println(p.getAge());
//main方法直接调用method方法 method方法必须使用static修饰


}

}

java之类与对象精选_概念_10

4、对象的内存解释

       对象在内存中的位置:对象由new关键字创建,如同数组,实体存在于堆内存中;任何事物均可以定义成类,创建对象,属于引用类型;而对象的引用变量是一个普通变量。存储的值是该对象堆内存中的地址。

java之类与对象精选_java_11

java之类与对象精选_代码_12

java之类与对象精选_java_13

代码示例:

package com.Test;

//定义Phone类
public class Phone {
//品牌
String brand;
//价格
int price;
//颜色
String color;

public void call(String name) {
System.out.println("给"+name+"打电话");
}

public void sendMessage() {
System.out.println("群发短信");
}
}

4.1、一个对象的内存图

代码示例:

package com.Test;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//未赋值
System.out.println(p.brand + "---" + p.price
+ "---" + p.color);
p.brand = "摩托罗拉";
p.price = 2999;
p.color = "皓月白";
//复制后
System.out.println(p.brand + "---" + p.price + "---"+ p.color);
p.call("磊哥");
p.sendMessage();
System.out.println("============="+name+"=============");
}
}

java之类与对象精选_代码_14

java之类与对象精选_java_15


4.2、两个对象,使用同一个方法的内存图

代码示例:

package com.Test;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args) {
//p1第一个对象
Phone p1 = new Phone();
p1.brand = "摩托罗拉";
p1.price = 3999;
p1.color = "曜石黑";
System.out.println("p1:"+p1.brand+"---"+p1.price+"---"+p1.color);
p1.call("磊哥");
p1.sendMessage();
//p2第二个对象
Phone p2 = new Phone();
p2.brand = "联想青檬";
p2.price = 1999;
p2.color = "流光金";
System.out.println("p2:"+p2.brand+"---"+p2.price+
"---"+p2.color);
p2.call("飞哥大数据");
p2.sendMessage();
System.out.println("============="+name+"=============");
}
}

java之类与对象精选_类与对象_16

java之类与对象精选_java_17


4.3、两个引用,指向同一个对象的内存图

代码示例:

public class Demo03Phone {
public static void main(String[] args) {
Phone p1 = new Phone();
p1.brand = "OPPO";
p1.price = 2999;
p1.color = "白色";
System.out.println(p1.brand+"---"+p1.price
+"---"+p1.color);
Phone p2 = p1;
p2.brand = "魅族";
p2.price = 1999;
p2.color = "蓝色";
System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);
System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);
}
}

java之类与对象精选_java_18

java之类与对象精选_代码_19

 结语:

这一篇的概念初学者兄弟,一定要理解到位了,我们后面会经常用到这些东西,和相似的理念,现在理解了后面就会轻松很多的,上面有代码演示和概念,初学者兄弟们可以一边敲代码一边理解,希望能帮助到到大家就好!

感谢兄弟们的持续关注!!!

java之类与对象精选_类与对象_20