当前位置: 移动技术网 > IT编程>开发语言>Java > 荐 Java自学笔记3

荐 Java自学笔记3

2020年07月07日  | 移动技术网IT编程  | 我要评论

第十一章 继承

一、extends 继承

在Java语言中,用 extends 来表示两个类的父子关系
public class B extends A
{……}

表示B继承于A(B继承了A)
A: 父类 ( superclass )
B :子类 ( subclass )
下面以文件(MyFile)与视频文件(MyVideoFile)为例来展现继承的用法
父类MyFile

package my;

public class MyFile
{
	public long size; // 文件大小
	public String name; // 文件名
	
	// 显示文件信息
	public void info()
	{
		System.out.println("文件: " + name + ", 大小: " + size);
	}
}

子类(MyVideoFile)

package my;

public class MyVideoFile extends MyFile
{
	// 父类的public成员自动继承
	
	// 添加子类的特性
	public int duration ; // 时长
	
	public void play()
	{
		System.out.println("播放视频"+ this.name);
	}
	
	public void stop()
	{
		System.out.println("停止播放"+ this.name);
	}
}

创建对象并是使用方法

package my;

public class HelloWorld
{

	public static void main(String[] args)
	{

		MyVideoFile f = new MyVideoFile();
		
		f.size = 1293034;  // 从父类MyFile里继承而来的属性
		f.name = "abc.mp4";
		f.duration = 130; // 来自子类
		
		f.info(); // 来自父类
		f.play();
		f.stop();
		
	}
}

父类中的继承来的大部分东西,子类里可以直接使用

继承是一个重要的语法,经常使用,务必掌握!

二、重写

重写 (override) :如果父类的方法不满足要求,则可以在子类里重写一遍。

1、重写时子类可以选择:

(1)完全重写

public class MyVideoFile extends MyFile
{
	// 父类的public成员自动继承
	// 添加子类的特性
	public int duration; // 时长
	public void play()
	{
		System.out.println("播放视频" + this.name);
	}
	public void stop()
	{
		System.out.println("停止播放" + this.name);
	}
	@Override
	public void info()
	{
		System.out.println("文件名: " + this.name
				+ ",大小: " + size
				+ ",时长: " + duration
				);
	}
}

(2)在父类的基础上补充

public class MyVideoFile extends MyFile
{
	// 父类的public成员自动继承
	// 添加子类的特性
	public int duration; // 时长
	public void play()
	{
		System.out.println("播放视频" + this.name);
	}
	public void stop()
	{
		System.out.println("停止播放" + this.name);
	}
	@Override
	public void info()
	{
		super.info();
		System.out.println(",时长: " + duration);
	}

注意:一般情况下可以直接在Eclipse自动添加,不需要手写(重点,能够缩小新手朋友写代码的难度)

这里我们以重写info来当做例子
具体操作如下:
① 先在子类里面右键->Scource->Override…
在这里插入图片描述
②在框内选定想要重写的方法(此处为info())
在这里插入图片描述
③在所给框架内完全重写或是在父类的基础上进行重写
在这里插入图片描述
注:@Override这一行也是有用的,不要删掉

三、构造方法的应用

1、父类的构造方法

我们要知道的是,重写对应的对象是类里面的普通的方法
(1) 而构造方法不能叫重写。事实上我们只需要知道:在创建子类对象时,父类的构造方法会被自动调用。
/////////////////////////////// Parent类 ////////////////////////

package my;

public class Parent
{
	public Parent()
	{
		System.out.println("调用了Parent类的构造方法");
	}
}

///////////////////////////////Child类 ////////////////////////

package my;

public class Child extends Parent
{
	public Child()
	{
		System.out.println("调用了Child类的构造方法");
	}
	
	
}

创造一个对应的对象

package my;

public class HelloWorld
{

	public static void main(String[] args)
	{
		Child child=new Child();
		System.out.println("exit");
	}

}

结果
在这里插入图片描述
**(2)**如果父类有多个构造方法,可以在子类里显示指定用哪个构造方法。
例如:
//////////////////////////// 父类 ///////////////////

package my;

public class Parent
{
	private int a;
	
	public Parent()
	{
		System.out.println("父类的构造...");
	}

	public Parent( int a)
	{
		this.a =a;
	}
}

/////////////////////////// 子类 //////////////////////

package my;

public class Child extends Parent
{
	public Child()
	{
		super ( 123 );
		System.out.println("子类的构造...");		
	}
	
}

四、单根继承

Java语言里,一个类只能extends 一个父类(这个地方与c++不同,在c++中可以进行多继承)

1、继承链

如果A继承于B, B继承于 C, C继承于D,表示为:
A -> B -> C -> D
则当于 B是父亲,C是祖父,D是曾祖父
在eclipse中我们可以通过:鼠标右键-> Quick Type Hierarchy或是ctrl+t来查看继承链

2.Object类

在Java语言里,Object类是所有类的父类
如果一个类没有指定父类,则它默认父类就是Object

例如:
在这里插入图片描述
查看继承链的结果
在这里插入图片描述

3、重写 toString()方法

toString()是Object的一个方法,重写这个方法,可以在调试的时候快速显示对象的值。
例如,给Student类重写toString()方法:

package my;

public class Student
{
	public String id;
	public String name;
	public boolean sex;
	
	@Override
	public String toString()
	{
		String s = "学号: " + id + ", 姓名: " + name ;
		
		if ( sex ) 
		{
			s = s + "(男)";
		}
		else
		{
			s = s + "(女)";
		}
		return s;
	}
}
package my;

public class HelloWorld
{

	public static void main(String[] args)
	{
		Student std = new Student() ;
		std.id = "10086";
		std.name = "徐同学";
		
		System.out.println("完成");
		
	}

}

在调试状态下,观察对象的值的显示格式。
在这里插入图片描述
在debug的时候可以使调试更加方便

五、多态

多态是设计上的一个术语。(polymorphism)在Java里,多态 是指以下语法现象:
① 重载 Overload: 方法允许重名
② 重写 Override:允许子类重写父类的方法
③ 泛型(模板): 以后学习,ArrayList的时候回学到
用一个比喻来说:
Pie: 饼干
ApplePie: 苹果味饼干, 继承于Pie
Baby: 小孩
public class Baby
{
public void eat( Pie p) {} // 宝宝吃饼干
}
Pie p = new ApplePie();//有一块饼干p,是苹果味饼干
Baby bb = new Baby();// 有一个宝宝
bb.eat( p );// 宝宝要吃饼干。苹果味饼干是一种饼干。

1、子类与父类的类型转换

1 子类转成父类顺利成章的(隐式转换)
ApplePie p1 = new ApplePie();
Pie p2 = p1; // 类型转换: ApplePie -> Pie

2 父类型转成子类型要谨慎(初学可以暂时跳过)
ApplePie p3 = (ApplePie) p2; // 显式转换,由于p2(被转换)实际指向的对象类型是ApplePie,所以可以转换

(重点!!!)当调用一个方法时,不是看引用的类型,而是看对象的实际类型。

思考:

MyVideoFile f1 = new MyVideoFile();
	f1.name = "abc.mp4";
	f1.size = 14000;
	f1.duration = 130;		
	MyFile file = f1;
       file.info();    -

调用的是父类的info()还是子类的?
答: file指向的是一个MyVideoFile对象,因而调用的是子类的info()方法。

2、所有对象都是Object

在Java里,由于所有的类型都是Object的直接或间接子类,所以:
Object x = new MyVideoFile();
没问题。

六、关于 toString

在前面,我们知道了
所有的类都继承于 Object
所有的类都可以重写 Object.toString() 方法

我们首先看个例子:

package my;
public class Student
{
	public String id;     // 学号
	public String name;   // 姓名
	public boolean sex;  // 性别
	
	@Override
	public String toString()
	{
		String s = "学号: " + id + ", 姓名: " + name ;		
		if ( sex ) 
		{
			s = s + "(男)";
		}
		else
		{
			s = s + "(女)";
		}
		return s;
	}	
}
Student stu = new Student();
	stu.id = "1008611";
	stu.name = "徐同学";
	stu.sex = true;		
	System.out.println("学生信息: " + stu);

思考:为什么字符串可以和Student对象可以直接拼接?

1、toString

当字符串与Student对象拼接时,等效于:
System.out.println("学生信息: " + stu.toString() );
而其中stu.toString() ,就是将stu对象转成字符串显示。

2、toString() 的默认实现

如果一个类没有重写 toString() ,则使用 Object的默认实现。
演示: 去掉 Student 类的toString() 方法,观察输出,结果如下
在这里插入图片描述

结论: Object.toString() 默认格式为 :类名@对象地址


第十二章 包

一、包

包 ( Package ) : 在Java里用于对Class进行分目录分层管理。实际上,包就是Windows目录结构。

1、新建包 Package

直接输入包的全路径,例如 af.util ,即可创建包

2、类的路径

一个类XXX,对应的文件是XXX.java
类的全路径:af.util.AfMath
对应的文件路径:af/util/AfMath.java
在Eclipse下,右键 Show in | System Explorer

3、新建Class

右键点一个包,在这个包下添加Class
类的第一行表明本类所在的包路径。由Eclipse自动添加。
注:package声明的路径必须与该文件的实际路径一致。(让Eclipse自动完成,不要手写)
eg:package af.util;

4、引入包import

如果要使用别的包下的类,一般有两种写法:

import af.util.AfMath; // 直接指定类的全路径
import af.util.*; // 一次导入该包下的所有类。

让Eclipse自动添加import声明,不要手写。

5、包的显示

在Eclipse里有两种形式显示包:
Flat : 扁平化显示
Hierarchical: 层级显示(树状显示,推荐)

总的来说

package用于按目录的方式组织Class
package声明: 声明本类所在的路径
import声明:导入所需要的类

二、Eclipse的快捷操作(比较好用,博主亲情推荐全部记住)

1、文件的拷贝

Eclipse 与 文件管理器 之间可以互相拷贝。
其中有文件拷贝到Eclipse与 从Eclipse拷贝文件两种操作

2、同步

如果手工修改了文件
Package Explore | 右键 Refresh

3、包名错误

解决方法:鼠标移到提示错误处,按提示项进行修改

4、改名

如果修改包名、类名、方法名、属性名:
①选中对硬的包名、类名、方法名、属性名
② 右键 Refactor | Rename …进行修改

5、其他操作

保存 CTRL + S
注释 CTRL + /
查看定义 CTRL + 鼠标点击
打开提示 ATL + /
格式化选中代码 CTRL + SHIFT + F

通过以上的快捷操作的介绍,希望可以提高每一位读者的开发效率

本文地址:https://blog.csdn.net/qq_45952745/article/details/107143280

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网