目录
1、super关键字与this关键字的区别
2、static关键字
3、Java的三要素:封装、继承、多态
4、抽象
5、接口
6、抽象类与接口的区别
7、内部类
8、四种权限修饰符
super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)
super和this的用法相似:
1、this代表对象的引用(谁调用就代表谁);
2、super代表当前子类对父类的引用。
2、static关键字
1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来
2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来
3、static修饰的对象,生命周期跟类相同,在类创建时同时static对象也被创建。
3、Java的三要素:封装、继承、多态
封装:
在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装的优点:
1. 良好的封装能够减少耦合。
2. 类内部的结构可以自由修改。
3. 可以对成员变量进行更精确的控制。
4. 隐藏信息,实现细节。
封装步骤:
1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:
public class Person { private String name; private int age; } //将 name 和 age 属性设置为私有的,只能本类才能访问 //其他类都访问不了,如此就对信息进行了隐藏。
2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
public class Person{ private String name; private int age; public int getAge(){ return age; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public void setName(String name){ this.name = name; } }
采用this关键字是为了解决实例变量和局部变量之间发生的同名的冲突。
继承:
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
子类可以直接访问父类中的非私有的属性和行为。
通过 extends 关键字让类与类之间产生继承关系。
class SubDemo extends Demo{} //SubDemo是子类,Demo是父类
继承的好处:
- 提高代码的复用性。
- 让类与类之间产生了关系,是多态的前提。
Java继承的特点:
- Java只支持单继承,不支持多继承。
- Java支持多层继承。
使用继承时的注意事项:
如果类之间存在着:is a 的关系,就可以考虑使用继承。
不要为了继承部分功能,而去使用继承。
方法的重写:
子类中出现与父类一模一样的方法时(除了权限修饰符,权限修饰符大于等于不包括private,返回值类型,方法名和参数列表相同),会出现覆盖操作。
父类私有方法,子类无法继承,也就无法重写。
多态:
概念:
对象在不同时刻表现出来的不同状态。
多态的前提:
- 要有继承或者实现关系。
- 要有方法的重写。
- 要有父类引用指向子类对象。
好处和作用:
多态的存在提高了程序的扩展性和后期可维护性。弊端:
无法调用子类特有的功能。
多态的成员特点:
成员变量:编译和运行都看等号左边。
成员方法:编译看左边运行看右边。
静态方法:编译时期:编译和运行都看等号左边。
一定不能够将父类的对象转换成子类类型!
父类的引用指向子类对象,该引用可以被提升,也可以被强制转换。
多态自始至终都是子类对象在变化!
4、抽象
抽象就是从多个事物中将共性的,本质的内容抽象出来。
抽象类:
Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
抽象类特点:
- 抽象方法一定在抽象类中;
- 抽象方法和抽象类都必须被abstract关键字修饰;
- 抽象类不可以用new创建对象,因为调用抽象方法没意义;
- 抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用; 如果子类只覆盖了部分的抽象方法,那么该子类还是一个抽象类;
- 抽象类中可以有抽象方法,也可以有非抽象方法,抽象方法用于子类实例化;
- 如果一个类是抽象类,那么,继承它的子类,要么是抽象类,要么重写所有抽象方法。
特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。抽象类的成员特点:
- 成员变量:可以是变量,也可以是常量;
- 构造方法:有构造方法;
- 成员方法:可以是抽象方法,也可以是非抽象方法。
抽象关键字abstract不可以和哪些关键字共存?
- final:如果方法被抽象,就需要被覆盖,而final是不可以被覆盖,所以冲突。
- private:如果函数被私有了,子类无法直接访问。
- static:不需要对象,类名就可以调用抽象方法,那么调用抽象方法就失去了意义。
5、接口
接口是抽象方法和常量值的集合。
格式:interface 接口名{}
实现(implements)
格式:class 类名 implements 接口名 {}
接口的出现将"多继承"通过另一种形式体现出来,即"多实现"。
特点:
- 接口不能被实例化。
- 一个类如果实现了接口,要么是抽象类,要么实现接口中的所有方法。
接口的成员特点:
接口中的成员修饰符是固定的!
- 成员常量:public static final,接口里定义的变量是全局常量,而且修饰符只能是这三个关键字,都可以省略,常量名要大写。
- 成员方法:public abstract,接口里定义的方法都是抽象的,两个修饰符关键字可省略。
接口的思想特点:
- 接口是对外暴露的规则;
- 接口是程序的功能扩展;
- 接口的出现降低耦合性;(实现了模块化开发,定义好规则,每个人实现自己的模块,大大提高了开发效率)
- 接口可以用来多实现;
- 多个无关的类可以实现同一个接口;
- 一个类可以实现多个相互直接没有关系的接口;
- 与继承关系类似,接口与实现类之间存在多态性。
6、抽象类与接口的区别
成员变量
- 抽象类能有变量也可以有常量
- 接口只能有常量
成员方法
- 抽象类可以有非抽象的方法,也可以有抽象的方法
- 接口只能有抽象的方法
构造方法
-抽象类有构造方法
-接口没有构造方法类与抽象类和接口的关系
- 类与抽象类的关系是继承 extends
- 类与接口的关系是实现 implements
7、内部类
将一个类定义在另一个类里面,里面的那个类就称为内部类。内部类的出现,再次打破了Java单继承的局限性。
访问特点:
- 内部类可以直接访问外部类的成员,包括私有成员。
- 外部类要访问内部类的成员,必须要建立内部类的对象。
内部类分类及共性:共性:
- 内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
- 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
成员内部类
在外部类中有成员变量和成员方法,成员内部类就是把整个一个类作为了外部类的成员;
成员内部类是定义在类中方法外的类;
创建对象的格式为:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
成员内部类之所以可以直接访问外部类的成员,那是因为内部类中都持有一个外部类对象的引用:外部类名.this;
成员内部类可以用的修饰符有final,abstract,public,private,protected,static.静态内部类
静态内部类就是成员内部类加上静态修饰符static,定义在类中方法外。
在外部类中访问静态内部类有两种场景:
- 在外部类中访问静态内部类中非静态成员:*外部类名.内部类名 对象名 = 外部类名.内部对象*,需要通过创建对象访问;
- 在外部类中访问静态内部类中的静态成员:同样可以使用上面的格式进行访问,也可以直接使用外部类名.内部类名.成员。
局部内部类
局部内部类是定义在方法中的类。
- 方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
- 方法内部类对象不能使用该内部类所在方法的非final局部变量。
可以用于方法内部类的修饰符有final,abstract;
静态方法中的方法内部类只能访问外部的静态成员。
匿名内部类
匿名内部类是内部类的简化写法,是建立一个带内容的外部类或者接口的子类匿名对象。
前提:
内部类可以继承或实现一个外部类或者接口。
格式:
new 外部类名或者接口名(){重写方法};