JavaSE 最easy出错的几个简单的问题

案例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模式:

案例:

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()没有找到就去父类中找.

时间: 2024-11-04 21:30:13

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

JavaSE 最容易出错的几个简单的问题

案例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+"

UVA 11991 Easy Problem from Rujia Liu? 简单STL

题目链接: UVA, 你懂的 题目描述: 给出一串数, 求第几次出现的数字几? 解题思路: 北交集训STL水题 代码: #include <iostream> #include <cstdio> #include <cstring> #include <map> using namespace std; const int MAXN = 1e5 + 7; map<int, int> cnt; map<pair<int, int>

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

1. 什么是Sharpui Sharpui是居于DUI思想的一套界面引擎,採用纯c++开发,实现完整的消息处理机制.渲染引擎分离以及灵活的控件扩展,是一款c++真正意义上的界面和业务逻辑分离的界面引擎. Sharpui通过把界面元素抽象为一个一个单独的绘制单元,然后通过模版的概念把这些绘制单元又一次组合成一个逻辑控件.因此,界面引擎实现最核心的渲染和绘制单元,通过组合得到各种各样的逻辑控件.从而满足不断变化的业务需求,并且.从根本上使得界面的开发简单.高效,业务真正地仅仅关心自己的业务逻辑,至于

AJAX学习整理二之简单实例

做了几个简单的实例,加载txt文本内容.加载xml文件内容,把xml文本内容转换成html表格显示.废话不多说,直接贴代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <head>     <title>通过ajax获取文本内容</title>     <meta charset="utf-8">     <scr

Leet Code OJ 328. Odd Even Linked List [Difficulty: Easy]

题目: Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes. You should try to do it in place. The program should run in O(1) space comp

ContentProvider简单介绍

1.什么是ContentProvider 数据库在Android其中是私有的,当然这些数据包含文件数据和数据库数据以及一些其它类型的数据. 不能将数据库设为WORLD_READABLE,每一个数据库都仅仅能创建它的包訪问, 这意味着仅仅有由创建数据库的进程可訪问它.假设须要在进程间传递数据, 则能够使用AIDL/Binder或创建一个ContentProvider,可是不能跨越进程/包边界直接来使用数据库. 一个Content Provider类实现了一组标准的方法接口,从而可以让其它的应用保存

规则引擎选型及简单应用

规则引擎实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程,使用规则引擎可以把复杂.冗余的业务规则同整个支撑系统分离开,做到架构的可复用移植. 规则引擎的选型应用 相对于业务系统,规则引擎可以认为是一个独立于业务系统的模块,负责一些规则的计算等.一般来说,规则引擎主要应用在下面的场景中: 风控模型配置,风控是规则引擎 用户积分等配置,如日常操作引起积分变化等 简单的离线计算,各类数据量

POJ-3468A Simple Problem with Integers,线段数区间更新查询,代码打了无数次还是会出错~~

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K                Case Time Limit: 2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some gi

自定义控件其实很简单5/12

尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 最近龙体欠安,很多任务都堆着,虽说如此,依然没有停下学习的步伐,虽然偶尔还会有点头痛,但是孤依旧在学习……自赞一个~ 在1/3中我们结束了全部的Paint方法学习还略带地说了下Matri的简单用法,这两节呢,我们将甩掉第二个陌生又熟悉的情妇:Canvas.Canvas从我们该系列教程的第一节起就嘚啵嘚啵个没完没了,几乎每个View都