面向对象高级——Object类、包装类以及匿名内部类
Object类
例如以下两种代码表示是一样的:
class Demo{ // 定义Demo类。实际上就是继承了Object类
};
public class ObjectDemo01{
public static void main(String args[]){
Demo d = new Demo() ; // 实例化Demo对象
System.out.println("不加toString()输出:"+d) ;
System.out.println("加上toString()输出:"+d.toString()) ;
}
};
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
class Person{
private String name ; // 定义name属性
private int age ; // 定义age属性
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String toString(){
return "姓名:" + this.name + ";年龄:" + this.age ;
}
};
public class ObjectDemo02{
public static void main(String args[]){
Person per = new Person("刘勋",24) ; // 实例化Person
System.out.println("对象信息:" + per) ;
}
};
就是打印对象所包括的信息。
class Person{
private String name ; // 定义name属性
private int age ; // 定义age属性
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public boolean equals(Object obj){
if(this==obj){ // 地址相等
return true ; // 肯定是同一个对象
}
if(!(obj instanceof Person)){ // 不是Person对象
return false ;
}
Person per = (Person) obj ; // 向下转型
if(per.name.equals(this.name)&&per.age == this.age){
return true ; // 依次比較内容
}else{
return false ;
}
}
public String toString(){
return "姓名:" + this.name + ";年龄:" + this.age ;
}
};
public class ObjectDemo03{
public static void main(String args[]){
Person per1 = new Person("刘勋",30) ; // 实例化Person
Person per2 = new Person("刘勋",30) ; // 实例化Person
System.out.println(per1.equals(per2)?
"是同一个人。" : "不是同一个人!
") ;
System.out.println(per1.equals("hello")?
"是同一个人!" : "不是同一个人。") ;
}
};
Object类是全部类的父类。则全部类的对象都能够使用Object接收,可是Object不光能够接收对象。还能够接收随意的引用数据类型。
interface A{
public String getInfo();
}
class B implements A{
public String getInfo(){ // 覆写方法
return "Hello World!!!" ;
}
};
public class ObjectDemo04{
public static void main(String args[]){
A a = new B() ; // 向上转型。为接口实例化
Object obj = a ; // 使用Object接收,向上转型
A x = (A)obj ; // 向下转型
System.out.println(x.getInfo()) ;
}
};
数组实际上也能够使用Object类进行接收。
public class ObjectDemo05{
public static void main(String args[]){
int temp[] = {1,3,5,7,9} ; // 定义数组
Object obj = temp ; // 使用Object接收数组
print(obj) ;
}
public static void print(Object o){
if(o instanceof int[]){ // 推断是否是整型数组
int x[] = (int[])o ;
for(int i=0;i<x.length;i++){
System.out.print(x[i] + "\t") ;
}
}
}
};
Object类的总结:
包装类
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
public class WrapperDemo01{
public static void main(String args[]){
int x = 30 ; // 基本数据类型
Integer i = new Integer(x) ; // 装箱:将基本数据类型变为包装类
int temp = i.intValue() ;// 拆箱:将一个包装类变为基本数据类型
}
};
以下再以小数为例:
public class WrapperDemo02{
public static void main(String args[]){
float f = 30.3f ; // 基本数据类型
Float x = new Float(f) ; // 装箱:将基本数据类型变为包装类
float y = x.floatValue() ;// 拆箱:将一个包装类变为基本数据类型
}
};
在JDK1.5之前对于程序本身来说包装类是不能直接进行“+、-、*、/、++、......”,是不能够的,由于是一个类不能这样做。可是在JDK1.5之后对程序包装类功能进行了改变。添加了自己主动装箱以及自己主动拆箱的功能并且也能够使用包装类直接进行数字运算。
public class WrapperDemo03{
public static void main(String args[]){
Integer i = 30 ; // 自己主动装箱成Integer
Float f = 30.3f ; // 自己主动装箱成Float
int x = i ; // 自己主动拆箱为int
float y = f ; // 自己主动拆箱为float
}
};
在包装类中还存在一个最大的特点,就是能够将字符串变为指定的数据类型。
public class WrapperDemo04{
public static void main(String args[]){
String str1 = "30" ; // 由数字组成的字符串
String str2 = "30.3" ; // 由数字组成的字符串
int x = Integer.parseInt(str1) ; // 将字符串变为int型
float f = Float.parseFloat(str2) ; // 将字符串变为int型
System.out.println("整数乘方:" + x + " * " + x + " = " + (x * x)) ;
System.out.println("小数乘方:" + f + " * " + f + " = " + (f * f)) ;
}
};
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
包装类总结:
匿名内部类
interface A{
public void printInfo() ; //
}
class B implements A{ // 实现接口
public void printInfo(){
System.out.println("Hello World!!!") ;
}
};
class X {
public void fun1(){
this.fun2(new B()) ;
}
public void fun2(A a){
a.printInfo() ;
}
};
public class NoInnerClassDemo01{
public static void main(String args[]){
new X().fun1() ; // 实例化X类的对象,并调用fun1()方法
}
};
假设B类仅仅使用一次的话。就没有必要为其单独定义一个类,此时就能够使用匿名内部类解决这个问题。
interface A{
public void printInfo() ; //
}
class X {
public void fun1(){
this.fun2(new A(){
public void printInfo(){
System.out.println("Hello World!!!") ;
}
}
) ;
}
public void fun2(A a){
a.printInfo() ;
}
};
public class NoInnerClassDemo02{
public static void main(String args[]){
new X().fun1() ; // 实例化X类的对象,并调用fun1()方法
}
};
在实际的开发中常常会用到各种开发的框架,在框架上会大量的引用匿名内部类。
interface A{
public void printInfo() ; //
}
class X {
public void fun1(){
this.fun2(new A(){
public void printInfo(){
System.out.println("Hello World!!!") ;
}
}
) ;
}
public void fun2(A a){
a.printInfo() ;
}
};
public class NoInnerClassDemo02{
public static void main(String args[]){
new X().fun1() ; // 实例化X类的对象,并调用fun1()方法
}
};
面向对象高级——Object类、包装类以及匿名内部类的更多相关文章
- JavaSE基础知识(5)—面向对象(Object类)
一.包 java.lang包,属于java中的核心包,系统默认导入的,不用手动导入该包中的类:Object.System.String.Integer等 1.包的好处 ①分类管理java文件,查找和管 ...
- [javaSE] 面向对象(Object类toString)
每一个对象,都有一个在内存中的地址哈希值,这个哈希值是十六进制的 调用Object对象的hashCode()方法,返回这个对象的哈希值 调用Integer.toHexString()方法,转换十六进制 ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:匿名内部类
interface A{ public void printInfo() ; // } class B implements A{ // 实现接口 public void printInfo(){ S ...
- 面向对象之包装类与Object类
一.包装类(Wrapper) 1.包装类出现原因 为了使8种基本数据类型的变量具有类的特征,引入包装类 2.类型间转化 ① 基本数据类型---->对应的包装类:自动装箱 包装类---->对 ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:Object类
class Demo{ // 定义Demo类,实际上就是继承了Object类 }; public class ObjectDemo01{ public static void main(String ...
- Object类、包装类、内部类详解
1.Object类 1.概念: 1.1 所有类在创建时都默认继承了java.lang.Object 1.2 所有类对象都可以声明为类对象的引用 Object ob1=new String(); Obj ...
- Java面向对象 Object类 内部类
Java面向对象 Object类 内部类 知识概要: 一:Object类 二:内部类 匿名内部类的写法 1.Object O ...
- Java面向对象进阶篇(包装类,不可变类)
一. Java 8的包装类 Java中的8种基本数据类型不支持面向对象的变成机制,也不具备对象的特性:没有成员变量,方法可以调用.为此,Java为这8 种基本数据类型分别提供了对应的 包装类(Byte ...
- Java基础之Java常用类--Object类,字符串相关类,包装类,日期相关类,数字相关类
Java是一种面向对象的语言,也就是将万事万物可以描述为对象,特点如下: 1.面向对象是常见的一种思考习惯,符合人们的思考习惯.2.面向对象的出现,将复杂的事情简单化.3.面向对象的出现,将之前过程中 ...
随机推荐
- Gerrit代码审查工具
1 Gerrit简介 Gerrit,一种免费.开放源代码的代码审查软件,使用网页界面.利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改. 1 ...
- [转]Chart.js入门教程
Chart.js是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库. 相信大部分人都一样,看到一大筐用文本或者表格形式呈现的数据就头疼.因为这种呈现方式也太无聊了吧...而且这对于我们处理原始 ...
- mongodb 按配置文件mongodb.conf启动
命令如下 mongod --config /etc/mongodb.conf
- MySQL连接数过多登录不上
[mysqld_safe]socket = /var/run/mysqld/mysqld.socknice = 0 [mysqld]## * Basic Set ...
- Python操作记录
1.写入中文出错,需要执行 reload(sys) sys.setdefaultencoding('utf8') 2.json.dump中文写入为\xxxx ensure_ascii=False
- Sublime Es6教程1-环境搭建
因为现在网上的教程都不靠谱,于是决定自己跳坑自己写,分为三块来玩: 一.环境搭建 二.语法讲解 三.项目实战 很多时候,你想搞一个东西,却因为环境没有搭建好,而不能很开森的探索未知的世界,多年的编程经 ...
- (纪录片)统计的乐趣 The Joy of Stats (2010)
简介: 导演: 丹·希尔曼主演: Hans Rosling类型: 纪录片官方网站: www.bbc.co.uk/programmes/b00wgq0l制片国家/地区: 英国语言: 英语上映日期: 20 ...
- Mybatis源码分析之SqlSessionFactory(一)
简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBa ...
- Discuz常见小问题-如何关闭验证码
进入后台,在防灌水,验证设置中可以切换哪些情况下是否使用验证码 如果启用验证码,也客户修改验证码的难度,样式.最后点击提交,完成之后可以退出到前台,测试是否能够不用验证码自动登录
- SpringBoot报错 : Whitelabel Error Page
添加了一个Controller类,本来想试下Spring MVC是否可以正常运行,结果报错,Controller类的内容: @RestController public class Test1Cont ...