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( ...
随机推荐
- 从装机到配置-CentOS6.5
L006课程结束后的总结 首先:系统(cat /etc/redhat-release):CentOS release 6.5 (Final) 版本(uname -r):2.6.32-431.el6.x ...
- GDB抓虫之旅(上篇)
本文来自网易云社区. 作者:盛国存 前言 问: gdb是什么? 答: 强大的UNIX下命令行调试工具. 问: gdb能干什么? 答: 让你随心所欲的驾驭你的程序:Start.Stop.Examine. ...
- 代码混淆 iOS
该方法只能针对有.m.h的类进行混淆,静态库等只有.h文件的没法进行混淆 代码混淆,刚刚看到是不是有点懵逼,反正我是最近才接触到这么个东西,因为之前对于代码和APP,只需要实现功能就好了,根本没有考虑 ...
- Qt Qwdget 汽车仪表知识点拆解2 图像放大
先贴上效果图,注意,没有写逻辑,都是乱动的 这里讲下 这个小汽车的进入过程,其实这个说白了就没有技术含量了,本来应该趁着这个机会学习一下Qt的动画机制,不过随机一想,这个自己写也累不到那里去 下面说下 ...
- Git 使用 粗糙记录
版本控制应该是每一个开发人员应该会的东西,奈何,学校没有学习,随着写代码的时间的加长,越来月觉得版本控制的必要性了. 记得在实习的公司,同一痛的都是SVN. 至于GIt和SVN的区别,直接看连接 ht ...
- 实用的placeholder插件,兼容IE下的placeholder,jquery插件
placeholder在IE下无法兼容 ,下面的插件很好的处理了这个问题,拿去不谢 /* * jQuery placeholder, fix for IE6,7,8,9 * @website itmy ...
- 数据结构(python语言)目录链接
第一章 准备工作 课时0:0.数据结构(python语言) 基本概念 算法的代价及度量!!!
- 九度OJ--Q1167
import java.util.Scanner;import java.util.TreeSet; /* * 题目描述: * 输入一个数组的值,求出各个值从小到大排序后的次序. * 输入: * 输入 ...
- android http
在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端.它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET ...
- 【iOS开发】initWithNibName、initWithCoder、awakeFromNib和 loadNibNamed详解
第一.initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 第二.initWithCoder 是一个类在IB中创建但 ...