java基础知识(二)-----多态和构造函数

  一:前言

   最近由于面试了新浪公司,面试官问我的问题我都不知道,觉得自己好菜,所以最近决定再把java基础给搞一遍,真的觉得自己好菜。每天看一点,那个家伙说《java编程思想》最少要看三遍,我一遍都没看完。现在每次都写写自己的最新指导的知识点吧。努力!!!刚刚在一个群上说了下这,别人给我说了句话“你要提醒自己,所有的技术别人能学会的你迟早能学会,没什么大不了的”。记住

  二:内容

  (1):关于构造方法的问题

    我们每次写一个类中,都会说在类中加一个无参数的构造方法,我时常在想,这个无参数的构造函数有什么用,我一直很困惑,但是现在我可能明白了一点吧,由于那次看了下ArrayList的源码我才明白点,先上了ArrayList代码看看

  

 /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param   initialCapacity   the initial capacity of the list
     * @exception IllegalArgumentException if the specified initial capacity
     *            is negative
     */
    public ArrayList(int initialCapacity) {
    super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
    this.elementData = new Object[initialCapacity];
    }

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
    this(10);
    }

我自己也写了个测试了下如下:

 1 package thinker;
 2 public class ConstrutsDemo01 {
 3     public String a;
 4     public void find(){
 5         System.out.println("我的测试端");
 6     }
 7
 8     public ConstrutsDemo01(){
 9         this("5");
10     }
11
12     public ConstrutsDemo01(String a){
13         this.a=a;
14     }
15
16     public static void main(String args[]){
17         ConstrutsDemo01 c=new ConstrutsDemo01();
18         ConstrutsDemo01 c2=new ConstrutsDemo01("1");
19         System.out.println("无参数构造方法"+c.a);
20         System.out.println("有参数的构造方法"+c2.a);
21     }
22 }

这里给我的答案是,通过构造方使得我们既可以在实例化时传递参数,也可以不传递参数。好处显而易见吧。不知道这是不是需要构造函数的好处了!

(二):多态机制的缺陷

B:对于私有的方法无法覆盖,如下代码

 1 package thinker;
 2
 3 public class Animal {
 4     private void fun(){
 5         System.out.println("我是动物的总称");
 6     }
 7     public static void main(String[] args) {
 8         Animal a=new Dog();
 9         a.fun();//结果是“我是动物的总称”
10     }
11 }
12
13
14 package thinker;
15
16 public class Dog extends Animal {
17     public void fun(){
18         System.out.println("动物:狗狗");
19     }
20
21 }

所以我们得到的结论是“对于私有的方法我们没办法进行覆盖操作”

B:多态的域域静态方法

  其实我也一样,刚刚了解多态的时候我也觉得,比如子类和父类中都有的相同变量那么如果调用这个变量,是否是和方法一样,调用得是子类的这个变量值了。显而我错了,只有普通的方法调用可以是多态的。如果你直接访问某个域,这个访问域就将在编译期进行解析如下:

package thinker;

public class Animal {
    public String name="动物";
    public void fun(String name){
        System.out.println("我是动物的总称"+name);
    }

}
package thinker;

public class Dog extends Animal {
    public String name="猫";
    public void fun(String name){
        System.out.println("动物:"+name);
    }

    public String getName(){
        return super.name;
    }

    public static void main(String[] args) {
        Animal a=new Dog();
        Dog d=new Dog();
        System.out.println(a.name);//打印结果“动物”
        System.out.println("父类的name:"+d.getName()+"--子类的:"+d.name);//打印结果“父类的name:动物--子类的:猫”
    }
}

在《java编程思想》中是这样写的:“当Dog对象转型为Animal引用时,任何域访问操作都将由编译器解析,因此不是多态的”

在说有关静态的方法:如果某个方法是静态的,它的行为就不具有多态性:

package thinker;

public class Animal {
    public String name="动物";
    public static void fun(String name){
        System.out.println("我是动物的总称:"+name);
    }
    public void fprint(){
        System.out.println("父类:非静态的类");
    }

}
package thinker;

public class Dog extends Animal {
    public String name="猫";
    public static void fun(String name){
        System.out.println("动物:"+name);
    }
    public void fprint(){
        System.out.println("子类:非静态的类");
    }
    public static void main(String[] args) {
        Animal a=new Dog();
        a.fun("mouse");//结果“我是动物的总称mouse”
        a.fprint();//结果“子类:非静态的类”
    }
}

由此可以看出我们的fun()是静态的,调用打印的结果也是父类的方法,而fprint()方法是非静态的,调用打印结果是子类方法。可得:

如果某个方法是静态的,则它的行为就不具有多态性

三:有关实例化顺序

package org.duotai;

public class Computer {
    private int i=1;

    public void find(){
        System.out.println("Computer find()");
    }

    public Computer() {
        System.out.println("Computer find() be");
        System.out.println("构造方法"+i);
        find();//这里调用得其实是子类的方法,然而此时子类的数据(即i)还未实例化,所以在打印出的数据位0
        System.out.println("Computer find() af");
    }

}

package org.duotai;
public class CPU  extends Computer{
    private int i=5;

    public CPU(int i){
        this.i=i;
        System.out.println("构造方法CPU.i="+i);
    }

    public void find(){
        System.out.println("方法CPU.i="+i);//由于此时未实例化所以值为0
    }
}

package org.duotai;
public class DTDemo01 {
    public static void main(String args[]){
        new CPU(2);//调用
    }
}

在这里我们打印出的结果是:

Computer find() be
构造方法1
方法CPU.i=0
Computer find() af
构造方法CPU.i=2

可以看到“方法CPU.i=0”,所以我们得到,在父类实例化时调用方法,由于子类中的数据还未实例化,造成此种情况。

实例化顺序:自己断点运行了下,发现在父类构造时还是先去初始化定义的变量,再来执行的构造方法内的内容。

*******************************************

姓名:耗子

名言:机会都是留给有准备的人,GO!

******************************************

时间: 2024-10-27 19:07:59

java基础知识(二)-----多态和构造函数的相关文章

Java基础十二--多态是成员的特点

Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println(f.num);//是父类,答案是3 2,成员函数(非静态). 编译看左边,运行看右边. 因为成员函数存在覆盖特性. Fu f = new Zi();//f.show();输出的是子类里面的show方法 3,静态函数. 编译和运行都看左边. 静态函数不具备多态性,多态性是对象的多态性,然后静态函数不涉

Java基础知识(二)

1,字符串 new String("abc")创建了几个对象? 一个或两个,如果常量池中原来有"abc",则只创建一个对象:如果常量池中原来没有字符串"abc",那么就会创建两个对象. String s="abc"; String s1="ab"+"c"; System.out.println(s==s1); 输出 true ,因为"ab"+"c"

Java基础知识二次学习-- 第一章 java基础

基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一章  JAVA简介 时间:2017年4月24日10:23:32 章节:01章_02节 内容:jdk的配置与安装 完成情况:已经完成,cmd中javac提示出相关命令 时间:2017年4月24日10:30:39 章节:01章_04节 内容:输出HelloWorld 完成情况: 已经完成 javac先将

Java 基础知识(二)之面向对象技术

1.    面向对象与面向过程的区别 面向对象把数据及对数据的操作方法放在一起,作为一个互相依存的整体,即对象.对同类对象抽象出其共性,即类,类中的大多数数据,只能被本类的方法进行处理.类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信.程序流程由用户在使用中决定. 面向过程是一种以事件为中心的开发方法,就是自顶向下顺序执行,逐步求精,其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构,各模块之间的关系也比较简单,在功能上相对独立,每一模块内部一般是由顺序.选择

Java基础知识二次学习-- 第二章 基础语法与递归补充

第二章 基础语法与递归补充   时间:2017年4月24日10:39:18 章节:02章_01节,02章_02节 视频长度:49:21 + 15:45 内容:标识符,关键字与数据类型 心得:由字母,下划线,$,数字组成,应该由字母,下划线$开头,同时应该避开java保留字符 变量是内存中的一小块区域,使用变量名来访问这块区域 执行过程中的内存管理(疑问:这里的内存和Jvm的一样吗?) code segment 存放代码 data segment 静态变量 字符串常量 stack 栈 局部变量 h

Java基础知识二次学习--第五章 数组

第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节  视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 栈里面存的数组的引用 实际对象在堆内存里面 (C与C++是分配在栈里的) 内存图: 元素为引用数据类型的数组 引用类型的数组如上图 时间:2017年4月26日15:16:22~2017年4月26日15:19:00 章节:05章_02节  视频长度:05:25 内容:数组元素的创建与使用 心得: 首

Java基础知识二次学习--第四章 异常

第四章 异常处理 时间:2017年4月26日11:16:39~2017年4月26日11:28:58 章节:04章_01节 04章_02节 视频长度:20:46+01:16 内容:异常的概念 心得: Java异常是JAVA提供的用于处理程序中错误的一种机制 实在运行的过程中发生的一些异常事件(比如除0溢出,数组越界,要读取的文件不存在) 设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果 JAVA程序的执行过程中 如果出现异常事件,可以生成异

Java基础知识二次学习--第八章 流

第八章 流   时间:2017年4月28日11:03:07~2017年4月28日11:41:54 章节:08章_01节 视频长度:21:15 内容:IO初步 心得: 所有的流在java.io包里面 定义了多个流类型(类或抽象类)来实现输入/输出功能 可以从不同的角度对其进行分类 按数据流的方向不同可以分为输入流和输出流 按处理数据单位不同可以分为字节流和字符流 按照功能不同可以分为节点流和处理流 jdk中所提供的的所有流类型位于包Java.io内都分别继承自以下四种抽象流类型 输入流 Input

java基础知识(二)

1.关于static关键字总结: 1.不能在static修饰的方法中引用this变量,只能引用一些静态变量或方法,或new新的对象(可以定义局部变量). 简言之,静态方法或块中,只能引用静态的方法或变量. 2.类中的成员变量(static修饰)有缺省值,而类的定义的方法中的局部变量没有缺省值. 3.在类的构造器中,可以引用任何的静态或非静态的变量和方法,可以在非static方法中调用static方法. 4.static{}块中的代码在类装载中仅执行一次. 5.在7-7,A staticmetho

沉淀,再出发:Java基础知识汇总

沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的语法,对象的定义,类.接口.继承.静态.动态.重载.覆盖这些基本的概念和使用方法,到稍微高级一点的多线程,文件读写,网络编程,GUI使用,再到之后的反射机制.序列化.与数据库的结合等高级一点的用法,最后将设计模式应用其中,产生了一个个新的概念,比如Spring.Spring MVC.Hibernat