课本P107T12
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class book0612 extends Applet implements KeyListener
{
private TextField input;
private String d="";
public void init()
{
input = new TextField(10);
add(input);
input.addKeyListener(this);
}
public void paint(Graphics g)
{
g.drawString("输入字符:"+d,10,50);
}
public void keyPressed(KeyEvent e)
{}
public void keyReleased(KeyEvent e)
{
d=String.valueOf(input.getText());
repaint();
}
public void keyTyped(KeyEvent e)
{}
}
只是改了下例6.11的相应部分,具体怎么实现还不是很清楚。
从主方法进入,每次都去寻找调用了那些方法,这些方法的位置,不断重复直到主方法执行完
例如执行main方法中SonAddClass p1=new SonAddClass (2,3,5); 时找到初始化方法SonAddClass (int x,int y,int z),其中有个super(x,y,z);就到父类中找参数相同的方法,转到AddClass (int x,int y,int z) 方法,根据顺序先运行AddClass (int x,int y) ,同理运行AddClass (int x) ,参数转到类中对xyz的初始化,然后不断反着将上述提到的依次运行,把2,3,5赋值给x,y,z。p2,p3同理,最后通过引用p1,2,3调用对象方法add(),add中需要先运行完super指代的addclass中的add方法后再执行外面的println。
例6.6有一步调用同名构造方法会先去父类中初始化,然后继续运行,最后调用getSuper()方法得到父类中隐藏的属性。
书79到81中讲了很多,还需要继续研究。
在类1中设置得到类2对象的方法并用引用连接类2对象;在类2中相应设置方法
下面就是n2通过a向n1发消息
class A{
String name="a_A";
B b;
void setB(B _b){
this.b=_b;
}
}
class B{
String name="a_B";
A a;
void setA(A _a){
this.a=_a;
}
void call_A(){
System.out.println("B gets A name: "+a.name);
}
}
public class edit0602 {
public static void main(String args[]){
A n1=new A();
B n2=new B();
n2.setA(n1);
n2.call_A();
}
}
子类继承父类,拥有的权限比父类大(或等),能调用父类中所有的方法和属性,有点像扩展和改进父类。
组合只是使用,不太需要知道内部构造,就像用电脑不太需要知道芯片和集成电路的构造。
好像没在课件和课本中找到但是看了3篇博客
JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。具体一点就是子类方法重写了父类方法。使用父类引用指向子类对象,再调用某一父类中的方法时,不同子类会表现出不同结果。它使得许多事情在运行时就被得以解决,提供了更大的灵活性。(转自https://blog.youkuaiyun.com/Loga6/article/details/109142833)
https://blog.youkuaiyun.com/weixin_40244153/article/details/82348763
https://blog.youkuaiyun.com/m0_48957269/article/details/109317358
import java.awt.*;
import java.applet.*;
interface Shapes
{
abstract public double getArea();
abstract public double getPerimeter();
}
class Rect implements Shapes
{
protected int x,y,k;
protected double m;
public double getArea()
{ return(k*m); }
public double getPerimeter()
{ return(2*k+2*m);}
public Rect(int x,int y,int width,int height){
this.x=x;
this.y=y;
this.k=width;
this.m=height;
}
}
class Triangle implements Shapes
{
protected int x,y,k;
protected double m;
public double getArea()
{return(Math.sqrt(m*( m-k)*( m-x)*(m-y)));}
public double getPerimeter()
{return(k+x+y);}
public Triangle(int baseA,int baseB,int baseC){
this.x=baseA;
this.y=baseB;
this.k=baseC;
this.m=(baseA+ baseB+ baseC)/2.0;
}
}
class Circle implements Shapes
{ protected int x,y,k;
protected double m;
public double getArea()
{return(m* m *Math.PI);}
public double getPerimeter()
{return(2*Math.PI* m);}
public Circle(int x,int y,int width)
{
this.x=x;
this.y=y;
this.k=width;
this.m=width/2.0;
}
}
public class edit0605{
Rect rect=new Rect(5,15,25,25);
Triangle tri=new Triangle(5,5,8);
Circle cir =new Circle(13,90,25);
public void paint(Graphics g){
g.drawRect(rect.x,rect.y,rect.k,(int)rect.m);
g.drawString("Rect Area:"+rect.getArea(),50,35);
g.drawString("Rect Perimeter:"+rect.getPerimeter(),50,55);
g.drawString("Triangle Area:"+tri.getArea(),50,75);
g.drawString("Triangle Perimeter:"+tri.getPerimeter(),50,95);
g.drawOval(cir.x-(int)cir.k/2,cir.y-(int)cir.k/2,cir.k,cir.k);
g.drawString("Circle Area:"+cir.getArea(),50,115);
g.drawString("Circle Perimeter:"+cir. getPerimeter(),50,135);
}
}
结合例6.10改的,能运行。
运算符格式:a instanceof A,其中a为对象的引用,A为类。如果a为A的实力或A子类的实力,则会返回true;如果a为A父类的实力,则返回false;如果a最想的类和A没有任何关系,则编译不会通过。