对Java的面对对象编程中对象和引用以及内部类的理解

 更新时间:2016年01月07日 08:45:13   作者:jevien  
这篇文章主要介绍了对Java的面对对象编程中对象和引用以及内部类的理解,需要的朋友可以参考下

最近利用下班的时候看了看的think in java感觉再看 和第一次看大不一样
接下来说一下java中对象和引用的关系,以及内部类的概念。
1、java中一切都是对象
 在java中是什么来操作者对象呢?答案是引用,这就好比C或者C++中的指针。
如果用拥有一个引用,那么此时你必须让其和一个对象关联在一起,否则这个引用并不会像你想象的那样任由你的控制,例如你创建了一个String的引用:

String s ;

而此时并未与任何对象关联,如果此时你去做一些操作,如调用String的一些方法,肯定是会出现问题,(一些基本类型除外,因为你在定义的时候,它们就会赋予初始值的),所以在使用钱必须和对象进行关联:

String s = new String();

或者

String s = “my name is ajun”;

像这样就可以了。
2、怎么和对象进行关联
在java中通常会通过new来创建一个对象,来和引用进行关联,如:

String s = new String("my name is ajun");

这样不仅创建了一个对象和引用s进行关联,同事也进行初始化,同时我们也可以创建属于自己的对象类型。
3、存储位置
(1)堆栈:一般存储引用和基本类型变量,堆栈主要是通过堆栈指针上下移动来对内存进行分配和释放。
基本类型变量并不适应于new进行创建,因为其所占的内存较小。
(2)堆:用于存储java对象,当程序执行new的时候,堆就会分配一个空间给这个对象,记住堆进行内存的分配和释放是比堆栈进行存储和释放内存消耗更多的时间,这就是基本类型变量要存在堆栈中了,因为基本类型变量是用的最频繁的,频繁的存储和释放内存,在消耗更多的时候,性能可想而知的。
4、内部类
(1)、内部类基础知识:
一般定义在java类内部的类成为内部类
内部类可以分为:定义在方法体外部的类、定义方法内部的类、静态内部类(只能定义在方法外部),匿名内部类
说明:
定义在方法外面的类:
类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象
访问权限可以任何,可以把它看成类的成员变量,这样理解就好多来了。
定义在方法体内的类;
类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象
访问权限不可以有,把他看成方法的局部变量就可以了。
静态内部类:
只能访问类的静态成员变量
访问权限任何
匿名内部类:
类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象
访问权限不可以有
(2)、内部类的作用
内部类可以很好的隐藏类,一般类不允许有private protect default访问权限。
内部类可以实现多重继承,弥补了java不能多继承的特点
(3)、例子

package com.ajun.test.innerclass.example; 
 
/** 
 * 水果内容 
 * @author Administrator 
 * 
 */ 
public interface Contents { 
   String value(); 
} 

package com.ajun.test.innerclass.example; 
 
/** 
 * 水果目的地 
 * @author Administrator 
 * 
 */ 
public interface Destination { 
 
  //目的地 
  String readLabel(); 
} 

package com.ajun.test.innerclass.example; 
 
public class Goods { 
 
  private String des="is ruit!!"; 
   
  //方法外部 
  private class Content implements Contents{ 
    private String name = "apple "+des; 
    @Override 
    public String value() { 
      return name; 
    } 
  } 
   
  //方法外部 
  private class GDestination implements Destination{ 
    private String label ; 
    private GDestination(String label){ 
      this.label= label; 
    } 
    @Override 
    public String readLabel() { 
      return label; 
    } 
  } 
   
   
  //匿名内部类 
  public Destination getdestination(final String label){ 
    return new Destination(){ 
      @Override 
      public String readLabel() { 
        return label; 
      } 
    }; 
  } 
   
  public Destination dest(String s){ 
    return new GDestination(s); 
  } 
   
  public Contents content(){ 
    return new Content(); 
  } 
   
  public Destination dest2(String s){ 
    class GDestination implements Destination{ 
        private String label; 
        private GDestination(String label){ 
          this.label= label; 
        } 
        @Override 
        public String readLabel() { 
          return label; 
        } 
    } 
    return new GDestination(s); 
  } 
   
} 

package com.ajun.test.innerclass.example; 
 
public class Test { 
 
  public static void main(String [] a){ 
    Goods gs = new Goods(); 
    Contents c = gs.content(); 
    Destination d = gs.dest("Beijing"); 
    System.out.println(c.value()); 
    System.out.println(d.readLabel()); 
    Destination d1 = gs.getdestination("Shanghai"); 
    System.out.println(d1.readLabel()); 
    System.out.println(gs.dest2("Tianjin").readLabel()); 
  } 
} 

其中Content和Gdestination得到了很好的隐藏,外面调用的时候,根本就不知道调用的是具体哪个类,使这个类拥有多继承的特性。


输出;

apple is ruit!! 
Beijing 
Shanghai 
Tianjin 

相关文章

  • 解读SpringBoot接收List<Bean>参数问题(POST请求方式)

    解读SpringBoot接收List<Bean>参数问题(POST请求方式)

    这篇文章主要介绍了解读SpringBoot接收List<Bean>参数问题(POST请求方式),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Java中的字节流文件读取教程(二)

    Java中的字节流文件读取教程(二)

    这篇文章主要给大家介绍了关于Java中字节流文件读取的相关资料,本文属于之前文章的延长篇,有需要的朋友可以先看看上一篇文章,相信会对大家的学习或者工作具有一定的参考学习价值,下面随着小编来一起学习学习吧
    2018-07-07
  • java判断字符串包含某个字符的实例方法

    java判断字符串包含某个字符的实例方法

    在本篇文章里小编给大家整理的是一篇关于java判断字符串包含某个字符的实例方法,有需要的朋友们学习下。
    2019-12-12
  • 使用Spring Initializr方式如何快速构建Spring Boot项目

    使用Spring Initializr方式如何快速构建Spring Boot项目

    Spring lnitializr是一个Web应用,它提供了一个基本的项目结构,能够帮助我们快速构建一个基础的Spring Boot项目,本文分步骤讲解如何使用Spring Initializr方式构建Spring Boot项目,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • Java 设计模式以虹猫蓝兔的故事讲解建造者模式

    Java 设计模式以虹猫蓝兔的故事讲解建造者模式

    建造者模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。本文将通过示例讲解建造者模式,需要的可以参考一下
    2022-04-04
  • SpringBoot中@PathVariable注解使用

    SpringBoot中@PathVariable注解使用

    本文详细介绍了SpringBoot中@PathVariable注解的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • 基于传递list类型的参数的问题

    基于传递list类型的参数的问题

    这篇文章主要介绍了基于传递list类型的参数的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java switch关键字原理及用法详解

    Java switch关键字原理及用法详解

    这篇文章主要介绍了Java中 switch关键原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • MyBatis 配置之集合的嵌套方式

    MyBatis 配置之集合的嵌套方式

    这篇文章主要介绍了MyBatis 配置之集合的嵌套方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 谈谈Java利用原始HttpURLConnection发送POST数据

    谈谈Java利用原始HttpURLConnection发送POST数据

    这篇文章主要给大家介绍java利用原始httpUrlConnection发送post数据,设计到httpUrlConnection类的相关知识,感兴趣的朋友跟着小编一起学习吧
    2015-10-10

最新评论