java学习笔记之super内存分析

package superm;

/**
 * @author zhao xuke
 * 
 * 1.super 是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法,而(this是指当前对象)
 *
 *2.super的三种使用情况:
 *               (1)访问父类被隐藏的成员变量: super.变量;
 *               (2)调用父类被重写的方法:     super.方法名([参数列表]);
 *(3)调用父类的构造函数(又名构造器或构造方法):  super([参数列表]);
 *
 *3.在构造方法中  super(); 必须位于第一行 ,在普通方法(或重写方法中)中  super 没有顺序限制,可以放在任意一行
 *
 *4.构造方法中(或任何的构造函数中),若是构造函数的第一行代码没有显式的调用super();
 *   那么java默认都会调用super();作为父类的初始化函数,所以你这里的super()加不加都无所谓
 *    
 *    
 *5.父类总是有构造器(或构造方法或构造函数),即使我们没写系统也会给我们隐性加上,构造器(或构造方法中或构造函数中)
 *  除了Object类之外总是有super(),即使我们没写super()系统也会给我们隐性加上,而Object类中的构造器(或构造方法或构造函数)没有super()的原因是他没有父类。
 *  
 * 2018年4月11日 - 下午3:48:31
 */
public class Animal1 {
	String eye;
    public Animal1() {//此构造器如果我们没写系统也会给我们加上
		super();     //我们没写此super()系统也会给我们加上(除了Object类系统不会给我们加super(),因为他没有父类)
		System.out.println("创建一个动物");
	}
	public  void run() {
		System.out.println("跑跑!");	
	}
	public  void eat(){
		System.out.println("吃吃!");
	}
}

class Bird extends Animal1 {
	public Bird(){                                   //构造器(构造方法)
		super();
		System.out.println("建一个鸟对象");
	}
	//super.run();        //不能调只有在重写的方法中调如下
	public void run(){    //重写并不代表把父类覆盖掉了其实还可以调只能在此类中调在主类中无法调如上
		
		System.out.println("跑呀跑不不到");
		super.run();                        //在普通方法中super不一定非要在第一行
		
	}
	public void luansheng(){
		System.out.println("我是卵生!");
    }	
}

package superm;
/**
 * @author zhao xuke
 *
 * 2018年4月11日 - 下午11:17:11
 */
public class test {
	public static void main(String[] args) {
		Bird b = new Bird();
		b.run();
	}

}

运行结果:

创建一个动物
建一个鸟对象
跑呀跑不不到

跑跑!

运行结果的前两行是此  Bird b = new Bird();语句的结果

构造器的作用:1.用于实例化对象 2.用于初始化数据成员


内存图如下


例题1 

构造器的调用顺序:

package super练习;
/**
 * @author zhao xuke
 *super在构造器中的应用
 * 2018年4月12日 - 下午5:27:02
 */
public class A {
	public A() {
		System.out.println("this is A");
	}
}

class B extends A  {
	public B()	{
		System.out.println("this is B");
	}
}

class C extends B {
	public C() 	{
		System.out.println("this is C");
	}
}


package super练习;
/**
 * @author zhao xuke
 *
 * 2018年4月12日 - 下午5:28:17
 */
public class Test1 {
	public static void main(String[] args) {
		C c= new C();
		
	}

}

运行结果:

this is A
this is B

this is C

例题2

构造器的运行顺序:

package super练习2;
/**
 * @author zhao xuke
 *
 * 2018年4月12日 - 下午5:33:58
 */
public class A {
	public A() {
		System.out.println("this is A");
	}
}

class B extends A  {
	public B(String str){
	    System.out.println(str);//此处我们没写super()系统自动给添加了super();
		System.out.println("this is B");
	}
}

class C extends B {
	public C(String str) 	{
		  super(str);	//注释该行将出错
		System.out.println(str);
		System.out.println("this is C");
	}
}




package super练习2;
/**
 * @author zhao xuke
 *
 * 2018年4月12日 - 下午5:35:20
 */
public class Test2 {
	public static void main(String[] args) {
		C c= new C("helloWord");
	}

}

运行结果:

this is A
helloWord
this is B
helloWord

this is C

例题3

super在普通方法的应用

1.按下列要求编写Java程序:

(1)编写一个矩形类,有求面积、求周长的方法,printMyWay()方法要能显示矩形的边长、面积和周长。

要求:定义构造函数,作用是为边长赋值。

(2)编写正方形类作为矩形类的子类,正方形类继承了矩形类求面积和周长的方法,新增加求对角线长的方法,重写printMyWay()方法,要求该方法能显示正方形的边长、面积、周长和对角线长。

要求:

1、定义构造函数,作用是调用父类的构造函数为边长赋值,super(参数)

2、重写父类中求面积、周长的方法,通过调用父类相应方法完成功能

doublegetArea()

{

       return super.getArea();

      }

 

(3)在主类中完成对矩形和正方形边长、面积、周长和对角线长的输出。

提示:创建对象、调用相关方法

package super练习3之普通方法中的super练习;
/**
 * @author zhao xuke
 *
 * 2018年4月12日 - 下午5:56:12
 */
public class rectangle {
	double a,b,area,length;           //成员变量
	rectangle(double a, double b) {   //构造方法
	    this.a=a;
	    this.b=b;
	}
	double getArea(){                 //求面积
	   area=a*b;   
	   return area;
	}
	    
	double getLength(){               //求周长
	   length=(a+b)*2;
	   return length;
	}
    public void printMyWay(){         //输出面积和周长
	   System.out.println("矩形长为:"+a);
	   System.out.println("矩形宽为:"+b);
	   System.out.println("矩形面积为:"+getArea());
	   System.out.println("矩形周长为:"+getLength());
	   System.out.println("下面为正方形");
	}   
}
class square extends rectangle{           //正方形类继承矩形类
	
	square(double a, double b){           //
		super(a,b);                       //作为父类构造器的实参
    }
    double getArea(){                     //求面积
        return super.getArea();
    }
  

   double getLength(){
        return super.getLength();
   }
  
   double diagonal(){                   //求得正方形的对角线
    	return Math.sqrt(a*a+b*b);
   }
   public void printMyWay(){
        System.out.println("正方形的边长为:"+a);
        System.out.println("正方形面积为:"+getArea());
        System.out.println("正方形周长为:"+getLength());
        System.out.println("正方形对角线为:"+diagonal());
   
   } 
  
}


package super练习3之普通方法中的super练习;
/**
 * @author zhao xuke
 *
 * 2018年4月12日 - 下午6:05:37
 */
public class testrectangle {
	public static void main(String[] args) {
		rectangle R=new rectangle(5,9);
	    square S=new square(4,4);
	    R.printMyWay();
	    S.printMyWay(); 

	}

}

运行结果:

矩形长为:5.0
矩形宽为:9.0
矩形面积为:45.0
矩形周长为:28.0
下面为正方形
正方形的边长为:4.0
正方形面积为:16.0
正方形周长为:16.0
正方形对角线为:5.656854249492381





 

猜你喜欢

转载自blog.csdn.net/boy_of_god/article/details/79918091