八、4、Object、内部类

------java.lang.Object

Object所有类的直接或者间接父类,Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的功能。

具体方法:

1,boolean equals(Object
obj):
用于比较两个对象是否相等,其实内部比较的就是两个对象地址。

而根据对象的属性不同,判断对象是否相同的具体内容也不一样。所以在定义类时,一般都会复写equals方法,建立本类特有的判断对象是否相同的依据。

public boolean equals(Object obj){

if(!(obj instanceof Person))

return false;

Person p = (Person)obj;

return this.age == p.age;

}

2,String toString():将对象变成字符串;默认返回的格式:类名@哈希值
= getClass().getName() + ‘@‘ + Integer.toHexString(hashCode())

为了对象对应的字符串内容有意义,可以通过复写,建立该类对象自己特有的字符串表现形式。

public String toString(){

return "person : "+age;

}

3,Class getClass():获取任意对象运行时的所属字节码文件对象。

4,int
hashCode():
返回该对象的哈希码值。支持此方法是为了提高哈希表的性能。

通常equals,toString,hashCode,在应用中都会被复写,建立具体对象的特有的内容。

------------------------------------------------------------------------------------------------

内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象。这时,为了方便设计和访问,直接将A类定义在B类中。就可以了。A类就称为内部类。内部类可以直接访问外部类中的成员。而外部类想要访问内部类,必须要建立内部类的对象。

-----------------------------------------------------

class Outer{

int num = 4;

class  Inner {

void show(){

System.out.println("inner show run "+num);

}

}

public void method(){

Inner in = new Inner();//创建内部类的对象。

in.show();//调用内部类的方法。

}

}

-------------------------------------------------------

当内部类定义在外部类中的成员位置上,可以使用一些成员修饰符修饰 private、static。

1:默认修饰符。

直接访问内部类格式:外部类名.内部类名 变量名 =  外部类对象.内部类对象;

Outer.Inner in = new Outer.new
Inner();//
这种形式很少用。

但是这种应用不多见,因为内部类之所以定义在内部就是为了封装。想要获取内部类对象通常都通过外部类的方法来获取。这样可以对内部类对象进行控制。

2:私有修饰符。

通常内部类被封装,都会被私有化,因为封装性不让其他程序直接访问。

3:静态修饰符。

如果内部类被静态修饰,相当于外部类,会出现访问局限性,只能访问外部类中的静态成员。

注意;如果内部类中定义了静态成员,那么该内部类必须是静态的。

内部类编译后的文件名为:“外部类名$内部类名.java”;

为什么内部类可以直接访问外部类中的成员呢?

那是因为内部中都持有一个外部类的引用。这个是引用是 外部类名.this

内部类可以定义在外部类中的成员位置上,也可以定义在外部类中的局部位置上。

当内部类被定义在局部位置上,只能访问局部中被final修饰的局部变量。

匿名内部类:没有名字的内部类。就是内部类的简化形式。一般只用一次就可以用这种形式。匿名内部类其实就是一个匿名子类对象想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口。

匿名内部类的格式:new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }.方法。

匿名内部类的使用场景:

当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过匿名内部类来完成参数的传递。

其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。

--------------------------------------------------------

//面试

//1

new Object(){

void show(){

System.out.println("show run");

}

}.show();

//2

Object obj = new Object(){

void show(){

System.out.println("show run");

}

};

obj.show();

1和2的写法正确吗?有区别吗?说出原因。

写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。

区别:

第一个可是编译通过,并运行。

第二个编译失败,因为匿名内部类是一个子类对象,当用Object的obj引用指向时,就被提升为了

Object类型,而编译时检查Object类中是否有show方法,所以编译失败。

-------------------------------------------------------

class InnerClassDemo6 {

+(static)class Inner{

void show(){}

}

public void method(){

this.new Inner().show();//可以

}

public static void main(String[] args)
{//static不允许this

This.new
Inner().show();//错误,Inner类需要定义成static

}

}

------------------------------------------------------

interface Inter{

void show();

}

class Outer{//通过匿名内部类补足Outer类中的代码。

public static Inter method(){

return new Inter(){

public void
show(){}

};

}

}

class InnerClassDemo7 {

public static void main(String[] args) {

Outer.method().show();

/*

Outer.method():意思是:Outer中有一个名称为method的方法,而且这个方法是静态的。

Outer.method().show():当Outer类调用静态的method方法运算结束后的结果又调用了show方法,意味着:method()方法运算完一个是对象,而且这个对象是Inter类型的。

*/

function (new Inter(){

public void
show(){}

}); //匿名内部类作为方法的参数进行传递。

}

public static void function(Inter in){

in.show();

}

}

参考:http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html

八、4、Object、内部类,布布扣,bubuko.com

时间: 2024-10-20 04:19:44

八、4、Object、内部类的相关文章

Redis源代码分析(二十八)--- object创建和释放redisObject物

今天的学习更有效率.该Rio分析过,学习之间的另一种方式RedisObject文件,只想说RedisObject有些生成和转换.都是很类似的.列出里面长长的API列表: /* ------------ API --------------------- */ robj *createObject(int type, void *ptr) /* 最初的创建robj对象方法,后面的创建方法与此相似 */ robj *createStringObject(char *ptr, size_t len)

使用XStream是实现XML与Java对象的转换(5)--Object Stream

八,Object Stream 之前的例子我们都是直接输出Xml成为String类型或者从String中获得并解析Xml,现在我们要处理输入流和输出流! 1,输出流(ObjectOutputStream) 输出流测试程序如下: Java代码 package cn.tjpu.zhw.xml.xstream5; import java.io.IOException; import java.io.ObjectOutputStream; import com.thoughtworks.xstream.

Java 内部类综述

摘要: 多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.但有时候,我们确实是需要实现多重继承,而且现实生活中也真正地存在这样的情况,比如遗传:我们即继承了父亲的行为和特征也继承了母亲的行为和特征.可幸的是,Java 提供了两种方式让我们曲折地来实现多重继承:接口和内部类.事实上,实现多重继承是内部类的一个极其重要的应用.除此之外,内部类还可以很好的实现隐藏(例如,私有成员内部类).内部类共有四种类型,即成员内部类.静态内部类.

Java学习笔记-4.继承与多态

一.继承机制 1.继承:允许一个类作为另一个类的扩充版本 2.单继承:一个类只继承了一个父类    多继承:一个类继承了多个父类 Java只支持单继承,C++支持多继承 二.类的继承 1.形式: class SubClass extends BaseClass { //子类类体,定义子类的新成员 } Java中所有的类都直接或间接地继承类 java.lang.Object 2.构造方法 (1)显式构造方法    形式:super(参数表); 系统执行到这条语句时,会根据参数表判断调用父类中哪个构

[03] 类的结构和创建对象

1.类的结构和定义 先回顾一下,类的基本概念: 类定义了对象共同的属性和行为(即方法) 具体的某个对象需要通过类来进行申明 那么显而易见地,类中应该包含的东西就有,属性.方法,另外,既然对象要通过类来声明,那么类中必须要有一个类似生产机器的东西来生成对象,这个类似生产机器的东西叫做构造函数.另外,类还可有内部类和块,这两种使用较少. 所以,类的结构内容就是: 属性(对象数据的描述) 方法(对象的行为) 构造函数(用于生产对象,也叫做实例化对象) 内部类(在类体中申明的类) 块(分为静态块.实例块

Javascript高级程序设计(书中总结)

注:本文属于个人总结,知识点说的不全.不对的地方,还望见谅.(我会在日后修改,补正) 本书:js的简介以及在html中的使用就略过.(直奔基础语法,期间还有滤过部分) 第三章:基本概念: 1.js中的一切(变量.函数名和操作符)都区分大小写; 2.标识符,就是指变量.函数.属性的名字,或者函数的参数.标识符可以是按照下列格式规则 组合起来的一或多个字符: (1) 第一个字符必须是一个字母.下划线(_)或一个美元符号($): (2)其他字符可以是字母.下划线.美元符号或数字. 3.语句: var

Smail语法(1)

[情景分析]Android apk,反编译之后,我们能阅读到的代码是 dalvik字节码 - smali .有时候,工作需要,必须破解apk里面的一些协议或者方法.以此,借鉴经验,来开发自己的项目. [官方语法链接] http://www.blogjava.net/midea0978/archive/2012/01/04/367847.html [语法] 一. 数据类型 原始类型: V void,只能用于返回值类型 Z boolean B byte S short C char I int J

.Net经典面试题

1.同一平台: 2.Bootstrap 3.webAPI 4.SignalR 5.ASP.Identity 6.OWIN 二. ObjectContext: 用于控制ASP的交易(Transaction),交易由Microsoft Transaction Server(MTS)管理 三.asp 是解释执行 asp.net是编译执行的 四.列举ASP.NET 页面之间传递值的几种方式. 答. 1.使用QueryString,  如....?id=1; response. Redirect()...

Spring MVC--------处理方法返回值的可选类型

对于Spring MVC处理方法支持支持一系列的返回方式:  (1)ModelAndView (2)Model (3)ModelMap (4)Map (5)View (6)String (7)Void (8)Object 一,ModelAndView @RequestMapping("/threadRequest*") public ModelAndView threadRequest(){ ModelAndView mv=new ModelAndView(); mv.setViewN

Concurrent.Thread.js

(function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( this.Data.Stack === undefined ) this.Data.Stack = undefined; with ( function(){ with ( Data ) { return function () {