封装的单位是对象; 继承的单位是类; 好象扯不上边;
可是对这句话不太理解; 被这些单位给搞晕了!~ 请大家帮忙写这样一个程序:1.写一个类; 封装类的属性和部分方法; 并且封装构造方法; 写一个继承关系表示不冲突;2. 在类的内部生成对象封装; 在外部通过一个接口声明 去调用这个类的实例;
说的不太通顺,还请见谅, 希望能给予帮助, 谢谢!~~
解决方案 »
- java中的枚举
- 偶前不久见到的一个面试题,看看你的基本功!
- 小弟刚学java零基础,请问有什么比较好的书么?
- httpsUrlConnection的Bug???有没有人碰到过这样的问题啊?
- Java中取"yyyy-mm-dd hh:mm:ss"型当前时间,如何取呢?
- 一个程序在编译时通过了,但是运行时出现异常,请教怎么改正
- 这样写代码行吗??
- 如何用java程序实现keytool的功能?
- Java控制台里,怎么清屏啊?
- 访问类成员变量
- 高手:留步。请问java开发的Application中,像eclipse一样,不管是不是焦点,都能使用快捷键,实现原理机制是怎么怎么样的?谢谢。
- 请问Eclipse如何设计界面?
{
private int i;//int类型的对像i
pirvate String str;//String类型的对像str
}FF f = new FF();
f对像中有int对像,也有String类型的对像.都是针对i,str这样的对像的.还可以有其它的对像.
继承的单位是类; 只能是一个继承其它的类,不能说一个对像继承其它对像.A类继承B类,我也不懂怎么去描述,我只好把理解为Java规范的约定.继承就是类与类之间的.封就是说把多种类型(int.String等)的对像封装在一种类型对像(FF f)中;
http://topic.csdn.net/u/20071229/20/50c600d9-8369-4c75-a53b-73249696082b.html先扯什么是数据的封装,class Point
{
int x;
int y;
};
你先想这个,然后我们说数据的隐藏。class Point
{
private int x = 0;
private int y = 0;
}当然了,这样不够,
class Point
{
private int x = 0;
private int y = 0;
public int getX() {}
public int setX(int value) {}
//... ...
}我们有了public的方法了,就可以操作x,y了,而且你不能使得x和y的值 离谱~。而且,我们看Rect类的设计。class Rect
{
Point p1;//Top-Left point;
Point p2;//Botton-Right point,
}
这样是不是又一次诠释了什么是数据的封装。
{
String text;
Rect rect;
}
Java代码对付看了,就不写那些形象理解的部分了。那么当我们发现Windows左下角的开始菜单的那个Button很好看的时候,又不想全部重写关于Button已有的属性,状态,行为怎么办?继承是一种办法,是一种相当好的办法。class ImageButon extends Button
{
Image image;
}
那么,ImageButton既有了Image,也有了text和它的区域Rect,对吧?
以后说多态。
(那些觉得问题简单的人去思考这个问题,为什么正方形不能从矩形派生?)多态是关注对象行为的。我们有了Button类,假设它的一个行为是显示自己,于是我们有Code:class Button
{
void show() { /* 想怎么show就怎么show */ }
}那么,我们的ImageButton怎么办啊?显然行为不同了,它要显示一个图片哦~class ImageButon extends Button
{
void show() { /* 画图呗,哥们我还是研究过边缘检测的。 */ }
}从语法上说,这个完成了多态性的一部分了,先强调一下,这里面有继承(Inheritance),有重写(Override)。现在我们完成这个多态的表述:Button btn = new ImageButton(/*some constructor params*/);
...
btn.show();//注意,这个show会调用到派生类的方法实现中,这个调用也被称为延迟绑定,C++叫动态绑定。
重申一下多态的概念,一个字都不要错哦,:
用基类的指针或者引用调用派生类的方法叫做动多态。(对于Java,我们就说引用就可以了。)
什么叫接口? 什么叫多态吗?. 我只要一个例子的应用; 显示封装对象的概念;
你们在那里扯很多封装数据成员; 请按题解答; 不要来回答这些基础概念; 基础概念我到哪里都能找到;我要看的是一个实现!!!!!! 实现!!!!!!!!!!!!!!!!!!!!!
你在16楼的回复太冲动了,很打击大家的情绪呢.lz好象是在自学Java,很佩服楼主的自学精神和专研精神.我是这么认为的: 楼主要求的程序即使写出来,也体现不了封装,多态,继承 的这些显著特点.我就以我的理解来举一个例子,希望能简单的体现这3个特点:以楼主为例:
现在我们有一个CSDNer:bxdg42578670
JAVA要自学通
等 级:一个三角
-----------------------------------------------------------
我用一个抽象类把他的固有特点抽取出来:CSDNer.java 里面有属性的get和set方法,同样是抽象的,没有实现.
然后有一个楼主类继承自这个抽象类:楼主.javapublic abstract class CSDNer
{
abstract所有属性对应的get和set方法;
}这样做有一个好处,所有楼主或新楼主,都继承自CSDNer,都必须实现CSDNer中应有的方法。
在实际项目中,架构师掌握和控制一个项目的重要方法,就是制定 接口和抽象类,普通类必须实现对应的接口和抽象类(一般是接口,约束性更强),那么就都受到架构师的约束了。-----------------------------------------------------------
当我要使用楼主类的时候,我这么声明:public class 楼主资料
{
public CSDNer get当前楼主()
{
/**
* 这就是多态和继承的应用了,我以父类的名义声明,但实际实例化的是子类。
*/
CSDNer 当前楼主 = new 楼主();
return 当前楼主;
}
}这么做有什么好处?
当我论坛中到处都有楼主的影子时(bxdg42578670的确很活跃来着).
我都调用 get当前楼主()方法,返回的是一个CSDNer.有一天楼主变了,成了一个新楼主,我代码的其他所有地方都不用变,只需要把楼主资料.java中的
CSDNer 当前楼主 = new 楼主();
改为
CSDNer 当前楼主 = new 新楼主();
其他地方都不用变.如果不使用继承和多态的特点,那么楼主资料返回了一个 楼主,当变化发生时,我需要把代码中所有有 楼主 的地方,换成 新楼主。-----------------------------------------------------------这里回头看继承和多态在例子中的应用:所有楼主和新楼主都继承自 CSDNer,使用时用CSDNer声明,保持了统一的格式。当楼主和新楼主互相替换时,只需要改变new 后面的实例就行,在代码中 楼主和新楼主 都继承自CSDNer(楼主资料返回的是CSDNer)代码没有太大变化。而且 楼主与新楼主 都实现了CSDNer的方法,那么代码中即使实例变了,但是 当前楼主.getID();的方法不发生变化:两个楼主的 getID()方法有统一的参数和返回值。
意思就是说写一个类; 将这个类完全的封装; 并且在类的内部就new出对象;整个类也就只能诞生这么一个对象; 想new新的一个都做不到;外界只能通过一个接口声明; 来调用这个对象在外面使用;
我就想看下这样的一个例子啊!~~ 我是自己写不出来,才请教啊!大哥!~您就帮帮忙吧!~~~~~~
------------------------------------
这个绝对不是封装的体现(至少不是主要的):封装的是数据,用类的结构代替数据的结构,用类的方法代替数据的行为.再举个例子,我要把楼主和小草的信息写入一个文件中.
面向过程的办法是向一个文件
write(bxdg42578670);
write(JAVA要自学通);
然后继续
write(healer_kx);
write(甘草);
存储和读取的,和楼主/小草没什么关系,都是一条条的String这里我把楼主和小草的资料封装起来
ICSDNer 数据1 = new CSDNer(bxdg42578670,JAVA要自学通);
ICSDNer 数据2 = new CSDNer(healer_kx,甘草);
最后我把对象写进文件里
write(数据1);
write(数据2);
当我需要的时候,读/写的单位就变成了CSDNer.
以一个一个的CSDN用户为基础单位进行操作.
---------------------------------我对这句话的理解和楼主不同,这里"对象"不是指Java内存中的对象,而是指现实世界中的对象.把现实世界中的对象,以某个类对象的形式存放起来.类的属性就是现实世界中的对象的属性,类的方法就是现实世界中的对象的行为.这就是封装.
--------------------------------------------------------------------------
我知道我有时候说的可能有口误; 也知道封装的单位是对象; 可能是新手的缘故吧!~也有可能是自学无法获及正规表达的原因吧!~~
这个还需要更长时间的磨练吗!~ 你说对吧!~~
public class 楼主
{
private static 楼主 当前楼主 = null; //私有的一个楼主唯一实例的引用.
private 楼主(){} //私有构造方法,外面都创建不了楼主了. public staitc synchronized 楼主 get楼主() //唯一获得楼主实例的方法.
{
if(this.当前楼主 = null) //引用为空,创建实例
{
this.当前楼主 = new 楼主(); //创建唯一实例
}
return 当前楼主; //返回楼主实例的唯一一个引用.
}
}
private static 楼主 当前楼主 = new 楼主();
然后去掉if判断,就变成饿汉式了.所谓殊途同归,楼主虽然是自学,但是不经意间就踏入了江湖高手的行列,特此膜拜~~~``
你写的哪个类; 岂不每次 使用的时候都会去new () 吗?. 看上去好象无法唯一啊?....
* static的 当前楼主(即bxdg42578670引用的那个当前楼主)不为null ,它指向开始new的那一个对象
* 那么get楼主()方法不会再去new一次,而是直接返回开始 new 的那个对象
*/
楼主 甘草 = 楼主.get楼主(); // 其实甘草 和 bxdg42578670 指向同一个对象.
有一处static拼错了
还有,if里的判断用"==",我居然用了"="自我鄙视一下
我没用MSN ,心里有太多的问题; 也有可能学习方法不太正确吧!~要不你申请一个新的QQ, 干净; 没人;实在不行, 我申请去, 在这里给你发个消息 ,
public class NN {
public static void main(String[] args) throws Exception {
楼主 a = 楼主.get楼主();
楼主 b = 楼主.get楼主();
System.out.println(a==b);
}
}class 楼主
{
private static 楼主 当前楼主 = null; //私有的一个楼主唯一实例的引用.
private 楼主(){} //私有构造方法,外面都创建不了楼主了. public static synchronized 楼主 get楼主() //唯一获得楼主实例的方法.
{
if(当前楼主 == null) //引用为空,创建实例
{
当前楼主 = new 楼主(); //创建唯一实例
}
return 当前楼主; //返回楼主实例的唯一一个引用.
}
}没问题,输出为true;
实现单例类有2中方法
他们的共同点是 构造方法是private的
第一种方法:在类中提供public static final 成员变量。好处:性能稍微好点
第二中方法:在类中提供private static final 成员变量,然后提供public static 方法获取该实例。不改动api情况下,改动比较灵活第二个方法是所谓的饿汉式还有一个注意点:如果单例类需要序列化,那么一定要重写readResolve方法,保证反序列化出来的是一个实例
理解下面的CODE就不用考虑OOP概念什么的了,直接上机练就OK了abstract class Animal //父类
{
public boolean mammal = true; //是否哺乳
public boolean carnivorous = true; //是否食肉
public int mood = 1; //情绪,默认好 public boolean isMammal() //显示是否哺乳方法
{
return this.mammal;
}
public boolean isCamivorous() //显示是否食肉方法
{
return this.carnivorous;
}
public void setMood(int mood) //设置情绪
{
this.mood = mood;
}
public int getMood() //显示情绪
{
return this.mood;
}
abstract public String sayHello(); //打招呼方式方法(未完成)
abstract public String sayHello(int mood); //带参打招呼方(未完成)}interface LandAnimal //陆生接口
{
public int getNumberOfLegs(); //有脚?(未完成)
}
interface WaterAnimal //水生接口
{
public boolean hasGill(); //有腮?(未完成)
public boolean laysEggs(); //有卵?(未完成)
}
//---------------------DOG------------------------------------class Dog extends Animal implements LandAnimal //狗类 -:-)继承,拥有Animal所有公属性和方法等!
{
private int numberOfLegs = 4; //狗脚默认4脚 -:-)封装,Dog自己的属性
Dog() //构造狗
{
this.mammal = true; //是哺乳
this.carnivorous = true; //是食肉
}
public String sayHello() //重写狗
{
return "摇摇尾巴";
}
public String sayHello(int mood) //带参重写狗
{
this.setMood(mood);
switch (mood)
{
case 1: //1为情绪好0为不好
return "旺旺旺叫";
case 0:
return "呜呜叫";
default:
return "摇摇尾巴";
}
}
public int getNumberOfLegs() //显示脚,接口实现ING
{
return this.numberOfLegs;
}
}
//---------------------CAT------------------------------
class Cat extends Animal implements LandAnimal //猫类实现陆生接口
{
private int numberOfLegs = 4; //猫脚4脚 Cat() //构造猫
{
this.mammal = true;
this.carnivorous = true;
}
public String sayHello() //重写猫
{
return "喵喵叫";
}
public String sayHello(int mood) //带参重写猫
{
this.setMood(mood);
switch (mood)
{
case 1: //1为情绪好0为不好
return "咕噜咕噜叫";
case 0:
return "嘶嘶叫";
default:
return "喵喵叫";
}
}
public int getNumberOfLegs() //显示脚,接口实现ING
{
return this.numberOfLegs;
}
}//-----------------------------蛙----------------------------
class Frog extends Animal implements LandAnimal,WaterAnimal //蛙类,水陆接口并现
{
private int numberOfLegs = 4; Frog() //构造蛙
{
mammal = false;
carnivorous = false;
}
public String sayHello() //重写蛙
{
return "呱呱呱";
}
public String sayHello(int mood)
{
this.setMood(mood);
switch (mood)
{
case 1:
return "呱呱呱";
case 0:
return "扑通一声跳入水中";
default:
return "呱呱呱";
}
}
public boolean hasGill()
{
return true;
}
public boolean laysEggs()
{
return true;
}
public int getNumberOfLegs()
{
return this.numberOfLegs;
}
}//******************************************************public class Program
{
public static void main(String[] args)
{
Dog dog=new Dog(); //实例狗
Cat cat=new Cat(); //实例猫
Frog frog=new Frog(); //实例蛙
if(dog.isMammal()) //判断MAMMAL
System.out.println("狗是哺乳动物");
else
System.out.println("狗不是哺乳动物吗?");
if(dog.isCamivorous()) //判断CAMIVOROUS
System.out.println("狗是肉食动物");
else
System.out.println("狗不是肉食动物吗?");
System.out.println("狗通常的情况下,和人打招呼的方式为:"+dog.sayHello());
System.out.println("狗被抚摸情绪好的时候,打招呼的方式是:"+dog.sayHello(1));
System.out.println("狗烦躁的时候会:"+dog.sayHello(0));
System.out.println("狗有" + dog.getNumberOfLegs() + "条腿");
System.out.println();
//---------------------------------------------------
if (cat.isMammal())
System.out.println("猫是哺乳动物");
else
System.out.println("猫不是哺乳动物吗?");
if(cat.isCamivorous())
System.out.println("猫是肉食动物");
else
System.out.println("猫不是肉食动物");
System.out.println("猫通常的情况下,和人打招呼的方式为:"+cat.sayHello());
System.out.println("猫情绪好的时候会:"+cat.sayHello(1));
System.out.println("猫烦躁的时候会:"+cat.sayHello(0));
System.out.println("猫有" + cat.getNumberOfLegs() + "条腿");
System.out.println();
//------------------------------------------------------
if (frog.isMammal())
System.out.println("青蛙是哺乳动物吗?");
else
System.out.println("青蛙不是哺乳动物");
if (frog.isCamivorous())
System.out.println("青蛙是肉食动物");
else
System.out.println("青蛙不是肉食动物");
System.out.println("青蛙通常的情况下,打招呼的方式为:"+frog.sayHello());
System.out.println("青蛙情绪好的时候会:"+frog.sayHello(1));
System.out.println("青蛙受到惊吓是会:"+frog.sayHello(0));
if (frog.laysEggs())
System.out.println("青蛙产卵");
else
System.out.println("青蛙不产卵?");
if (frog.hasGill())
System.out.println("青蛙有鳃");
else
System.out.println("青蛙没有鳃吗?");
System.out.println("青蛙有" + frog.getNumberOfLegs() + "条腿"); }
}