`

java类的构造与父子类之间的转换问题

阅读更多
package com.zhao.impl;
public interface RideCar {
	public void CanRideCar();
}


package com.zhao.impl;
public interface RidePlane {
		public void CanRidePlane();
}


package com.zhao.impl;
abstract public class Person {
	public String name;
	public int age;
	static 
	{
		//无用abstract 声明为抽象类的话就会执行并左最先
		System.out.println("Person's static block");
	}
	public Person()
	{
		name = "adult";
		age = 18;
		System.out.println("Person's default construction");
	}
	public Person(String name,int age)
	{
		//有this()的话就会调用自己的默认构造成方法
		//this();
		this.name=name;
		this.age=age;
		System.out.println("Person's seft construction");
	}
}


package com.zhao.impl;
import com.zhao.impl.Person;
import com.zhao.impl.RideCar;
public class Father extends Person implements RideCar {
	static public int spfi = 1;
	static public int spfi2 = spMethod();
	static public int spfi3;
	static 
	{
		spfi3=111;
		System.out.println("Father's static block");
	}
	public int pfi = 3;
	public int pfi2 = pMethod();
	public int pfi3;
	{
		pfi3=333;
		System.out.println("Father's instance block");
	}
	
	public Father() {
		//super();
		System.out.println("Father's default construction");
	}
	public Father(String name,int age)
	{
		super(name,age);
		System.out.println("Father's seft construction");
	}

	public void CanRideCar() {
		System.out.println("Father can ride a car");

	}
	
	private static int spMethod() {
		System.out.println("Father's static Method");
		return 11;
	}
	private int pMethod() {
		System.out.println("Father's instance Method");
		return 33;
	}

}


package com.zhao.impl;
public class Child extends Father implements RidePlane {
	static public int spci = 2;
	static public int spci2 = spMethod();
	static public int spci3;
	static 
	{
		spci3=222;
		System.out.println("Child's static block");
	}
	
	public int pci = 4;
	public int pci2 = pMethod();
	public int pci3;
	{
		pci3=444;
		System.out.println("Child's instance block");
	}
	
	public Child() {
		//有没有super()都会调用父类的默认构造方法
		//super(); 
		System.out.println("Child's default construction");
	}
	public Child(String name,int age) {
		//不能再有super();或this();
		//原因:constructor call must be the first statement in the constructor
		//super(name,age);就不会调用父类的默认构造方法而调父类两参数的构造方法
		super(name,age);
		System.out.println("Child's self construction");
	}

	public void CanRidePlane() {
		System.out.println("Child can ride a plane");

	}

	private static int spMethod() {
		System.out.println("Child's static Method");
		return 22;
	}
	private int pMethod() {
		System.out.println("Child's instance Method");
		return 44;
	}
}


package com.zhao.test;
import com.zhao.impl.Child;
import com.zhao.impl.Father;
import com.zhao.impl.Person;
import com.zhao.impl.RideCar;
public class TestClass {
	public static void main(String[] args) {

		Child c;
		System.out.println("program start");   
		System.out.println("Child's spci:"+Child.spci);
		c = new Child("zhao",24);
		c.CanRidePlane();
		System.out.println("program end");
		
		System.out.println("second program start");
		Father d; //Child d; 显示是一样的
		d = new Child();
		System.out.println("second program end");
	}
}


program start
Person's static block
Father's static Method
Father's static block
Child's static Method
Child's static block
Child's spci:2
Person's seft construction
Father's instance Method
Father's instance block
Father's seft construction
Child's instance Method
Child's instance block
Child's self construction
Child can ride a plane
program end
second program start
Person's default construction
Father's instance Method
Father's instance block
Father's default construction
Child's instance Method
Child's instance block
Child's default construction
second program end


package com.zhao.test;
import com.zhao.impl.Child;
import com.zhao.impl.Father;
import com.zhao.impl.Person;
import com.zhao.impl.RideCar;
public class TestClass2 {
	public static void main(String[] args) {
		Person p;
		Father f;
		Child c;
		
		f = new Child();
		System.out.println("f的class:"+f.getClass());
		//f是Child类型
		//不把f强调转换成Child类型是无Child类型的属性和方法的,
		//尽管它是用Child的构造器建起,但它的类型是Father
		System.out.println(((Child)f).pci);
		c = new Child("zhao",24);
		System.out.println(c.name+","+c.age);
		p=f;
		System.out.println(p.name+","+p.age);
		System.out.println(f.name+","+f.age);
		f = c;
		System.out.println(f.name+","+f.age);
		
		// c= p 不能通过编译
		//总结,子类变量可以赋值给父类变量,反之不行。
		//如人是父类,程序员是子类,程序员可赋值给人,是因为所有程序员都是人。
		//人不能赋赋值程序员,因为所有人不是全部是程序员,还有医生,老师~~~
		
		RideCar rc = new Child();
		rc.CanRideCar();
		System.out.println(rc.getClass());
		System.out.println(((Child)rc).name);
		System.out.println(((Father)rc).name);
		
		Father fa = new Father();
		//System.out.println(((Child)fa).name);
		//不能所fa强调转换成Child,因为它本身是father
		Child ch = new Child("zhao",120);
		System.out.println(((Father)ch).name);
		//子类程序员可以强制转换成父类人的原因是,子类有父类的所有属性,
		//反之不能,是因为父类无子类的所有属性。
	}
}


f的class:class com.zhao.impl.Child
4
zhao,24
adult,18
adult,18
zhao,24
class com.zhao.impl.Child
adult
adult
zhao



总结:
一.
1.有没有super()都会调用父类的默认构造方法
2.super();this();super(name,age);这些调用构造器的语句只能用一个.原因:
  constructor call must be the first statement in the constructor
  用了super(name,age);就不会调用父类的默认构造方法而调父类两参数的构造方法
3.用abstract 声明为抽象类的话,好像static块就不执行.
4.Father d = new Child(); 和Child d = new Child();输出结果是一样的.
二.
1.赋值,子类变量可以赋值给父类变量,反之不行。
2.强制转换,子类变量可以强制转换成父类.
3.实际类型,用了什么类的构造成器构造,实际类型就是什么,如Father d = new Child();  ,d的实际上就是Child类型.RideCar rc = new Child(); ,rc实际上也是Child类型.
分享到:
评论

相关推荐

    java版list-map实现 树结构 父子结构 通俗易懂

    此java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!

    父子类接口实验

    8. **父子类转换**:在Java中,一个子类对象可以被强制转换为父类类型,但需要注意的是,父类引用只能调用父类的方法,不能调用子类特有的方法。在本实验中,虽然没有直接展示转换操作,但在实际应用中,这种转换...

    基于java涉及父子类的异常详解

    本文将详细解析Java中父子类之间的异常处理规则。 1. 子类构造函数与父类构造函数的异常处理 Java中的构造函数并不受到覆盖方法的异常限制。这意味着子类构造函数可以抛出任何类型的异常,而不必考虑父类构造函数...

    Java中类的生命周期.doc

    类加载器之间存在父子关系,但这种关系不是Java类的继承关系,而是一种层次结构,允许子加载器委托父加载器完成加载任务。这种机制有助于保护程序的安全性和稳定性。 #### 五、总结 了解Java中类的生命周期对于...

    Java 将有父子关系的数据转换成树形结构数据

    一、数据库父子结构数据设计  大部分采用 parentId的形式来存储父id,并且只存储父id,祖父Id不存储。也可以添加存储层级级别或者层级关系等字段。 CREATE TABLE `t_resource` ( `id` varchar(255) NOT NULL ...

    父子节点获取

    3. **工具类设计**:可以创建一个`TreeUtil`工具类,提供静态方法如`buildTree(List<Node> nodes)`,该方法接收一个包含所有节点的列表,然后按照上述逻辑构造出树形结构。 4. **实现类**:如果需要更复杂的功能,...

    list转树状结构通用工具类

    在这个问题中,我们通常有一个扁平化的数据列表,其中每个元素代表一个节点,节点之间可能存在父子关系。我们的目标是将这个列表转换为树形结构,这样可以更好地体现数据间的层次关系。 对于非递归方法,我们可以...

    2023年北京圣思园java课堂笔记.doc

    13. **重写与重载的区别**:重载发生在同一类内,重写发生在父子类之间。 14. **多态**:多态性是面向对象的重要特性,允许父类型的引用指向子类对象。这样,可以使用父类型的引用调用子类特有的方法,提供了灵活性...

    21天学通Java-由浅入深

    202 10.3.3 父子类间的构造器的调用流程 204 10.3.4 如何自定义构造器 207 10.4 什么是单子模式 208 10.5 构造器在程序中是何时运行的 211 10.6 综合练习 214 10.7 小结 215 10.8 习题 215 第11章 异常处理(精彩...

    基于JAVA建立树形结构的算法优化.pdf

    树形结构是一种在计算机科学和数据管理中广泛应用的非线性数据结构,它模拟了现实世界中实体之间的层级关系,例如公司的组织结构、计算机文件系统的目录结构等。树形结构在程序设计中极为重要,尤其是在需要展示层级...

    Java-常见面试题.pdf

    1. 不同名子类之间的静态块不会相互调用,也没有任何联系。 2. 不同名子类在创建对象之前,如果父类的静态块没有被调用过,那么就先调用父类静态块,此时再看本子类是不是第一次被加载,如果是,那么接着调用本子类...

    Java中对象序列化与反序列化详解

    1. **默认序列化**:如果一个类只实现了`Serializable`接口,那么Java会自动处理序列化,将类中所有非`transient`和非`static`的字段转换为字节流。 2. **自定义序列化**:如果类实现了`Serializable`接口,并且...

    Java基础知识练习题

    - **问题解析**:Java 中有两种内部类:静态内部类(Static Nested Class)和非静态内部类(Inner Class)。 - **区别**: - **静态内部类**: - 可以拥有静态成员; - 不依赖于外部类的实例; - 访问权限同外部...

    JAVA常用英文

    在Java中,`abstract`关键字不能单独使用于变量、构造器或初始化块,仅能用于类和方法。 ### access 访问控制是Java中一个核心概念,通过`public`、`protected`、`private`和`default`(包级访问)来限定类、方法...

    2015-11-ClassLoaders-Selajev.pdf

    类加载器的设计允许Java应用使用多种类加载器,而这些类加载器之间可能具有父子层级关系。当一个类加载器尝试加载一个类时,它会先委托给其父类加载器来加载,如果父类加载器无法完成加载,子加载器才会尝试自己加载...

    java经典面试题

    - 管道:允许父子进程之间的通信。 - 消息队列:允许发送消息到接收者。 - 信号量:管理多个进程对共享资源的访问。 - 共享内存:允许多个进程共享同一段内存区域。 - 套接字:允许不同进程间的网络通信。 6. ...

    Java面试题全集.docx

    1. 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 2. 继承:继承是从已有类得到继承信息创建新类的过程...

    黑马Java基础口述总结

    - 重写发生在父子类之间,方法名、参数列表和返回类型完全相同。 - 重载发生在同一个类中,方法名相同但参数列表不同。 - **重载能否改变返回值类型**:不可以。 #### 21. static关键字 - **定义**:用于声明静态...

    java面试资料.doc

    - **重写** 父子类间,方法名、参数列表相同,返回值和异常处理需遵循特定规则,运行时决定。 4. **构造器 Constructor** - 构造器不能被重写(override),但可以重载。 - 构造器不能用`static`修饰,只能用`...

Global site tag (gtag.js) - Google Analytics