案例1.

package cn.itcast.oop;

public class ThisDemo {
public static void main(String[] args) {
Student s=new Student();
s.setName("李卫康");
s.setAge(22);
String name=s.getName();
int age=s.getAge();
System.out.println("学生的姓名是:"+name+" 学生的年龄是:"+age);
}
}
class Student{
private String name;
private int age;
public String getName() {
return name;//这里默认省略了this,实际上是this.name
}
public void setName(String name) {
name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
age = age;
}
}

这段代码非常简单,可是非常easy出错!出错的关键点就在于this.

执行结果:

为什么会这样呢?为什么打印结果不是-->学生的姓名是:李卫康 学生的年龄是:22

案例2.

package cn.itcast.oop;

public class StudentDemo {
public static void main(String[] args) {
Person s=new Person();
}
}
class Person{
private String name="林青霞";
private int age=27;
public Person(){
name="刘毅";
age=30;
} }

Person s=new Person();做了哪些事情

A:把Student.class文件载入到内存

B:在栈内存中给s变量开辟一个空间

C:在堆内存中为人类对象申请一个空间

D:给成员便令进行默认初始化.null 0

E:给成员变量进行显示 初始化。林青霞,27

F:通过构造方法给成员变量进行初始化 刘毅。30

G:数据初始化完成,然后把堆内存的地址值赋值给栈内存的s变量

3.继承概述

A:java仅仅支持类的单继承不支持类的多继承

B:子类仅仅能继承父类全部非私有的成员(成员方法和成员变量)

C:子类不能继承父类的构造方法,可是能够通过super(立即讲)keyword去訪问父类构造方法。

D:子类中的成员变量和父类中的成员变量名称一样,

在子类方法中訪问一个变量的查找顺序:

a:在子类方法的局部范围找,有就使用

b:在子类的成员范围找,有就使用

c:在父类的成员范围找,有就使用

d:假设还找不到。就报错。

E:this代表本类相应的引用。super代表父类存储空间的标识(能够理解为父类引用,能够操作父类的成员)

F:继承中构造方法的关系

子类中全部的构造方法默认都会訪问父类中空參数的构造方法:由于子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完毕父类数据的初始化。

注意:子类每个构造方法的第一条语句默认都是:super();

G:假设父类没有无參构造方法,那么子类的构造方法会出现什么现象呢?报错。

怎样解决呢?

1):在父类中加一个无參构造方法

2):通过使用superkeyword去显示的调用父类的带參构造方法

3):子类通过this去调用本类的其它构造方法,子类中一定要有一个去訪问了父类的构造方法,否则父类数据就没有初始化。

注意事项:

this(...)或者super(...)必须出如今第一条语句上。

假设不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。

H:继承中成员方法的关系:1):子类中的方法和父类中的方法声明不一样,这个太简单。2):子类中的方法和父类中的方法声明一样,这个该怎么玩呢?

通过子类对象调用方法:

a:先找子类中。看有没有这种方法,有就使用

b:再看父类中,有没有这种方法。有就使用


c:假设没有就报错。

I:方法重写的注意事项

1):父类中私有方法不能被重写-->由于父类私有方法子类根本就无法继承

2):子类重写父类方法时。訪问权限不能更低-->最好就一致

3):父类静态方法,子类也必须通过静态方法进行重写

事实上这个算不上方法重写。可是现象确实如此,至于为什么算不上方法重写,多态中我会讲

子类重写父类方法的时候,最好声明一模一样。

例题:

class Fu {
static {
System.out.println("静态代码块Fu");
} {
System.out.println("构造代码块Fu");
} public Fu() {
System.out.println("构造方法Fu");
}
} class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
} {
System.out.println("构造代码块Zi");
} public Zi() {
System.out.println("构造方法Zi");
}
} class ExtendsTest2 {
public static void main(String[] args) {
Zi z = new Zi();
Zi z2 = new Zi();
}
}

运行结果:

看程序写结果:

A:一个类的静态代码块,构造代码块,构造方法的运行流程

静态代码块 > 构造代码块 > 构造方法

B:静态的内容是随着类的载入而载入

静态代码块的内容会优先运行

C:子类初始化之前先会进行父类的初始化

结果是:

静态代码块Fu

静态代码块Zi

构造代码块Fu

构造方法Fu

构造代码块Zi

构造方法Zi

经典面试题:

class X {

	X() {
System.out.print("X");
}
Y b = new Y();
} class Y {
Y() {
System.out.print("Y");
}
} public class Z extends X { Z() {
//super
System.out.print("Z");
}
Y y = new Y();
public static void main(String[] args) {
new Z();
}
}

记住一句话:先初始化父类数据,再初始化子类数据

因此运行流程为:依据初始化的顺序:先默认初始化,显示初始化,构造初始化

1.先初始化父类class X:运行成员变量显示初始化Y y=new Y();因此调用Y的构造函数打印Y

2.父类的构造方法初始化,运行构造方法中的代码打印X

3.子类进行初始化Class Z:运行成员变量初始化Y y=new Y()因此调用Y的构造方法打印Y

4.子类的构造方法初始化:运行构造方法中的代码打印Z

结果为:YXYZ

debug模式:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

案例:

package cn.itcast.extend;

public class Demo {
public static void main(String[] args) {
Zi z=new Zi();
z.show();
}
}
class Fu{
int num=10;
public void show(){
System.out.println(num);
}
}
class Zi extends Fu{
int num=20;
public void show(){
System.out.println(num);
}
}

结果是毋容置疑的:20

去掉子类的show方法

package cn.itcast.extend;

public class Demo {
public static void main(String[] args) {
Zi z=new Zi();
z.show();
}
}
class Fu{
int num=10;
public void show(){
System.out.println(num);
}
}
class Zi extends Fu{
int num=20;
}

答案是:10

为什么呢:由于子类中找方法show()没有找到就去父类中找.

JavaSE 最easy出错的几个简单的问题的更多相关文章

  1. java几个easy出错的小程序

    把基本知识过了一遍,发现了几个自己easy 出错的小程序,记录下来.. .. 1.关于try-catch异常 2,JAVA中的自省机制 3.有继承关系的类中静态函数 1,关于try-catch异常 p ...

  2. POJ 2826 An Easy Problem?!(线段交点+简单计算)

    Description It's raining outside. Farmer Johnson's bull Ben wants some rain to water his flowers. Be ...

  3. 自己动手写处理器之第一阶段(3)——MIPS32指令集架构简单介绍

    将陆续上传本人写的新书<自己动手写处理器>(尚未出版).今天是第四篇.我尽量每周四篇 1.4 MIPS32指令集架构简单介绍 本书设计的处理器遵循MIPS32 Release 1架构,所以 ...

  4. Sharpui企业版-简单介绍【01】 【QQ群:206378966】

    1. 什么是Sharpui         Sharpui是居于DUI思想的一套界面引擎,採用纯c++开发,实现完整的消息处理机制.渲染引擎分离以及灵活的控件扩展,是一款c++真正意义上的界面和业务逻 ...

  5. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...

  6. 使用hadoop命令rcc生成Record 一个简单的方法来实现自己的定义writable对象

    hadoop 的bin文件夹以下一个rcc命令,网上介绍非常少.看了一下源代码.发现能够用来生成 java和c++的hadoop Record 类代码,比起自己直接实现writable 接口.简单非常 ...

  7. Android ImageLoader(Android-Universal-Image-Loader)【1】概述及使用简单介绍

     Android ImageLoader(Android-Universal-Image-Loader)[1]概述及使用简单介绍 一,前言:为什么要引入Android-Universal-Imag ...

  8. Auto Layout深入理解,及masonry简单介绍

    本篇博客是本人在学习自己主动布局过程中对自己主动布局的理解和整理,分三部分介绍,内容可能会有所反复.见谅. 一.autosizing与Auto Layout对照,及Auto Layout简单介绍 1. ...

  9. Android 通过反射让SQlite建表如此简单

    我们通常使用SQlite的时候,假设我们有10张表,我们要写10个建表语句.而建表语句中仅仅有一些字段的名字须要改而已,这样既费时又费力,还easy出错.我们知道写sql语句的时候常常会写错,假设写错 ...

随机推荐

  1. getElementsByName使用

    查了下手册,getElementsByName()不能提取没有name属性的标签.div标签本身没有name属性,所以不能被提取.有name标签的主要是各种input标签,所以默认情况下getElem ...

  2. java的重载总结

    1.不能以返回值的不同来重载方法,编译都不通过(只有参数类型或者参数个数不同才可以重载方法) 在Java语言中,要重载一个方法,除了要与原方法具有相同的简单名称外,还要求必须拥有一个与原方法不同的(不 ...

  3. python课程设计笔记(三)turtle绘图库(海龟库)

    实例:绘制一条蟒蛇 #turtle:绘图库(海龟库) import turtle turtle.setup(650,350,200,200) turtle.penup() turtle.fd(-250 ...

  4. jquery 获取及设置input各种类型的值

    获取选中的值 获取一组radio被选中项的值 var item = $(“input[@name=items]:checked”).val(); 获取select被选中项的文本 var item = ...

  5. myslide探索

    最近查一些国内学术牛人的报告时,注意到myslide是个很好的平台,比如山大一个老师的报告,完全可以在上面看到 https://myslide.cn/slides/10774 又比如交大一个大牛老师关 ...

  6. UWP App Services in Windows 10

    1.AppServices in Universal Windows Platform(UWP) UWP 应用服务可以提供给另一个UWP应用.在Win10系统中,一个应用服务当作应用的一个方法和机制来 ...

  7. 搞不懂的算法-排序篇<2>

    上一篇排序算法<1>中,排序算法的时间复杂度从N2到NlgN变化,但他们都有一个共同的特点,基于比较和交换数组中的元素来实现排序,我们称这些排序算法为比较排序算法.对于比较排序算法,所有的 ...

  8. Dynamics CRM 使用 Profiler 来做debug

    首先,我们需要install Profiler 我们选中一个plugin, 并且选择start Profilling 然后我们选择Persist to Entity 然后我们执行trigger这个pl ...

  9. SaltStact自动化运维工具03

    存储位置   类型      采集方式                 场景Grains    minion        静态    minion启动时,可以刷新    1.获取信息 2.匹配pil ...

  10. SaltStact自动化运维工具01

     什么是saltstackSaltstack是基于python开发的一套C/S架构配置管理工具使用SSL证书签方的方式进行认证管理底层使用ZeroMQ消息队列pub/sub方式通信    – 号称世界 ...