一:前言

   最近由于面试了新浪公司,面试官问我的问题我都不知道,觉得自己好菜,所以最近决定再把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);
}

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

 package thinker;
public class ConstrutsDemo01 {
public String a;
public void find(){
System.out.println("我的测试端");
} public ConstrutsDemo01(){
this("5");
} public ConstrutsDemo01(String a){
this.a=a;
} public static void main(String args[]){
ConstrutsDemo01 c=new ConstrutsDemo01();
ConstrutsDemo01 c2=new ConstrutsDemo01("1");
System.out.println("无参数构造方法"+c.a);
System.out.println("有参数的构造方法"+c2.a);
}
}

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

(二):多态机制的缺陷

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!

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

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

  1. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

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

    Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...

  3. Java基础知识二次学习--第三章 面向对象

    第三章 面向对象   时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...

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

    基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...

  5. Java基础知识二次学习--第六章 常用类

    第六章 常用类   时间:2017年4月26日16:14:49~2017年4月26日16:56:02 章节:06章_01节~06章_06节 视频长度:20:57+1:15+8:44+1:26+11:2 ...

  6. Java基础知识二次学习--第七章 容器

    第七章 容器   时间:2017年4月27日15:08:30 章节:07章01节~07章04节 视频长度:20:21 +12:38 +3:55 +2:57 内容:容器API 心得: Java API ...

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

    第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节  视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 ...

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

    第二章 基础语法与递归补充   时间:2017年4月24日10:39:18 章节:02章_01节,02章_02节 视频长度:49:21 + 15:45 内容:标识符,关键字与数据类型 心得:由字母,下 ...

  9. Java基础知识总结--多态

    面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据,而外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承是 ...

  10. java基础知识(二)

    java的布局管理: borderLayout:则将板块分为东西南北中五个方向,每添加一个组件就要指定组件摆放的方位,放置在东西南北四个方向的组件将贴边放置.当拉大Frame的时候,处在center( ...

随机推荐

  1. 谈谈WPF中的CollectionView与CollectionViewSource (1)

    原文:谈谈WPF中的CollectionView与CollectionViewSource (1) 谈谈WPF中的CollectionView与CollectionViewSource (1)     ...

  2. HDFS伪分布式

    (一).HDFS shell操作 以上已经介绍了如何搭建伪分布式的Hadoop,既然环境已经搭建起来了,那要怎么去操作呢?这就是本节将要介绍的内容: HDFS自带有一些shell命令,通过这些命令我们 ...

  3. BZOJ 3779 重组病毒 LCT+线段树(维护DFS序)

    原题干(由于是权限题我就直接砸出原题干了,要看题意概述的话在下面): Description 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力 ...

  4. 判断python字典中key是否存在的两种方法

    今天来说一下如何判断字典中是否存在某个key,一般有两种通用做法,下面为大家来分别讲解一下: 第一种方法:使用自带函数实现. 在python的字典的属性方法里面有一个has_key()方法,这个方法使 ...

  5. zufe 蓝桥选拔

    https://zufeoj.com/contest.php?cid=1483 问题 A: A 代码: #include <bits/stdc++.h> using namespace s ...

  6. js计算当前日期上一个月和下一个月

    /**         * 获取上一个月         *         * @date 格式为yyyy-mm-dd的日期,如:2014-01-25         */        funct ...

  7. 【Python】- 如何使用Visual Studio 2013编写python?

    安装Visual Studio 2013 1.VS2013下载安装略 安装python2.7 1.从官网下载python2.7,下载地址:https://www.python.org/getit/  ...

  8. Maven中mirrors和repository的关系

    一.前言 之前没有搞清楚pom.xml里面配置的repositorys节点配置的仓库和mirrors里面配置的仓库的“镜像”间的关系,特意去搜索了相关内容,这边有篇文章讲得透彻,所以这边转载一下~ 二 ...

  9. 【bzoj2957】楼房重建 分块+二分查找

    题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子.为了简化问题,我们考虑这些事件发生在一个二 ...

  10. hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...