Java基础_基础语法知识7
面向对象
1.使用java提供的帮助文档
使用java提供的jdk帮助文档。(演示)
(1).如何使用帮助文档
A:打开帮助文档
B: 点击显示,找到索引,找到输入框。
C: 知道你要找哪一个?如Scanner()键盘输入,如Math()
D: 看是在哪一个包下面
如果说是在java.lang包下面的类不需要导入(如:math()),别的包都需要导入。
如:Scanner-->import java.util.Scanner;
E: 再简单的看类的解释和说明,注意看这一个类的版本。
F: 在看类的组成
成员变量 字段摘要
构造方法 构造方法摘要
成员方法 方法摘要,注意看参数传入
G: 学习构造方法
有构造方法 就创建对象,调用方法
没有构造方法 成员都有可能是静态的
H: 看成员方法
左边:
是否是静态的:如果是静态的,那么就可以使用类名直接调用该方法
查看返回值类型:需要使用什么来接受,那么就用什么来接受
右边:
看方法名:方法不要写错
参数列表:需要传入什么就给什么传入。
2.代码块
(1).什么是代码块
在java语言中,使用{}括起来的代码被称为代码块,按照其声明和位置的不同,可以分为局部代码,构造代码块,静态代码块
同步代码块。
(2).局部代码块以及其特点
A:在方法中出现
B:一般用于限定变量的生命周期,以及提前释放资源,提高代码使用率。
(3).构造代码块
A:出现位置是类中方法外。
B:在构造方法之前执行
(4).静态代码块
A:静态代码块加了修饰符static
B:一般用于给这一个类初始化
C:类在加载的时候就会执行这一个静态代码块,但是仅仅执行一次,一般用于一些初始化一些参数。
(5).代码块相关案例:
public class Test {
static{
System.out.println("Test的静态代码块");
}
{
System.out.println("Test的构造代码块");
}
public Test(){
System.out.println("Test的构造方法");
}
//测试
public static void main(String[] args) {
System.out.println("这是测试方法");
Test ts = new Test();
}
//输出结果:
Test的静态代码块
这是测试方法
Test的构造代码块
Test的构造方法
3.继承
(1).继承概述
多个类中存在相同的属性和行为的时候,将这一些内容抽取到单独的一个类中,这样别的那几个类就不必要在定义了,只需要
继承这一个类就可以了。
(2).继承的定义结构
class 子类名 extends 父类名{}
//单独写的这一个类被称为父类,继承它的这一个类被称为子类。简单的说就是谁继承,谁就是子类。
(3).继承的好处
A:提高了代码的复用性。
B:提高了代码的维护性。
C:让多个类之间有联系,这是多态的前提。
(4).继承的坏处
A:由于继承中让多个类之间有了联系。这样也就增加了类之间的耦合性。
我们开发需要的是:低耦合,高内聚(类之间联系少一点,一个类能够完成的特定功能多一点)
(5).类的继承的特点
A:java中只支持单继承,不支持多继承,也就是一个类只可以有一个父类。
如:public student extends person(){}
B:java中支持多层继承,可以弥补多继承的缺点
如:class A(){}
class B extends A(){}
class c extends B(){}
这一个时候C既有A的特性,又有B的特性,类似于多继承。
(6).继承中的注意事项
A:子类只能够继承父类中的非私有方法成员(成员方法和成员变量)。
B:子类不继承父类的构造方法,但是可以通过关键字super去访问父类的构造方法。
C:不要以为部分功能而是用继承
D:继承的是指体现的是"is a"的关系,也就是说必须是这一个类型中的一员,尽量要具备所有的特征。
如:学生张三 is a Student,那么这一个时候张三是具备所有的学生类的特点的。
(7).继承中成员变量的关系
子类中的成员变量和父类中名称不一样,这一个时候就是各找个的。
子类中的成员变量和父类中名称一样。
这一个时候这个成员变量的查找顺序是:
A:子类方法的局部范围找,有就使用;
B:子类的成员范围内找,有就使用;
C:父类的成员范围内找,有就使用;
D:如果还是没有,那就不找了,报错。
(8).关键字this和super的区别和应用
A:this和super关键字的区别和使用
this:表示的是当前类对象的引用
super:代表的是父类存储空间的表示(也可以认为是父类对象的引用)
B:super和this关键字的基本使用
访问成员变量:
this.成员变量 super.成员变量
访问构造方法
this(...) super(...)
访问成员方法
this.成员方法 super.成员方法
C:super和this关键字的基本代码使用:
//父类
public class Father {
public int num = 10;
}
//子类以及测试
public class Son extends Father{
public int num = 20;
public void Test(){
int num = 30;
System.out.println("num is:"+num);
System.out.println("成员范围内的num:"+this.num);
System.out.println("父类的num:"+super.num);
}
public static void main(String[] args) {
Son s = new Son();
s.Test();
}
}
//输出结果:
num is:30
成员范围内的num:20
父类的num:10
(9).继承中的构造方法
A:继承中的构造方法
子类中的所有构造方法都会默认访问父类中的空仓构造。
为什么?
因为子类会继承父类中的数据,可能还会使用父类中是数据,所以,初始化之前,一定要先完成父类的初始化。
所以,子类构造的每一条语句都是super(),调用父类的空参构造,默认存在;
B:代码体现:
//父类
public class Father {
public Father(){
System.out.println("这是father的无参构造");
}
}
//子类
public class Son extends Father{
public Son(){
System.out.println("son的构造方法");
}
public static void main(String[] args) {
Son s = new Son();
}
}
//输出结果:
这是father的无参构造
son的构造方法
C:继承中构造方法的使用注意事项
如果说父类中没有构造方法,那么这一个时候子类的构造方法会出现什么情况?
出错!!
如何解决?
a:在父类中添加一个相应的构造方法
b:使用super关键字去调用父类的带参构造
c:子类通过this关键字去调用本类的其他构造方法
子类中一定要有一个区访问了父类的构造方法,否则,无法初始化父类的数据。
this()和super一定要放置在第一行。否则会初始化多次。
D:代码体现
public class Father {
public Father(String str){
System.out.println("这是father的无参构造");
}
}
public class Son extends Father{
public Son(){
//不用super会报错
super("");
System.out.println("son的构造方法");
}
public Son(String str){
//不用super和this()会报错
//this()的实质就是调用了无参的构造,同时会调用father的构造
this();
//super("");
System.out.println("带参构造");
}
public static void main(String[] args) {
Son s = new Son();
}
}
(10).继承中成员方法的关系
如果说父类方法和子类方法名称不一样,那么就是各找个的。
如果说父类方法和子类方法名称一样。
如果说使用子类对象去访问一个方法,首先在子类方法中去查找,有就使用
然后再去父类中去找,有就使用,
如果都没有,那么就报错
(11).方法重写在继承中的应用
什么是方法重写?
方法重写就是子类中出现了和父类方法名称一样的方法声明,也被称为方法覆盖。
使用特点:
如果说方法名称不同,那么就是各用各的。
如果说方法名称相同,那么最终使用的还是子类自己写的方法。
什么时候使用方法重写?
当子类需要使用父类的功能,而子类自己又需要添加一些逻辑关系的时候,我们就可以考虑使用方法重写。
这样父类中的方法特点,我们通过集成就可以获得,同时又可以添加子类自己的逻辑在里面。
代码实现:
public class Father {
public void sign(String str){
System.out.println(str+"有个小油肚");
}
}
public class Son extends Father{
public void sign(String str){
super.sign(str);
System.out.println(str+"爱吃肉");
}
public static void main(String[] args) {
Son s = new Son();
s.sign("小明");
}
}
//输出结果:
小明有个小油肚
小明爱吃肉
方法重写使用注意事项:
父类中的私有方法不可以被重写,这是父类中自己特有的方法,是不会遗传给儿子的。
子类中重写父类方法的时候,访问权限不能够被父类的低(父亲很抠,儿子不可以更抠)。
父类中的静态方法,子类中也必须通过静态方法来重写(特殊)
(12)方法重写和方法重载
方法重写:
英文标识:Override
表示含义:在子类中,出现和父类中一模一样的方法声明的现象。(俩个类)
方法重载:
英文标识:Overload
表示含义:在同一个类中,出现方法名相同,而参数列表不一样的方法声明的现象。(同一个类)