把当前文件用记事本另存成unicode编码的 ,就可以了
或者:Ctrl+A全选,然后在文件菜单:file->advanced save options ,在弹出的选项中选择新的编码方式为:UNICODE codepage 1200 ,点击确定,问题就解决了
Java学习的第二篇总结!——子类和父类 深入分析,希望大家多多支持!
从内存角度去分析代码,可以从本质上理解一门语言!
子类从父类继承分成两种:
1.方法的继承:
方法的继承,父类直接把自己的方法转移到子类中去,当然前提是父类的方法修饰符的访问范围是子类可以访问的范围,但是如果子类已经重写了父类的方法,这时候这个方法就不能重父类转移到子类中。
2.成员变量的继承 :
成员变量就会有点奇妙了,它不会从父类转移到子类,而是保留在父类中,这就会出现,子类和父类可能同时拥有两个相同名字的变量。
下面用一段代码来说明这种相对比较复杂的关系:
package com.text;
public class Test {
public static void main(String[] args) {
Father a = new Father();
Chilren b = new Chilren();
Father c = new Chilren();
a.getAge();
System.out.println(a.age);
b.getAge();
System.out.println(b.age);
c.getAge();
System.out.println(c.age);
}
}
class Father {
int age = 40;
public void getAge() {
System.out.println(age);
}
}
class Chilren extends Father {
int age = 18;
public void getAge() {
System.out.println(age);
}
}
输出
40 40 18 18 18 40
前四个结果可以理解,但是最后两个结果有人可能会问为什么结果会不一样,这段代码就体现了,成员变量继承和方法继承的区别。
可以得出结论:
Father c = new Chilren();
在以上父类引用指向子类对象情况下,访问变量看的是引用类型,所以c.age是父类的成员变量,而c.getAge()访问到的是子类Chilren的方法,所以在这个方法中用到的age变量是Chilren的变量
反正一句话,访问变量看声明,访问方法看实际对象类型(new出来的类型)
接下来对代码做部分修改
public static void main(String[] args) {
Chilren b = new Chilren(); Father c = b System.out.println(b.age); System.out.println(c.age); }
输出 18 40
b 和c 两个引用都是指向内存中同一个对象,但是打印出来的结果却是不同,这就说明了,内存中保存了两个 age的值,一个是18 一个是40 。
这里就会产生一些疑问,在内存中他们是怎么存储的?这时候会想到有个super关键字,通过super. 可以访问到父类的变量和方法,这里有人会说:“super.代表的就是一个父类对象,因为他指向父类” 之前我也是这么想,但是看过一些书后知道其实不是这样
其实super.不是“东西”,说道super.自然会想到this.,有人把他们归为同类,其实他们大大不同
this:是一个真真实实对象,代表的就是当前对象,可以用 return this; 去返回一个对象。
super:不能一个对象,不是指向父类对象的意思,super只是修饰了他后边的内容,告诉JVM,后面这部 分内容不是当前对象所属类的内容而已,若用return super,JVM是不允许的,是一种错误的语法。
Chilren b = new Chilren(); Father c = b
回归到上面这段代码,这里并不是说内存中有两个对象 b 和 c ,内存中其实就只有一个 b对象 ,只是c 不仅有自己的实例 变量,同时也存在父类所定义的全部实例变量。
所以可以得出结论:在实例化一个子类的同时,系统会给子类所有实例变量分配内存,也会给他的父类的实例变量分配内存,及时父子类中存在重名的实例变量,也会两个都分配内存的,这个时候子类只是隐藏了父类的这个变量,但还是会给它分配内存,然后可以用super来访问属于父类的变量。
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
预计达成目标:Weblogic8下实现消息的异步传输与监听
为了实现不间断发送与监听,使用了Quartz自动调度,这个不是这篇文章重点,不做讲解,也可以将quartz去掉
quartz引用的jar包比较多,这里就不作为附件了,只上传jms需要依赖的jar包 ,其中还有weblogic.jar,太大了就没有上传,可以在weblogic的安装bin目录下找到.
配置步骤
一、建立 Weblogic Domain:建立步骤不再累述
二、在Console控制台配置连接工厂与消息队列
1、配置连接工厂
按如下路径点击:Service—>JMS—> Connection Factories,在右侧弹出的页面,点击链接“Configure a new JMS Connection Factory...”,在新页面中输入Name及JNDI Name,此处两处均输入连接工厂名为:jms/connFactory,点击“Create”则生成JMS连接工厂
如下图:
2、配置消息队列
如下图位置配置队列,这个jmsServer是自己建立的
到此位置就配置了一个 名称为 jms/connFactory 的连接工厂以及名为 queueasd 的队列
三、消息发送测试类
package com.javasd.jms;
import java.util.Properties;
import javax.jms.BytesMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
public class TestJmsConnection implements Job {
public static void main(String args[]) throws Exception {
//quartz调度,不做讲解
SchedulerFactory schedFact=new StdSchedulerFactory();
Scheduler sched=schedFact.getScheduler();
sched.start();
JobDetail jobDetail=new JobDetail("a","b",TestJmsConnection.class);
jobDetail.getJobDataMap().put("name","lucy");
CronTrigger trigger=new CronTrigger("c","d");
trigger.setCronExpression("0/100 * * * * ? " ); // 启动之后立即执行 每一秒继续重复。
sched.scheduleJob(jobDetail, trigger);
}
public void execute(JobExecutionContext arg0) throws JobExecutionException {
try{
//这里才是jms发送端的逻辑
Properties properties = new Properties();
//设置连接属性
//这个设置是固定的
properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
//设置端口及IP 我的domain在本地,端口为9001
properties.put(Context.PROVIDER_URL, "t3://localhost:9001");
//与weblogic的console用户名密码一致
properties.put(Context.SECURITY_PRINCIPAL, "weblogic");
properties.put(Context.SECURITY_CREDENTIALS, "weblogic");
//实例化上下文
Context ctx = new InitialContext(properties);
//获取连接工厂
QueueConnectionFactory queueFactory = (QueueConnectionFactory)ctx.lookup("jms/connFactory");
//根据连接工厂获取连接
QueueConnection queueConn = queueFactory.createQueueConnection();
//根据连接获取操作的session实例
QueueSession qSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
//通过上下文jndi查找配置的队列,我配置的队列名称及jndi名称均为 queueasd
Queue queue = (Queue)ctx.lookup("queueasd");
//通过session以及指定的队列实例化消息发送器
QueueSender queueSender = qSession.createSender(queue);
//打开连接
queueConn.start();
//测试用要发送的字符串
String s = "just test sending of jms under weblogic8!";
//转换为byte数组
byte[] bytes = s.getBytes();
int byteLength = bytes.length;
//通过session的createBytesMessage方法实例化一个jms识别的消息实体对象
BytesMessage bytesMessage = qSession.createBytesMessage();
//为这个message对象设置值
//设置消息的长度
bytesMessage.writeInt(byteLength);
//设置消息的内容
bytesMessage.writeBytes(bytes);
//发送消息
queueSender.send(bytesMessage);
} catch(Exception e ){
e.printStackTrace();
}
}
}
四、消息接收类
package com.javasd.jms;
import java.util.Properties;
import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
public class TestJmsReceive implements Job{
public static void main(String args[]) throws Exception {
try{
//quartz
SchedulerFactory schedFact=new StdSchedulerFactory();
Scheduler sched=schedFact.getScheduler();
sched.start();
JobDetail jobDetail=new JobDetail("a","b",TestJmsReceive.class);
jobDetail.getJobDataMap().put("name","lucy");
CronTrigger trigger=new CronTrigger("c","d");
trigger.setCronExpression("0/5 * * * * ? " ); // 启动之后立即执行 每一秒继续重复。
sched.scheduleJob(jobDetail, trigger);
} catch(Exception e){
}
}
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//与sender中的定义一样,在实际应用中可以考虑单独讲这些设置为静态变量
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL, "t3://localhost:9001");
properties.put(Context.SECURITY_PRINCIPAL, "weblogic");
properties.put(Context.SECURITY_CREDENTIALS, "weblogic");
Context ctx = null;
QueueConnection qConn = null;
QueueConnectionFactory queueFactory = null;
QueueSession qSession = null;
Queue queue = null;
QueueReceiver qreceiver = null;
try {
ctx = new InitialContext(properties);
queueFactory = (QueueConnectionFactory)ctx.lookup("jms/connFactory");
qConn = queueFactory.createQueueConnection();
qSession = qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queue = (Queue) ctx.lookup("queueasd");
//从这里开始与sender有差别
//用指定的队列构造Receiver
qreceiver = qSession.createReceiver(queue);
//为这个receiver设置监听器MessageListener,使用的内部类
qreceiver.setMessageListener(new MessageListener() {
public void onMessage(Message msg) {
//如果接收到的消息是byte类型的message,可以使text等类型,这个可以自己尝试
if(msg instanceof BytesMessage){
//转换为jms识别的消息对象
BytesMessage bytesMessage = (BytesMessage)msg;
try {
int length = bytesMessage.readInt();
byte[] bytes = new byte[length];
//获取传送过来的消息
bytesMessage.readBytes(bytes);
//将消息进行展现
String s = new String(bytes);
System.out.println(s);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
);
//开启连结进行监听
qConn.start();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
这样就完成了一个最基本的JMS消息发送以及接收的测试实例,在实际项目应用中项目组用到的jms对连接池