A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© docwei 中级黑马   /  2016-3-2 22:59  /  789 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.Java中怎么理解“引用”,比如Animal a=new Cat();表示动物类引用指向猫类型对象,引用怎么理解?
2.抽象类的构造函数是为了给子类对象进行初始化的,怎么理解????构造函数不是给本类对象进行初始化的么?
3.怎样才能让其他类不创建本类对象?

14 个回复

倒序浏览
3,是用final修饰吧?
回复 使用道具 举报
看来楼主看视频不仔细,cat是animal的子类,所以可以用父类引用子类对象,就好比你创建了一个cat的对象,但猫也属于动物。2抽象类是不能用来创建对象的,你可以用他的子类来创建对象3只要不是继承关系,其他类肯定不用创建它的对象
回复 使用道具 举报
就是变量,动物类的变量指向了猫类对象
回复 使用道具 举报
小笼包 发表于 2016-3-3 19:17
看来楼主看视频不仔细,cat是animal的子类,所以可以用父类引用子类对象,就好比你创建了一个cat的对象,但 ...

看来是我提的问题,没有说清楚。。。1.我是想说引用怎么理解,,,你却扯别的。。。2.我提的问题,其实是想,接口是不是可以看做特殊的抽象类,为什么接口没有构造函数。。。。3.一定要继承关系,其他类肯定不用创建它的对象???如果某个类想调用另外一个类的方法,一定要继承才行??肯定不是的 啊,只需要创建他的对象就可以了,,,
回复 使用道具 举报
我觉得这些问题很有水平   楼上的不知道就不要乱说
回复 使用道具 举报
qijia004 发表于 2016-3-5 23:01
我觉得这些问题很有水平   楼上的不知道就不要乱说

那你能解答这些问题吗
回复 使用道具 举报
1.引用就相当于指针,及对象在内存中都是有保存地址的,引用的作用就相当于指向对象的内存地址。
回复 使用道具 举报
我先来回答楼主的第一个问题public class Animal {
        public void walk(){
                System.out.println("父类Animal走路");
        }
        public static void main(String[] args) {
                Animal animal = new Dog();//父类对象的引用但是实际指向的是子类
                animal.walk();//调用产生子类的方法
        }
}
//Dog定义了子类
public class Dog extends Animal{
        public void walk(){
                System.out.println("子类Dog走路");
        }
}
java中的多态的实现是因为java是一门动态语言,什么意思呢?楼主应该知道java的反射,但是楼主是否想过这个是怎么实现的,其实两者的实现原理是相同的。因为java是一门后期绑定语言,就是说你的代码虽然定义的是Animal,但是这个对象animal真正的引用时什么是在编译器编译的时候才知道,编译器编译后会将你真正的引用地址付给animal对象,所以直到代码真正运行你的对象才知道自己真正是谁,同样的java的反射也是这样,运行时你还可以对代码进行操作就是这个道理。打个不恰当的比较就是,虽然女人已经怀孕,但是你出生前只能知道小宝宝是个人,不能知道他是男孩还是女孩(不借助外界帮助),只有真正出生了,什么事情都知道了。  不知道我这么说,楼主是否明白。


第二个问题:一个抽象类其本身是无法进行实例化的,那么它的构造方法也就无法用在自身,所以他的构造方法是用来初始化子类的。因为在子类的构造方法中必须要使用super方法调用父类的构造方法,这样就能将父类中必须到一些成员进行初始化,其实也是在初始化子类自身,因为子类继承了父类的成员。


第三个问题:用想让一个类无法被创建,建议可以使用单例模式。例如:
public class Animal {
        private Animal(){} //私有化
        public static Animal getAnimal(){//对外提供专有方法
                return new Animal();
        }
}
这样,想要创建对象就必须使用Animal.getAnimal()进行创建

不知道这样楼主是否已经明白

回复 使用道具 举报
Animal  a = new Cat();
a和new Cat是存储在不同的位置,a是个变量指向new Cat()这个对象,相当于a是个地址指向new Cat()这个对象。所以可以说Animal的引用指向猫的对象(new Cat)
至于父类的的引用Animal a为什么可以指向new cat,你可以看看子类和父类的向上转型和向下转型。cat属于animal的子类,所以Animal的引用可以指向new Cat()猫的对象。父类的引用可以指向子类的引用,子类的引用不可以指向父类的引用,比如Cat c = new Animal();这样是不对的,必须强转。Cat c =(Cat)new Animal();
回复 使用道具 举报
构造函数使用来new对象的,可以给本类用也可以给别的类用,每个类都有一个默认的的构造方法,只是没有写出来。如果没有构造方法就没有办法来new对象。
class Dog{
    //默认的够着方法
   public  dog(){   
   }
  //如果自己定义一个构造方法,向构造方法里传参数,系统就不会有默认的构造方法,淡然你也可以吧默认的构造方法写出来
  public dog(int  num){
  }

}
这样你在本类,或者别的类中Dog dd = new Dog(2);就得传参数。不传参数回报编译错误。如果有默认的构造函数就可以直接new Dog(),而不用传参数。直接说就是构造方法就是用来new 对象的。如果构造方法私有了就不能让外界new 对象了,只能在本类中new 对象了。
回复 使用道具 举报
基础班刚刚第7天。。表示看不懂
回复 使用道具 举报

你那个生孩子的例子很有趣,让我想起了薛定谔
回复 使用道具 举报
docwei 发表于 2016-3-6 23:51
你那个生孩子的例子很有趣,让我想起了薛定谔

楼主能明白意思就行
回复 使用道具 举报
对于第三个问题,我是有解得,,,,1,私有化构造函数+静态修饰成员方法,2.将类抽象化
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马