类就好比是一个模具,而对象就是用这个模具刻出来的产品,什么样的模具出来什么样的产品,同样的,什么样的类实例化出来什么样的对象。可以说,类是对具有同样性质的一类对象的抽象说明,比如小明,小红等具体的人是对象,而人这个概念就是他们对应的类,人这个类里面具有人这个概念的一般性质(如姓名、身高、性别等等),而具体的每一个人对每个性质可能有不同的具体值(如小明的姓名属性是小明,小红的姓名属性是小红)。类是抽象出来的概念,对象是这个抽象说明的类的一个具体情况。定义类需要使用class关键字来定义,如class people{};定义对象需要使用这个对象所属的类并用new关键字来实例化,如 new people();(当然,java实例化对象还有更深的反射实例化方法)。
类:就是一种归类,例如:电器,通俗的讲,就是用电才能工作的机器(不是很准确);又如:人 类,包括人的这一类生物。是具体对象的抽象说法。
对象:就是具体的对象,例如:张三、王五、铅笔、轮滑鞋,等等具体事物,可唯一性的
属性:通俗讲就是具有的特征,属性特征,例如电器中的一种(对象):电饭煲,它的属性可以是:功率1000w,有两档,等等
方法:就是对象能干什么?如:电饭煲可以煮饭等,这个方法是要自己去实现的,通过操纵属性等来实现
我讲的过于粗糙,仅供参考,不懂可追问~
class),也称为嵌入类(nested class),它是定义在其他类的内部。内部类作为其外部类的一个成员,与其他成员一样,可以直接访问其外部类的数据和方法。只不过相比较外部类只有public和默认的修饰符不同,内部类作为一个成员,可以被任意修饰符修饰。编译器在编译时,内部类的名称为OuterClass$InnerClassclass 。
1、内部类访问数据变量
当在某些时候,内部类中定义的变量与外部类中变量名称相同时,如何确保正确地访问每一个变量呢?
11在main中直接从外部类调用内部类的方法
class Outer
{
private int index = 10;
class Inner
{
private int index = 20;
void print()
{
int index = 30;
Systemoutprintln(this); // the object created from the Inner
Systemoutprintln(Outerthis); // the object created from the Outer
Systemoutprintln(index); // output is 30
Systemoutprintln(thisindex); // output is 20
Systemoutprintln(Outerthisindex); // output is 10
}
}
void print()
{
Inner inner = new Inner();//得到内部类的引用
innerprint();
}
}
class Test
{
public static void main(String[] args)
{
Outer outer = new Outer();
outerprint();
}
}
在这里内部类Inner中关键字this指向内部类Inner的对象,如果要想指向外部类的对象,必须在this指针前加上外部类名称,表示this是指向外部类构造的碎屑,如Outerthis 。
12在main中显式返回内部类引用
class Outer
{
private int index = 10;
class Inner
{
private int index = 20;
void print()
{
int index = 30;
Systemoutprintln(index);
Systemoutprintln(thisindex);
Systemoutprintln(Outerthisindex);
}
}
Inner getInner()
{
return new Inner();//返回一个内部类的引用
}
}
class Test
{
public static void main(String[] args)
{
Outer outer = new Outer();
OuterInner inner = outergetInner();
innerprint();
}
}
Inner是Outer的内部类,所以在类Test中必须用属性引用符来标识出内部类。
13当main方法在Outer类内部
class Outer
{
private int index = 10;
class Inner
{
private int index = 20;
void print()
{
int index = 30;
Systemoutprintln(index);
Systemoutprintln(thisindex);
Systemoutprintln(Outerthisindex);
}
}
Inner getInner()
{
return new Inner();//返回一个内部类的引用
}
public static void main(String[] args)
{
Outer outer = new Outer();
Inner inner = outergetInner(); // 注意此处变化
innerprint();
}
}
因为main方法在Outer内部,故可以直接引用,不需要属性引用符。
14在main方法中直接产生内部类对象
class Test
{
public static void main(String[] args)
{
Outer outer = new Outer();
OuterInner inner = outernew Inner(); // 注意此处变化
innerprint();
}
}
在利用new构造方法构造一个外部类对象时,并没有连带着构造一个内部类对象,故需要访问内部类方法时,必须使用new操作符为这个外部类对象再构造一个内部类对象。
2、局部内部类
在方法中定义的内部类是局部内部类,它只能访问方法中的final类型的局部变量,因为用final定义的局部变量相当于是一个常量,延长了其生命周期,使得方法在消亡时,其内部类仍可以访问该变量。另外,它同样也可以引用定义在外部类的变量和方法。而且方法体中的局部内部类不允许有访问修饰符。
class Outer
{
int num=10;
public void print(final int aArgs)
{
class Inner
{
int num=20;
public Inner()
{
Systemoutprintln("This is Inner");//此句可看出它与匿名内部类用法的不同。
}
public void print()
{
int num=30;
Systemoutprintln(this); // the object created from the local Inner
Systemoutprintln(num);
Systemoutprintln(thisnum);
Systemoutprintln(Outerthisnum);
Systemoutprintln(aArgs);
}
}
Inner inner=new Inner();//此句必须放在定义类Inner的后面
innerprint();
}
public static void main(String[] args)
{
Outer outer=new Outer();
outerprint(40);
}
}
对于局部类的命名,不管是在一个方法中定义多个类还是在几个方法中分别定义类,其编译后命名是:OuterClass$1InnerClassclass
3、匿名内部类
匿名内部类作为一种特殊的内部类,除了具有普通内部类的特点,还有自己的一些独有特性:
匿名内部类必须扩展一个基类或实现一个接口,但是不能有显式的extends和implements子句;
匿名内部类必须实现父类以及接口中的所有抽象方法;
匿名内部类总是使用父类的无参构造方法来创建实例。如果是实现了一个接口,则其构造方法是Object();
匿名内部类编译后的命名为:OuterClass$nclass,其中n是一个从1开始的整数,如果在一个类中定义了多个匿名内部类,则按照他们的出现顺序从1开始排号。
abstract class A
{
abstract public void sayHello();
}
class Outer
{
public static void main(String[] args)
{
new Outer()callInner(new A()
{
public void sayHello()
{
Systemoutprintln(this); // the object created from the anonymous Inner
Systemoutprintln("Hello!");
}
});
}
public void callInner(A a)
{
asayHello();
}
}
4、静态内部类
和非静态内部类相比,区别就在于静态内部类没有了指向外部类的引用。除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。这也算是两者的第二个区别吧。一个静态的内部类,才可以声明一个static成员,静态内部类可以访问外围类的静态方法、成员(包括private static的成员)。静态内部类实例化的时候不必先实例化外围类,可以直接实例化内部类。而对于非静态内部类则必须先实例化其外部类,才能再实例化本身。
5.内部类的继承
当一个类继承自一个内部类时,缺省的构造器不可用。必须使用如下语法:
class WithInner
{
class Inner
{
public void sayHello()
{
Systemoutprintln("Hello");
}
}
}
public class Test extends WithInnerInner
{
Test(WithInner wi)
{
wisuper();
}
public static void main(String[] args)
{
WithInner wi=new WithInner();
Test test=new Test(wi);
testsayHello();
}
}
因为每一个内部类都有一个指向外部类的引用,在继承一个内部类,必须先创建一个外部类,通过这个外部类引用来调用其内部类的构造方法。如果继承的内部类是一个静态内部类,则就不需要这样,直接super()调用即可;
6、内部类的2种特殊用法
一个类从另一个类派生出来,又要实现一个接口。但在接口中定义的方法与父类中定义的方法的意义不同,则可以利用内部类来解决这个问题。
interface Machine
{
void run();
}
class Person
{
void run()
{
Systemoutprintln("run");
}
}
class Robot extends Person
{
private class MachineHeart implements Machine
{
public void run()
{
Systemoutprintln("heart run");
}
}
Machine getMachine()
{
return new MachineHeart();
}
}
class Test
{
public static void main(String[] args)
{
Robot robot = new Robot();
Machine m = robotgetMachine();
mrun();
robotrun();
}
}
在Robot类内部使用内部类MachineHeart来实现接口Machine的run方法。同时Robot类又继承了父类Person的run方法。如果不使用内部类MachineHeart而使Robot直接实现接口Machine,则该如何调用父类的run方法?
利用内部类可解决c++中多重继承所解决的问题
class A
{
void fn1()
{
Systemoutprintln("It' s fn1");
}
}
abstract class B
{
abstract void fn2();
}
class C extends A
{
B getB()
{
return new B()
{
public void fn2()
{
Systemoutprintln("It' s fn2");
}
};
}
}
class Test
{
public static void main(String[] args)
{
C c = new C();
cfn1();
cgetB()fn2();
}
}
类C既要继承类A又要继承类B,则可将类B的定义放入类C内部,使之成为内部类。
一般情况下 当我们需要在某一情形下实现一个接口,而在另一情形下又不需要实现这个接口时,我们可以使用内部类来解决这一问题。让内部类来实现这个接口。另外一个很好的理由是java内部类加上接口可以有效地实现多重继承。
类: java中的类 一般来存放实现了某些功能的代码 代码片段,是程序的基础元素
对象:对象是一个很抽象的概念,比如 一个java类 实例化以后可以称为一个对象 对象一般指的就是一个类创建出来的实例 比如
public class A{}
那么 A是一个类
A a =new A();
那么 这里的a 指的就是A这个类的实例 也就是对象 通过对象a 可以访问A类下面的 非私有字段 和方法
实体类:一般会与实体对象一起出现 对应数据库 或者其他数据源中的 一张表 俗称为一个对象
这里的实体类对象和实体类 打个简单的比方
实体类 就好像事一张白纸 白纸的获得 要从厂商那边取得 也就是我们去买 在程序里 就是用的关键字new 当new了以后 就好像是我们从生产厂商那里买来了一张白纸 当然 白纸上什么都没有
有了这张白纸以后 我们就可以在白纸上给它赋值 让它独一无二 也就是对实体类进行封装数据
每一张白纸 从我们购买的时候 都是一样的对象 都是一个字都没有的白纸 但是 后来通过业务处理 使得白纸上都有了自己的东西 也就是对象实体中的数据封装
还可以把实体类比作一个模板 创建出来的实例对象 都是跟这个模板一样的 至于 模板里面填写的内容 那就要看你的赋值了 就拿最简单的简历来说 一般都会有简历模板 我们从网上下载一个简历模板 就是创建了一个实体类的对象 而这个简历模板 就相当于一个实体类 接下来 我们对下载下来的模板进行操作 也就是对 实体类对象进行操作 对实体类对象操作 是不会影响实体类的 这个例子里面 应该一目了然 然后 根据个人信息不同 我们再模板上填写的信息也不同 比如 姓名 年龄 等等 按照个人的信息来填写 所以 就会产生实体类的对象的属性 不同 相信这样解释 你应该可以理解了吧 关键还是要靠多写训练 熟能生巧 运用以后才能知道这些东西存在的奥妙
用哪种方式比较好最佳答案p1 有系统创建并释放,你不要担心会出现内存泄露,但是生命期只有在本区域的大括号内,出了大括号就没用了。P2 是指针,要自己释放,用不好很危险,用好了功能强大,因为他可以赋值给全局的变量,一下子从局部变量变成全局变量,还能把对象作为函数返回值。--先定义一个类: class A { public: A(); virtual~A(); }; 类实现略。 用的时候: A a; a成员函数; a成员变量; a 就是一个对象。 也可以这样用: Aa=new A; a-成员函数; a-成员变量; 最后别忘了销毁对象:delete a; --- 一个类的实例化对象所占空间的大小 注意不要说类的大小,是类的对象的大小 首先,类的大小是什么确切的说,类只是一个类型定义,它是没有大小可言的。 用sizeof 运算符对一个类型名操作,得到的是具有该类型实体的大小。 如果 Class A; A obj; 那么sizeof(A)==sizeof(obj) 那么sizeof(A)的大小和成员的大小总和是什么关系呢,很简单,一个对象的大小大于等于所有非静态成员大小的总和。 为什么是大于等于而不是正好相等呢超出的部分主要有以下两方面: 1)C++对象模型本身 对于具有虚函数的类型来说,需要有一个方法为它的实体提供类型信息 (RTTI)和虚函数入口,常见的方法是建立一个虚函数入口表,这个表可为相同类型的对象共享,因此对象中需要有一个指向虚函数表的指针,此外,为了支持RTTI,许多编译器都把该类型信息放在虚函数表中。但是,是否必须采用这种实现方法,C++标准没有规定,但是这几户是主流编译器均采用的一种方案。 2)编译器优化 因为对于大多数CPU 来说,CPU 字长的整数倍操作起来更快,因此对于这些成员加起来如果不够这个整数倍,有可能编译器会插入多余的内容凑足这个整数倍,此外,有时候相邻的成员之间也有可能因为这个目的被插入空白,这个叫做"补齐"(padding)。所以,C++标准紧紧规定成员的排列按照类定义的顺序,但是不要求在存储器中是紧密排列的。 基于上述两点,可以说用sizeof 对类名操作,得到的结果是该类的对象在存储器中所占据的字节大小,由于静态成员变量不在对象中存储,因此这个结果等于各非静态数据成员(不包括成员函数)的总和加上编译器额外增加的字节。后者依赖于不同的编译器实现,C++标准对此不做任何保证。 C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。 如果在类中声明了虚函数(不管是1 个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32 位机器上,一个对象会增加4 个字节来存储此指针,它是实现面向对象中多态的关键。而虚函数本身和其他成员函数一样,是不占用对象的空间的。 我们来看下面一个例子:(此例子在Visual C++编译器中编译运行) #include iostream using namespace std; class A { }; class B { char ch; void func() { } }; class C { char ch1;//占用1 字节 char ch2;//占用1 字节 virtual void func() { } }; class D { int in; virtual void func() { } }; void main() { A a; B b; C c; D d; cout sizeof(a)endl;//result=1 cout sizeof(b)endl;//result=1//对象c 扩充为2 个字,但是对象b 为什么没扩充为1 个字呢大家帮忙解决 cout sizeof(c)endl;//result=8 //对象c 实际上只有6 字节有用数据,但是按照上面第二点编译器优化,编译器将此扩展为两个字,即8 字节 cout sizeof(d)endl;//result=8 } 综上所述: 一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的。
也许你是刚接触面向对象的朋友, 不要被概念的东西搞晕了,给你举个例子吧,如果你去中关村想买几台组装的PC机,到了那里你第一步要干什么,是不是装机的工程师和你坐在一起,按你提供的信息和你一起完成一个装机的配置单呀,这个配置单就可以想象成是类,它就是一张纸,但是它上面记录了你要买的PC机的信息,如果用这个配置单买10台机器,那么这10台机子,都是按这个配置单组成的,所以说这10台机子是一个类型的,也可以说是一类的。那么什么是对象呢,类的实例化结果就是对象,用这个配置单配置出来(实例化出来)的机子就是对象,是我们可以操作的实体,10台机子,10个对象。每台机子都是独立的,只能说明他们是同一类的,对其中一个机做任何动作都不会影响其它9台机器,但是我对类修改,也就是在这个配置单上加一个或少一个配件,那么装出来的9个机子都改变了,这是类和对象的关系(类的实例化结果就是对象)。
类的概念:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。
对象的概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。从更抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成的。
类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。类描述了一组有相同特性(属性)和相同行为(方法)的对象。
以上就是关于在java里,类和对象的区别是什么如何定义类和对象全部的内容,包括:在java里,类和对象的区别是什么如何定义类和对象、java中类,对象,属性,方法,都是什么,简单明了的说明一下、如何将一个类中的数据成员声明为另一个类的对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!