java面向对象进阶

1、static

static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量
(1)被static修饰的成员变量,叫做静态变量
	(I)特点:
			被该类所有对象共享
			不属于对象,属于类
			静态变量是随着类的加载而加载的,优先于对象出现的
	(II)调用方式:
			类名调用(推荐)
			对象名调用
	(III)内存图

静态方法内存图

(2)被static修饰的成员方法,叫做静态方法
	(I)特点:
			多用在测试类和工具类中
			Javabean类中很少会用
	(II)调用方式:
			类名调用
			对象名调用
(3)工具类
	帮助我们做一些事情的,但是不描述任何事物的类
		(I)类名见名知意
		(II)私有化构造方法(为了不让外界创建他的对象)
		(III)方法定义为静态
(4)注意事项
	静态方法中没有this关键字
	静态方法中,只能访问静态。
	非静态方法可以访问所有。

在这里插入图片描述

2、继承

(1)什么是继承

Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系。

当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码

(2)使用继承的好处

可以把多个子类中重复的代码抽取到父类中了,提高代码的复用性。

子类可以在父类的基础上,增加其他的功能,使子类更强大。

(3)继承后子类的特点

子类可以得到父类的属性和行为,子类可以使用。

子类可以在父类的基础上新增其他功能,子类更强大

(4)继承的特点

Java只能单继承,不能多继承、但是可以多层继承

Java中所有的类都直接或者间接继承于0bject类

子类只能访问父类中非私有的成员

(5)构造方法的继承

不能被继承

(6)成员变量的继承

可以继承,不可以使用

在这里插入图片描述

(7)成员方法的继承

只可以继承虚方法表的公有方法

在这里插入图片描述
(8)继承中的访问特点

(I)成员变量的访问特点

就近原则:谁离我近,我就用谁

System.out.println(name);从局部位置开始往上找
System.out.println(this.name);从本类成员位置开始往上找
System.out.println(super.name);从父类成员位置开始往上找
在这里插入图片描述(II)成员方法的访问特点

直接调用满足就近原则:谁离我近,我就用谁

super调用,直接访问父类
在这里插入图片描述
(III)构造方法的访问特点

父类中的构造方法不会被子类继承,子类中所有的构造方法默认先访问父类中的无参构造,再执行自己。

子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。

子类不能继承父类的构造方法,但是可以通过super调用

子类构造方法的第一行,有一个默认的super();如果想要方法父类有参构造,必须手动书写。

怎么调用父类构造方法的?

子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行。

如果想调用父类有参构造,必须手动写super进行调用。
在这里插入图片描述
(9)重写

当父类的方法不能满足子类现在的需求时,需要进行方法重写。
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

方法重写注意事项和要求

1.重写方法的名称、形参列表必须与父类中的一致。
2.子类重写父类方法时,访问权限子类必须大于等于父类
3.子类重写父类方法时,返回值类型子类必须小于等于父类
4.建议:重写的方法尽量和父类保持一致
5.只有被添加到虚方法表中的方法才能被重写
6.如果发生了重写,虚方法表会被覆盖

3、多态

(1)什么是多态?

同类型的对象,表现出的不同形态

(2)多态的表现形式

父类类型 对象名称=子类对象;

(3)多态的前提

有继承关系
有父类引用指向子类对象
有方法重写

示例
在这里插入图片描述
(4)多态的好处

使用父类型作为参数,可以接收所有子类对象

(5)多态调用成员的特点

(I)调用成员变量:编译看左边,运行也看左边

编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。

运行也看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值。

(II)调用成员方法:编译看左边,运行看右边

编译看左边:iavac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编详失败。

运行看右边:java运行代码的时候,实际上运行的是子类中的方法。
在这里插入图片描述
在这里插入图片描述
(6)多态的优点

可以接收所有子类对象,体现多态的扩展性与便利。

(7)多态的缺点

不能使用子类的特有功能

解决方案:变成子类类型
在这里插入图片描述
在这里插入图片描述

4、包

(1)包名的规则:公司域名反写+包的作用,需要全部英文小写,见名知意。

(2)使用同一个包中的类时,不需要导包。

(3)使用java.lang包中的类时,不需要导包

(4)其他情况都需要导包

(5)如果同时使用两个包中的同名类,需要用全类名(包名+类名)

5、final

(1)
修饰方法:表明该方法是最终方法,不能被重写

修饰类:表明该类是最终类,不能被继承

修饰变量:叫做常量,只能被赋值一次

(2)常量的命名规范:

(I)单个单词:全部大写

(II)多个单词:全部大写,单词之间用下划线隔开

(III)final修饰的变量是基本类型:那么变量存储的数据值不能发生改变

(VI)final修饰的变量是引用类型,那么变量存储的地址值不能发生改变,对象内部的可以改变

6、权限修饰符和代码块

(1)权限修饰符:是用来控制一个成员能够被访问的范围的。可以修饰成员变量,方法,构造方法,内部类。

(2)有四种作用范围由小到大( private<空着不写<protected<public)
同一个类中
同一个包中
其他类不同包下的子类
不同包下的无关类

(3)
实际开发中,一般只用private和public
成员变量私有
方法公开
特例:如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有。
(4)静态代码块
用于数据初始化,只能初始化一次。
随着类的加载而加载

7、抽象类和抽象方法

强制让子类重写
(1)抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。

(2)抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。

(3)抽象类和抽象方法的注意事项

抽象类不能实例化

抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

可以有构造方法(当创建子类对象的时,给属性进行赋值的)

抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类

8、接口

(1)接口用关键字interface来定义

public interface 接口名 {}

(2)接口和类之间是实现关系,通过implements关键字表示

public class 类名 implements 接口名 {}

(3)接口的子类(实现类)

要么重写接口中的所有抽象方法

要么是抽象类

(4)接口和类的实现关系,可以单实现,也可以多实现。

public class 类名 implements 接口名1,接口名2 {}

(5)实现类还可以在继承一个类的同时实现多个接口。

public class 类名 extends 父类implements 接口名1,接口名2 {}

(6)接口中成员的特点

(I)成员变量

只能是常量
默认修饰符:public static final

(II)构造方法

没有

(III)成员方法

只能是抽象方法
默认修饰符:public abstract

●JDK7以前:接口中只能定义抽象方法。
●JDK8的新特性:接口中可以定义有方法体的方法。
●JDK9的新特性:接口中可以定义私有方法。

(7)接口和接口之间是继承关系,可以单继承,也可以多继承
细节:如果实现类实现了最下面的子接口,那么就需要重写所有的抽象方法

(8)一个类实现了两个接口,接口中有重复的抽象方法,只需要重写一次。

(9)JDK8以后接口新增的方法(默认方法)
(I)允许在接口中定义默认方法,需要使用关键字 default 修饰
作用:解决接口升级的问题

(II)接口中默认方法的定义格式:

格式:public default 返回值类型 方法名(参数列表){}
范例:public default void show(){}

(III)接口中默认方法的注意事项:

默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
public可以省略,default不能省略

如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写

(10)允许在接口中定义定义静态方法,需要用static修饰

接口中静态方法的定义格式:

格式:public static 返回值类型 方法名(参数列表){}
范例:public static void show(){}

静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

(11)JDK9新增的方法

方法可以私有,只为此接口使用
公开私有,静态私有

(12)接口多态
接口类型j= new 实现类对象();
当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。

(13)适配器
当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式。

写中间类XXXAdapter,实现对应的接口,对接口中的抽象方法进行空实现让真正的实现类继承中间类,并重写需要用的方法为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰。

9、内部类

内部类表示的事物是外部类的一部分

内部类单独出现没有任何意义

内部类的访问特点

内部类可以直接访问外部类的成员,包括私有外部类

要访问内部类的成员,必须创建对象
在这里插入图片描述
(1)成员内部类
I、成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static2.在成员内部类里面,JDK16之前不能定义静态变量,JD16开始才可以定义静态变量。

II、获取对象

如果内部类公开
格式:外部类名.内部类名 对象名=外部类对象,内部类对象;
范例:0uter.Inner oi=new uter().new Inner();

如果内部类私有
外部类编写方法,对外提供内部类对象
在这里插入图片描述
外部类成员变量和内部类成员变量重名时,在内部类如何访问?
System.out.println(outer.this.变量名);

(2)静态内部类

静态内部类只能访问外部类中的静态变量和静态方法
如果想要访问非静态的需要创建外部类的对象。
在这里插入图片描述
创建静态内部类对象的格式:
外部类名.内部类名对象名=new 外部类名.内部类名();

调用静态方法的格式:
外部类名.内部类名.方法名();

(3)局部内部类

1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
2.外界是无法直接使用局部内部类,需要在方法内部创建对象并使用。
3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
在这里插入图片描述
在这里插入图片描述
(3)匿名内部类
I、匿名内部类的格式

new 类名或者接口名(){重写方法};

II、使用场景

当方法的参数是接口或者类时以接口为例,可以传递这个接口的实现类对象。
如果实现类只要使用一次,就可以用匿名内部类简化代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值