{Java初级系列三}----面向对象和类

一:面向对象----Object

本人为自学Java系列,内容来自于中国大学mooc华东师范大学陈育良教授《Java核心技术》,在此感谢老师!

在Java中引入了对象和类的概念

  1. 对象是一个变量--------具体的东西;
  2. 类就是类型(是规范,是定义),从万千对象中抽取共性;
  3. 类规定了对象应该有的属性内容和方法;
  4. 对象就是类的具体实现,是活生生的;
  5. 例如:土豆丝菜谱是类,一盘土豆丝就是对象
  • 从程序员的发展角度来理解,OO-Oriented Object是对OP—Oriented Procedure的一种改造。
  • OP面向过程更强调方法和动作,所有的变量是被动参与进来的,没有自主决定权
  • OO面向对象属于每个对象的。能否实现由每个对象说的算,有主人翁精神

OP代码实例:

  1. public class OpExample {  
  2.     
  3.     public static void main(String[] args) {  
  4.         // TODO Auto-generated method stub  
  5.         int a,b,c;  
  6.         a = 1;  
  7.         b = 2;  
  8.         c = add(a,b);  
  9.         System.out.println(c);  
  10. }  
  11.     public static int add(int m,int n) {  
  12.         return m+n;  
  13.     }  
  14.     

OO实例:

  1. public class OoExample {  
  2.     private int a;  
  3.  public void  set(int a) {  
  4.      this.a = a;  
  5.  }  
  6.  public int add(int b) {  
  7.      return this.a+b;  
  8.  }  
  9.     public static void main(String[] args) {  
  10.         // TODO Auto-generated method stub  
  11.        int b = 5;  
  12.        OoExample obj = new OoExample();  
  13.        obj.set(10);  
  14.        System.out.println(obj.add(b));  
  15.     }  
  16.     
  17. }  

二:Reference和基本类型

对象基本定义:

类型 变量名 = new 类型(参数)

A obj = new A(形参) int a=new int(5)等价与 int a=5

A obj1 = new A() A obj2 = new A()

以上有个对象,它们的类型都是A,但是两个不同的对象,在内存中有不同的存放的地址。因此没有完全两个对象是相同的

Obj可以看做是内存中一个对象的句柄,在C/C++中称为指针,在Java中是Reference。

对象赋值是Reference赋值,基本类型是直接拷贝。下面两个例子就是区分两者的区别。

  1. public class Reference {  
  2.     
  3.     public static void main(String[] args) {  
  4.         // TODO Auto-generated method stub  
  5.       int num1 = 5 ;  
  6.       int num2= num1;  
  7.       System.out.println("num1: "+num1+", num2: "+num2);  
  8.       num2 = 10;  
  9.       System.out.println("num1: "+num1+", num2: "+num2);  
  10.       Mynumber obj1 = new Mynumber();  
  11.       Mynumber obj2 = new Mynumber();  
  12.       System.out.println(obj1.num);  
  13.       System.out.println(obj2.num);  
  14.       System.out.println("=========接下来输出新值===========");  
  15.       obj2 = obj1;  
  16.       obj2.num = 10;  
  17.       System.out.println(obj1.num);  
  18.       System.out.println(obj2.num);       
  19.       }       
  20. }  
  1. public class Mynumber {  
  2.    int num =5 ;  
  3. }  

输出结果:

  1. num1: 5, num2: 5  
  2. num1: 5, num2: 10  
  3. 5  
  4. 5  
  5. =========接下来输出新值===========  
  6. 10  
  7. 10  

基本类型是值的copy,num2被num1赋值为5,所以内存num1和num2分别指向的就是内存中不同的地方,但是值都是5。当num2赋值为10时,num1的值不变。

Reference赋值就是第二种情况,obj2被obj1赋予值,这个时候,obj1和obj2作为指针都是指向内存中同一地址,任何一个值被初始化改变,两者都会改变。

有一个同样的例子可以证明:

  1. public class ArguementPassing {  
  2.     
  3.     public static void main(String[] args) {  
  4.         // TODO Auto-generated method stub  
  5.     int a =1; int b = 2;  
  6.     swap(a,b);  
  7.     System.out.println("a is: "+a+", b is: "+b);  
  8.     Mynumber obj1 = new Mynumber();  
  9.     Mynumber obj2 = new Mynumber();  
  10.     obj2.num = 10;  
  11.     swap(obj1,obj2);  
  12.     System.out.println("obj1 is "+obj1.num+", obj2 is "+obj2.num);  
  13.     }  
  14.   public static void  swap(int m,int n) {  
  15.       int s = m;  
  16.       m = n;  
  17.       n = m;  
  18.   }   
  19.   public static void swap(Mynumber obj3, Mynumber obj4) {  
  20.       int s = obj3.num;  
  21.       obj3.num = obj4.num;  
  22.       obj4.num = s;  
  23.   }  

输出结果:

  1. a is: 1, b is: 2  
  2. obj1 is 10, obj2 is 5  
  • 第一个swap函数进行ab的交换并没有成功,因为第6行在调用swap函数,等于是将1和2 赋值给m和n了,这个时候 a b m n四个数字分别指向四个不同的内存地址。所以m和n的交换并不会改变a和b的值。
  • 第二个swap函数是对象的赋值,成功交换值。Obj1和obj3指向同一块内存地址,obj2和obj4指向同一块内存地址。对象赋值是Reference赋值。

三:数据初始化

New出对象后,内部属性值默认是多少?

  1. public class Initialization {  
  2.     boolean v1;// boolean v1 = new b  
  3.     byte v2;  
  4.     char v3;  
  5.     double v4;  
  6.     long v5;  
  7.     int v6 ;  
  8.     float v7;  
  9.     short v8;  
  10.  public static void main(String[] args) {  
  11.      Initialization obj = new Initialization();  
  12.      System.out.println("the value of boolean is "+obj.v1);  
  13.      System.out.println("the value of byte is "+obj.v2);  
  14.      System.out.println("the value of char is "+obj.v3);  
  15.      System.out.println("the value of double is "+obj.v4);  
  16.      System.out.println("the value of long is "+obj.v5);  
  17.      System.out.println("the value of int is "+obj.v6);  
  18.      System.out.println("the value of float is "+obj.v7);  
  19.      System.out.println("the value of short is "+obj.v8);  
  20.  }  
  21. }  

输出结果:

同时有一点需要注意:类的成员变量,javac会直接赋值,但是对于函数内部的局部变量不会给默认值,需要初始化后才能使用。

函数内部的a没有初始化赋值,直接报错了。

原文地址:https://www.cnblogs.com/yblecs/p/12232321.html

时间: 2024-11-07 16:16:06

{Java初级系列三}----面向对象和类的相关文章

疯狂java学习笔记之面向对象-定义类、方法、构造器

Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. java程序中,类是最小的程序单位 - 所有的java程序都必须从定义类开始 定义类的语法格式: [修饰符]  class  类名{ //0 ~ N 个 Field 定义 //0 ~ N 个 方法定义 //0 ~ N个 构造器定义 } 一个类中最多只能出现五种成分:Field.方法.构造器 一个类最常见

java多线程系列(三)

等待通知机制 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 非等待通知 public void run() { try {

Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别

本篇博客主要讲解Set接口的三个实现类HashSet.LinkedHashSet.TreeSet的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 1. HashSet使用 HashSet是Set接口最常用的实现类,底层数据结构是哈希表,HashSet不保证元素的顺序但保证元素必须唯一. private transient HashMap<E,Object> map; HashSet类的代码声明如下所示: public class HashSet<E&g

{Java初级系列二}---------Java类基础知识

本人为自学Java系列,内容来自于中国大学mooc华东师范大学陈育良教授<Java核心技术>,在此感谢老师! 一:Java类结构和main函数 Java文件只能有一个public class Public class的名字还必须和文件名一致 文件可以有多个class,但是只能有一个是public.不提倡一个文件里面放着多个类(内部类除外)-------这个先记住,我们后面再贴代码理解 public?class?IntegerTest?{?? ?????//?PSVM?为函数入口??main函数

【小白的java成长系列】——面向对象基础

今天来说说java面向对象的知识点~事实上.java在其发展过程中可以成功.非常大一部分原因是其面向对象的思想~ 1.概念 如今来说面向对象思想.也不是什么新的知识点了,我们知道如今非常多语言都有面向对象的思想了:当然我们还知道如今依然非常火的C语言.事实上还是面向过程的语言.包含近期一段时间也出现了非常多新的思想,比方面向函数,面向分布式,面向...等等一系列的东东,事实上这些都仅仅是一个概念而已~ 在面向对象中.实际上还存在着三个基本的特性: ·封装性:保证对外部不可见: ·继承性:继续发扬

黑马程序员——JAVA学习笔记三(面向对象)

1,    面向对象设计程序(oriented object pragraming)  ,其程序是有对象组成,只要对象能满足要求,就不需要关心其功能的具体实现.面向对象的特征:封装(encapsulation)继承(inherence)多态(polymorphism). 2,    类是对事物的属性和行为的描述,构造对象的模板和蓝图.对象是类的实例,它具有三个特征:行为(behavior)状态(state) 对象标示(identity如何辨别具有相同状态和行为的对象).成员函数默认有一个隐含参数

MP实战系列(三)之实体类讲解

首先说一句,mybatis plus实在太好用了! mybaits plus的实体类: 以我博客的用户类作为讲解 package com.blog.entity; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableLogic; imp

Java NIO系列(三) - Channel

前言 上文讲到Java NIO一些基本概念.在标准的IO中,都是基于字节流/字符流进行数据操作的,而在NIO中则是是基于Channel和Buffer进行操作,其中的Channel的虽然模拟了流的概念,实则大不相同. 本文将详细阐述NIO中的通道Channel的概念和具体的用法. Channel和Stream的区别 区别 Stream Channel 是否支持异步 不支持 支持 是否支持双向数据传输 不支持,只能单向 支持,既可以从通道读取数据,也可以向通道写入数据 是否结合Buffer使用 不

Java基础系列--05_面向对象

1.概述: (1)面向过程:将问题一步一步的解决的过程(详细步骤),在C语言中所有的代码都是基于过程化的代码. (2)面向对象:面向对象是基于面向过程的编程思想,所有的事情都交由创建出来的对象去指挥. 注意:这里所说的详细步骤,指的是问题的解决是如何进行的:而指挥,指的是对象去调用方法, 而这个方法是实现了某一个功能的详细步骤.也就是说对象发号施令,而不理会内部是如何实现的. 2.类与对象: 类:是一组相关的属性和行为的集合.是一个抽象的概念,其实就是有共性的群体. 成员变量:事物的属性 成员方