一:多态问题

class Father
{
public void hello()
{
System.out.println("Father says hello.");
}
} public class Child extends Father
{
int age=;
static int number=; public void hello()
{
System.out.println("Child says hello");
} public static void main(String[] a)
{
Child foo = new Child();
//foo.hello();
Father foo2 = (Father) foo;  //Father foo2 = foo;是可以的,父类指针指向子类对象
//foo2.hello(); Child foo3 = (Child) foo2;  //Child foo3 = foo2;直接转换是不能编译通过的,只有使用强制转换(前提foo2本来就是子类转换来的)
//foo3.hello();
System.out.println(foo==foo2);
System.out.println(foo==foo3);
}
}
true
true
无论父类指针还是子类指针,指向的都是该内存区域的起始地址。对于函数调用。可以认为同C++中虚函数表一样去寻找函数入口地址解析执行

二:初值问题,以及null类型输出null

下面代码的运行结果为:()

public class Foo {
static String s; public static void main (String[]args) {
System.out.println ("s=" + s);
}
}
A.代码得到编译,并输出“s=”

B.代码得到编译,并输出“s=null”  

C.由于String s没有初始化,代码不能编译通过

D.代码得到编译,但捕获到 NullPointException异常
String类型数据默认null,空。但是输出时可以输出null。

Java String是如何输出NULL的

主要在于print方法的实现,println方法是print和newline方法一起达到目的的,看源码可以发现
print方法内部,当判断为空时,则赋值一个null字符串给变量,然后输出
对于申明的变量是一个非String类型的Object时,打印还是null
其原因还是print方法的另一个不同类型参数的重载实现,其内部会将该对应的转换成字符串,然后print方法内部,当判断为空时,则赋值一个null字符串给变量,然后输出
对于不同类型的其他变量,打印输出也大致是这个思路,然后打印出null
    public void print(String s) {
write(String.valueOf(s));
}
    public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

三:main主函数

java中的main方法必须有一个外壳类。
当一个类中有main()方法,执行命令“java 类名”则会启动虚拟机执行该类中的main方法。
由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要是限制为public static。
由于main入口函数与外壳类的关系只是借用,且不需要实例化该类,所以,可以在抽象类中实现该main函数
Given:

abstract class Bar {
public int getNum() {
return ;
}
} public abstract class AbstractTest {
public int getNum() {
return ;
} public static void main(String[] args) {
AbstractTest t = new AbstractTest() {
public int getNum() {
return ;
}
}; Bar f = new Bar() {
public int getNum() {
return ;
}
};
System.out.println(f.getNum() + " " + t.getNum());
}
} What is the result?
A. 

B. 

C. 

D.An exception occurs

四:类嵌套(父类/子类成员变量相同时的调用)《重点》

现有:
class Tree { private static String tree = "tree"; String getTree() {
return tree;
}
} public class Elm extends Tree {
private static String tree = "elm"; public static void main(String[] args) {
new Elm().go(new Tree());
} void go(Tree t) {
String s = t.getTree() + Elm.tree + tree + (new Elm().getTree());
System.out.println(s);
}
}
A.elmelmelmelm

B.treeelmelmelm

C.treeelmelmtree

D.treeelmtreeelm

注意:(同C++一样)

只有方法重写覆盖,没有成员变量覆盖,当子类和父类出现一样的成员变量名时,会在内存中出现两个不同内存分别存放。
至于最后取谁的数据,取决于调用的该成员变量的方法是属于子类还是父类的!!,也取决于指针是父类指针还是子类指针

五:父类/子类成员变量相同时的调用-->取决于指针是父类还是子类

请问以下代码的输出是什么:
class A {
public static int x = ; public static void printX() {
System.out.print(x);
}
} public class Elm extends A {
public int x = ; public static void main(String[] args) {
A a = new Elm();  //父类指针,自然是指向父类变量x
printX();
System.out.print("和");
System.out.print(a.x);  //这个方法
}
}
A.10和20

B.20和10

C.10和10

D.20和20

补充:普通成员变量和方法重写《重点》

class Father{
public String name="ld"; public void say() {
System.out.println(name+" father");
}
} class Child extends Father{
public String name="ldson"; public void say() {
System.out.println(name+" son");
}
} public class Test{ public static void main(String[] args) {
Father f=new Child();
System.out.println(f.name);  //虽然子类和父类都有相同的成员变量,但是对于成员变量,并不会进行覆盖,而是并存
f.say();  //输出ldson son,可以知道,方法重写后,在子类的内存空间中不会存在父类的方法say
}
}

六:对象类型转换

类 Teacher 和 Student 是类 Person 的子类;

  Teacher t;

  Student s;

  // t and s are all non-null.

  if (t instanceof Person ){ s=(Student)t; }

最后一条语句的结果是:
A.将构造一个Student 对象;

B.表达式是合法的;

C.表达式是错误的;

D.编译时正确, 但运行时错误。
if判断没有问题,肯定是true,只是类型强制转换不能向这样转,只能在一个继承层次上由子类向父类强制转型。
class People{

}

class Teacher extends People{

}

class Student extends People{

}

public class Elm{

    public static void main(String[] args) {
Teacher t=new Teacher();
Student s=new Student();
if(t instanceof People) {
s=(Student)t; //Cannot cast from Teacher to Student
}
}
}

子类向父类强转是允许的

public class Elm{

    public static void main(String[] args) {
Teacher t=new Teacher();
Student s=new Student();
People p=new People();
if(t instanceof People) {
p=(People)t;
}
}
}

父类向子类强转是编译可以通过,但是运行报错

public class Elm{

    public static void main(String[] args) {
Teacher t=new Teacher();
Student s=new Student();
People p=new People();
if(t instanceof People) {
t = (Teacher)p;
}
}
}

JAVA核心技术I---JAVA基础知识(知识回顾)的更多相关文章

  1. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  2. Java核心技术 卷1 基础知识-第一天

    基本数据类型 java是一种强数据类的的语言 共有8种基本数据类型 其中: 整型4种 int(4字节) short(2字节) long(8字节) byte(1字节) java中整型的范围与机器无关 长 ...

  3. Java中的框架基础面试知识

    spring mvc 工作机制(原理): DispatcherServlet主要用作职责调度工作,本身主要用于控制流程 Spring mvc运行原理 1.springmvc将所有的请求都提交给Disp ...

  4. java线程的一些基础小知识

    --------------------------------------------------------------------------------------------------线程 ...

  5. Java核心技术(Java白皮书)卷Ⅰ 第一章 Java程序设计概述

    第1章 Java程序设计概述1.1 Java程序设计平台 具有令人赏心悦目的语法和易于理解的语言,与其他许多优秀语言一样,Java满足这些要求. 可移植性 垃圾收集 提供大型的库  如果想要有奇特的绘 ...

  6. 一种公认提供toString的方法_JAVA核心技术卷轴Ⅰ

    从JAVA核心技术卷轴Ⅰ:基础知识中整理得到. import java.lang.reflect.AccessibleObject; import java.lang.reflect.Array; i ...

  7. java核心技术(第十版卷一)笔记(纯干货!)

    这是我读过的第三本关于java基础的书.第一本<<java从入门到精通>>这本书让我灵识初开.第二本<<java敏捷开发>>这本书则是有一次被一位师傅批 ...

  8. java核心技术卷一

    java核心技术卷一 java基础类型 整型 数据类型 字节数 取值范围 int 4 +_2^4*8-1 short 2 +_2^2*8-1 long 8 +_2^8*8-1 byte 1 -128- ...

  9. JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)

    一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...

  10. JAVA核心技术I---JAVA基础知识(static关键字)

    一:static特殊关键字用处 –变量 –方法 –类 –匿名方法 二:静态变量:类共有成员 –static变量只依赖于类存在(通过类即可访问),不依赖于对象实例存在. –所有的对象实例,对于静态变量都 ...

随机推荐

  1. linux缺失gcc的安装方法

    linux安装gcc操作 1.查看linux是否有gcc文件 这个是没有挂载的 2. 使用df,查看系统光盘的挂载位置 3.卸载分区 umount /dev/sr0 4.将redhat系统光盘重新载入 ...

  2. BZOJ4477[Jsoi2015]字符串树——可持久化trie树

    题目描述 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子.[问题描述]字符串树本质上还是一棵树,即N个节点N ...

  3. BZOJ3812 主旋律(状压dp+容斥原理)

    设f[S]为S点集是SCC的方案数.考虑通过去掉不合法方案转移.可以枚举入度为0的SCC所含点集S',这样显然S^S'内部的边和由S'连向S^S'的边删还是不删任选.但是这样无法保证S'包含所有入度为 ...

  4. CodeForces615B-Longtail Hedgehog-dp/图

    记忆化数组记录从这个点的最长下降序列,然后乘以这个点的度,就是ans,维护即可. #include <cstdio> #include <cstring> #include & ...

  5. ecplise properties文件 中文转码

    1.安装插件 2.重开ecplise 3.在项目的乱码文件如jeesite.properties右键 openwith propertiesEditor 就可以看到中文了 输入 proedit 安装完 ...

  6. 怎么让 Lua 5.3.4 支持中文变量名和中文函数名

    1. 在官网下载最新版Lua源码 Lua :Download 2. 解压后进入目录,找到/src/llex.c,打开修改 找到如下内容 修改为下面代码,并保存. default: { if (lisl ...

  7. 【模板】可持久化文艺平衡树-可持久化treap

    题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...

  8. 用keras实现基本的图像分类任务

    数据集介绍 fashion mnist数据集是mnist的进阶版本,有10种对应的结果 训练集有60000个,每一个都是28*28的图像,每一个对应一个标签(0-9)表示 测试集有10000个 代码 ...

  9. 20165223《Java程序设计》第七周Java学习总结

    教材学习内容总结 第11章-JDBC与MySQL数据库 要点 MySQL数据库管理系统 连接MySQL数据库 查询操作(基础) 更新.添加.删除(基础) 预处理语句(重点) 通用查询(难点) 事务 笔 ...

  10. Python3 与 C# 基础语法对比(String专栏)

      Code:https://github.com/lotapp/BaseCode 多图旧排版:https://www.cnblogs.com/dunitian/p/9119986.html 在线编程 ...