荐 Java自学笔记3
第十一章 继承
一、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