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);
}
我自己也写了个测试了下如下:
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基础知识(二)-----多态和构造函数的更多相关文章
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- Java基础十二--多态是成员的特点
Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...
- Java基础知识二次学习--第三章 面向对象
第三章 面向对象 时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...
- Java基础知识二次学习-- 第一章 java基础
基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...
- 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 ...
- Java基础知识二次学习--第七章 容器
第七章 容器 时间:2017年4月27日15:08:30 章节:07章01节~07章04节 视频长度:20:21 +12:38 +3:55 +2:57 内容:容器API 心得: Java API ...
- Java基础知识二次学习--第五章 数组
第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节 视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 ...
- Java基础知识二次学习-- 第二章 基础语法与递归补充
第二章 基础语法与递归补充 时间:2017年4月24日10:39:18 章节:02章_01节,02章_02节 视频长度:49:21 + 15:45 内容:标识符,关键字与数据类型 心得:由字母,下 ...
- Java基础知识总结--多态
面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据,而外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承是 ...
- java基础知识(二)
java的布局管理: borderLayout:则将板块分为东西南北中五个方向,每添加一个组件就要指定组件摆放的方位,放置在东西南北四个方向的组件将贴边放置.当拉大Frame的时候,处在center( ...
随机推荐
- 谈谈WPF中的CollectionView与CollectionViewSource (1)
原文:谈谈WPF中的CollectionView与CollectionViewSource (1) 谈谈WPF中的CollectionView与CollectionViewSource (1) ...
- HDFS伪分布式
(一).HDFS shell操作 以上已经介绍了如何搭建伪分布式的Hadoop,既然环境已经搭建起来了,那要怎么去操作呢?这就是本节将要介绍的内容: HDFS自带有一些shell命令,通过这些命令我们 ...
- BZOJ 3779 重组病毒 LCT+线段树(维护DFS序)
原题干(由于是权限题我就直接砸出原题干了,要看题意概述的话在下面): Description 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力 ...
- 判断python字典中key是否存在的两种方法
今天来说一下如何判断字典中是否存在某个key,一般有两种通用做法,下面为大家来分别讲解一下: 第一种方法:使用自带函数实现. 在python的字典的属性方法里面有一个has_key()方法,这个方法使 ...
- zufe 蓝桥选拔
https://zufeoj.com/contest.php?cid=1483 问题 A: A 代码: #include <bits/stdc++.h> using namespace s ...
- js计算当前日期上一个月和下一个月
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ funct ...
- 【Python】- 如何使用Visual Studio 2013编写python?
安装Visual Studio 2013 1.VS2013下载安装略 安装python2.7 1.从官网下载python2.7,下载地址:https://www.python.org/getit/ ...
- Maven中mirrors和repository的关系
一.前言 之前没有搞清楚pom.xml里面配置的repositorys节点配置的仓库和mirrors里面配置的仓库的“镜像”间的关系,特意去搜索了相关内容,这边有篇文章讲得透彻,所以这边转载一下~ 二 ...
- 【bzoj2957】楼房重建 分块+二分查找
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子.为了简化问题,我们考虑这些事件发生在一个二 ...
- hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...