父类中声明子类对象变量,导致栈溢出

今天,我学习Java的时候,做了一个扑克牌小游戏,主要的功能就是计算机和玩家出牌比大小。

但是,在创建一个扑克牌Poker类的时候,我遇到了一个问题,我创建了两个Poker的子类,分别是用来存放玩家扑克牌的PlayPoker类,和用来存放电脑扑克牌的ComputerPoker,当我在Poker类里面声明了两个对象,分别是:

ComputerPoker cPoker = new ComputerPoker();
        PlayerPoker pPoker = new PlayerPoker();

然后我在mian函数,生成一个Poker类的对象,并且执行的时候:

Poker poker = new Poker();

控制台Console显示出现错误,我一看,吓我一跳,出现了一堆错误:

Exception in thread "main" java.lang.StackOverflowError
 at sun.misc.Unsafe.compareAndSwapLong(Native Method)
 at java.util.concurrent.atomic.AtomicLong.compareAndSet(Unknown Source)
 at java.util.Random.seedUniquifier(Unknown Source)
 at java.util.Random.<init>(Unknown Source)
 at pack8_扑克牌.ComputerPoker.<init>(ComputerPoker.java:8)
 at pack8_扑克牌.Poker.<init>(Poker.java:22)
 at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_扑克牌.Poker.<init>(Poker.java:23)
 at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_扑克牌.Poker.<init>(Poker.java:23)
 at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_扑克牌.Poker.<init>(Poker.java:23)
 at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_扑克牌.Poker.<init>(Poker.java:23)
 at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_扑克牌.Poker.<init>(Poker.java:23)

......

发现是StackOverflowError错误,也就是常说的栈溢出,我就纳闷了,怎么会栈溢出,我就上网百度了一下,发现说是因为内存不够,可以通过在Eclipse中JDK的配置中加上 -XX:MaxDirectMemorySize=128,因为默认的jvm内存是64,我们可以改成128或者256,然后我就去找jdk,但是我突然又想想,我就做了个完全只有几个类的小游戏,怎么会内存不够,那我以后做大一些的游戏,那还了得。

于是,我又认真地看了显示的错误信息,我发现这两处错误

at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
    at pack8_扑克牌.Poker.<init>(Poker.java:23)

总是在不断的出现,一直循环到错误结束,这是只有无限递归的时候才会出现的问题,然后我在查看PlayPoker这个类的时候,发现了问题,PlayPoker这个类继承了Poker类,但是我在Poker类里面声明并创建了PlayPoker对象,我想起了我们林老师曾经说的,new子类出来的对象,里面其实包含了父类的所有非私有成员变量及方法,但是这个Poker父类里面却又有一个子类PlayPoker对象,而这PlayPoker

对象又包含了其Poker父类的所有非私有成员变量及方法。。。,这是不是看起来像是递归,所以就造成死循环,这是我学习Java其中这发现的一个不经意间的问题,希望能给Java初学者一些帮助。

时间: 2024-08-09 02:02:02

父类中声明子类对象变量,导致栈溢出的相关文章

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

验证当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

结果:当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行.

java父类引用指向子类对象

父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new Cat(); 即声明的是父类,实际指向的是子类的一个对象. 那这么使用的优点是什么,为什么要这么用?可以用这几个关键词来概括:多态.动态链接,向上转型 也有人说这是面向接口编程,可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关

关于父类引用指向子类对象

例如: 有以下2个类 public class Father { public int age = 70; public static string name = "父亲"; } public class Son : Father { public int age = 30; public static string name = "儿子"; } Father f=new Son(); 这种用法叫做“父类引用指向子类对象,或者叫“父类指针指向子类对象”,指的是定义一

【转】父类引用指向子类对象

父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new Cat(); 即声明的是父类,实际指向的是子类的一个对象. 那这么使用的优点是什么,为什么要这么用?可以用这几个关键词来概括:多态.动态链接,向上转型 也有人说这是面向接口编程,可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关

父类引用指向子类对象

1 public class Test { 2 /** 3 * 对于多态,可以总结它为: 4 5 一.使用父类类型的引用指向子类的对象: 6 7 二.该引用只能调用父类中定义的方法和变量: 8 9 三.如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法:(动态连接.动态调用) 10 11 四.变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错. 12 13 多态的3个必要条件: 14 15 1.继承 2.重写

理解父类引用指向子类对象

java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解. 但当我这样定义时:   Animal a = new Cat(); 这代表什么意思呢? 很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象.由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向C

java多态,如何理解父类引用指向子类对象

摘录 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解. 但当我这样定义时:   Animal a = new Cat(); 表示定义了一个Animal类型的引用,指向新建的Cat类型的对象.由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的. 那么这样做有什么意义呢?因为子类是对父类的一个改进

父类引用指向子类对象--面向对象的多态

先上代码 package com.fuzi.demo; public class FuZi { public static void main(String[] args) { FuLei fuLei = new ZiLei(); fuLei.print_info(); } } class FuLei { public void print_info() { System.out.println("父类的print_info"); System.out.println(this.get