1。Person person = new A(); 不是父类对象指向子类引用而是父类引用指向子类对象
创新互联建站是一家专业提供贺州企业网站建设,专注与网站设计制作、做网站、H5高端网站建设、小程序制作等业务。10年已为贺州众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
2。这个对象不能调用子类A特有的弹吉他方法--person.guitar(); X
3.如果仅是这么写程序,还不是多态,记住实现多态的三要素:继承 重写 父类引用指向子类对象
那么,你必须在父类里面定义一个方法guitar(); ,然后在子类中重写这个方法
之后,如果你调用persion.guitar(),此时在代码的编译阶段,persion调用的仍然是自己的guitar(),不是儿子的。而当程序运行时,就是java XXX, persion调用的却是儿子的guitar()。这个动态的过程才是多态 。
总之
比如A a = new B();是创建了一个子类对象并把它当成父类对象A用
也就是父类引用指向子类对象
此时,引用变量a有2个类型,编译时的类型为A,运行时的类型为B.在代码编译过程中,a 只能调用属于A的方法. 不能调用B类里面的方法.注意,由于继承关系,如果B重写了A的某个方法,比如说eat(),而在代码编译过程中,a.eat()调用的是A的eat(),但在程序运行时,却运行的是B的eat(). 这就是多态
比如Animal a = new Tiger(); Tiger继承并重写了Animal的eat()方法.这也是父类引用指向子类对象.首先, a 是 一只老虎.但不幸的是,Animal a= new Tiger(); 也就是说a虽然有了老虎的实质, 就是说有了老虎的爪子,身材..... , 但却没有老虎的名分.它虽然身体是老虎, 但名字或者说它的类别却是动物,而不是老虎.而作为动物的定义,你当然不能使用属于老虎的定义的方法.比如说,虽然二者都有吃的行为, 但老虎吃肉,动物都吃肉么? 所以虽然a实质上是老虎,但在书面描述a的行为时,你只能使用动物的定义. 这个阶段就相当于代码的编译的阶段.而此时a的类型为编译时的类型-动物.而如果具体实施吃的行为时, 比如说给a喂吃的, 虽然书面定义了a只能有动物的笼统的吃的方法,比如说用嘴,没有规定要吃肉.但是现在是具体操作了,由于a实质上是老虎,所以a实质上履行的还是老虎的吃的方法. 具体的吃的过程,就相当于程序的运行的阶段. 而此时a的类型为运行时的类型-老虎
每一个节点有一个成员变量引用下一个节点就行了。
大致实现了一下单向链表 没有加入异常也没有仔细考虑实现的代码的效率,可以参考下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
public class LinkListTest {
public static void main(String[] args) {
LinkListString ll=new LinkListString();
ll.add("a");
ll.add("b");
ll.add("c");
ll.add("d");
ll.remove(1);
System.out.println(ll.get(0));
System.out.println(ll.get(1));
System.out.println(ll.get(2));
System.out.println(ll.get(3));
System.out.println(ll.size());
}
}
class LinkListT{
private NodeT frist=null;
private NodeT last=null;
private int size=0;
public void add(T t){
if(frist==null){
NodeT node=new NodeT();
node.setT(t);
size++;
frist=node;
last=node;
}else{
NodeT node=new NodeT();
node.setT(t);
last.setNextNode(node);
size++;
last=node;
}
}
public T get(int i){
if(i=0isize){
NodeT nod=null;
for(int n=0;n=i;n++){
if(n==0)
nod=frist;
else
nod=nod.getNextNode();
if(i==n){
return nod.getT();
}
}
}
return null;
}
public void remove(int i){
if(i=0isize){
if(size2){
frist=null;
last=null;
size=0;
}else{
size--;
if(i==0){
frist=frist.getNextNode();
}else{
NodeT nod1=null;
NodeT nod2=null;
for(int n=0;n=i;n++){
if(n==0){
nod1=frist;
nod2=frist;
}else{
nod2=nod1;
nod1=nod1.getNextNode();
}
if(i==n){
if(nod1!=null)
nod2.setNextNode(nod1.getNextNode());
else{
nod2.setNextNode(null);
last=nod2;
}
}
}
}
}
}
}
public int size(){
return size;
}
}
class Node T{
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public NodeT getNextNode() {
return nextNode;
}
public void setNextNode(NodeT nextNode) {
this.nextNode = nextNode;
}
private T t;
private NodeT nextNode=null;
}
package com.zpp;public class Charge {
public static void main(String [] args) {
if(args.length ==0) {
System.out.println("parameter error!");
System.out.println("java com.zpp.Charge [int]");
return;
}
int min = Integer.parseInt(args[0]);
double money = 0.0;
if (min = 0) {
money =0.0;
System.out.println("not money");
} else if (min = 60) {
money = 2.0;
} else {
money = 2.0 + (min - 60) * 0.01;
}
System.out.println("please pay: " + money);
}
} 编译:javac -d . Charge.java运行:java com.zpp.Charge 111
mport java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class Randomtree extends JFrame {
private JTree tree;
public static String[] school = { "初中课程", "高中课程", "大学课程" };
public static String[] color = { "颜色", "运动", "食物" };
public static String[] plant = { "植物", "动物", "人" };
public static String[][] school2= {
{ "初中一年级", "初中二年级", "初中三年级"}, {"高中一年级", "高中二年级",
"高中三年级"}, {"大学一年级", "大学二年级", "大学三年级", "大学四年级"} };
public static String[][] color2 = {
{ "绿色", "白色", "红色"}, {"足球", "篮球",
"羽毛球"}, {"面包", "牛奶", "披萨", "热狗"} };
public static String[][] plant2 = {
{ "玫瑰花", "月季花", "海棠花"}, {"猪", "狗",
"猫"}, {"黄种人", "黑种人", "白种人", } };
public static void main(String[] args) {
// TODO 自动生成方法存根
new Randomtree();
}
public Randomtree() {
super();
final Random random=new Random();
setVisible(true);
setSize(300,400);
tree = new JTree();
final JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(0, 40));
getContentPane().add(panel, BorderLayout.NORTH);
final JScrollPane scrollPane = new JScrollPane();
scrollPane.setPreferredSize(new Dimension(300, 350));
getContentPane().add(scrollPane, BorderLayout.CENTER);
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int k=random.nextInt(3);
tree=getTree(k);
scrollPane.setViewportView(tree);
}
});
scrollPane.setViewportView(null);
button.setText("随机生成树");
panel.add(button);
pack();
}
protected JTree getTree(int n) {
String[] second=null;
String[][] three=null;
if(n==0){second=school; three=school2;}
if(n==1){second=color; three=color2;}
if(n==2){second=plant; three=plant2;}
DefaultMutableTreeNode root=new DefaultMutableTreeNode("root");
for(int i=0;isecond.length;i++){
DefaultMutableTreeNode secondNode=new DefaultMutableTreeNode(second[i]);
for (int j=0;jthree[i].length;j++){
DefaultMutableTreeNode threetNode=new DefaultMutableTreeNode(three[i][j]);
secondNode.add(threetNode);
}
root.add(secondNode);
}
JTree tree=new JTree(root);
tree.expandRow(1);
tree.expandRow(5);
tree.expandRow(9);
return tree;
}
}
简单的 例子你可以模仿一下