1 类和对象的理解
- 类是同一类事物的抽象描述,有点像模板。
- 对象是对这一类事物的个体实例化。
2 接口和多态理解
- 接口就是一些方法特征的集合(接口是对抽象的抽象)
- 类对这些特征集合(接口)的不同实现方式即为多态
Tips:接口在程序开发过程中是对对象的功能提供扩展,定义时需要interface关键字,抽象类是对一类事物的抽象归类,该类中方法功能声明相同,但方法功能主体不同,是对。定义时需要abstract关键字
3 继承的好处
- 提高了代码的复用性,节省维护成本
- 继承的出现让类与类之间产生了关系,提供了多态的前提
Tips:在Java中只有单继承和多实现,没有多继承(指的是一个类只能有一个直接父类,并不表示不能多层级继承)
4 继承中变量和方法的特点
1.0 子父类成员变量的特点
父类中的成员变量是非私有的,子类中可以直接访问,若父 类中的成员变量私有了,子类是不能直接访问的。
子父类出现同名变量时在子类中可以通过super.父类属性和方法,通过this关键字区别子类自身的同名变量。
2.0 子父类成员方法的特点
优先使用子类方法,子类没有就使用父类,如果出现同名方法就会出现方法重写
方法重写注意事项:子类的方法权限(public,default,protected,private)必须高于父类才行,否则编译报错。
5 抽象类定义,特点
定义:抽象类是Java类中的一种,他是在Java类的基础上对类中的方法进行深度提取,对类中的方法共性只提取出方法声明,不对方法的主体内容进行操作。是对一类事物的共性方法声明,不是对共性方法功能描述。
- 抽象类不可以直接创建对象
- 抽象类和抽象方法都必须有abstract关键字声明
- 只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象
6 接口的概念,用法,特点
概念:接口是抽象类的抽象,是功能的集合,在程序开发过程中主要是为对象提供扩展功能。
定义:
public interface <interface_name>{
abstract methods1(){}
abstract methods1(){}
}
Tips:
接口中的方法均为公共访问的抽象方法,接口中无法定义普通的成员变量,但是可以是public static final <var_type> <var_name>,所以接口中的变量也是常量,子类必须实现接口中所有方法才能实例化。
实现
class <class_name> implements <interface_name>(){
OverRide interface's methods;
}
在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写所有抽象方法,完成具体的逻辑。
7 多态
Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值,多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
多态成员方法的注意事项:
当子父类中出现同名的成员方法时,编译时期:参考引用变量所属的类,如果fulei类中没有调用的方法,编译失败。运行时期:参考引用变量所指的对象(子类)所属的类,并运行对象所属类中的成员方法。简而言之:编译看左边,运行看右边。
多态成员变量的注意事项:
当子父类中出现同名的成员变量时,多态调用该变量时:编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。运行时期:也是调用引用型变量所属的类中的成员变量。简单记:编译和运行都参考等号的左边。编译运行看左边。
多态转型
向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,
父类类型 变量名 = new 子类类型();多态本身就是向下转型。
向下转型: 一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,
子类类型 变量名 = (子类类型) 父类类型的变量;
多态转型的好处与弊端:当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型。向上转型的好处是隐藏了子类类型,提高了代码的扩展性。但向上转型也有弊端,只能使用父类共性的内容,而无法使用子类特有功能,功能有限制。
当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。当要使用子类特有功能时,就需要使用向下转型(这里在多态中的方法使用上记得看懂 “多态成员变量的注意事项”)
8 封装、继承、多态的作用
- 封装:把对象的属性与方法的实现细节隐藏,仅对外提供一些公共的访问方式
- 继承:子类会自动拥有父类所有可继承的属性和方法。
- 多态:配合继承与方法重写提高了代码的复用性与扩展性;如果没有方法重写,则多态同样没有意义。
9 this关键字在多个构造函数之间的相互调用
除了构造函数的相互调用之外,this关键字还可以区别局部变量和成员变量 this关键字在Java构造函数之间的调用.png10 super关键字在子父类之间的使用
调用本类中的构造方法
this(实参列表);
调用父类中的空参数构造方法
super();
调用父类中的有参数构造方法
super(实参列表);
Tips:如果子类的构造方法第一行写了this调用了本类其他构造方法,那么默认的super调用父类的语句是不会默认存在的,因为this()或者super(),只能定义在构造方法的第一行,因为初始化动作要先执行。
类中的构造方法默认第一行都有隐式的super()语句,在访问父类中的空参数构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以给自己的子类对象初始化。
如果默认的隐式super()语句在父类中没有对应的构造方法,那么必须在构造方法中通过this或者super的形式明确要调用的构造方法。
注意事项:
-
super: 指的是父类的存储空间(理解为父类的引用)
调用父类的成员变量:
super.成员变量;
调用父类的构造方法:
super(参数);
调用方法的成员方法:
super.成员方法(); -
继承中的构造方法注意事项:
1.如果我们手动给出了构造方法,编译器不会在给我们提供默认的空参数构造方法, 如果我们没写任何的构造方法,编译器提供给我们一个空参数构造方法- 在构造方法中,默认的第一条语句为 super();
它是用来访问父类中的空参数构造方法,进行父类成员的初始化操作 - 当父类中没有空参数构造方法的时候,怎么办?
a: 通过 super(参数) 访问父类有参数的构造方法
b: 通过 this(参数) 访问本类中其他构造方法
注意:[本类中的其他构造方法已经能够正常访问父类构造方法] - super(参数) 与 this(参数) 不能同时在构造方法中存在
- 在构造方法中,默认的第一条语句为 super();
11 final&static关键字的特点
- final&static关键字的特点
- final修饰的类不可以被继承,但是可以继承别的类
- final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加fina
- final修饰的变量称为常量,这些变量只能赋值一次。
- 引用类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改
- 修饰成员变量,需要在创建对象前赋值,否则报错。可以在创建对象时所调用的构造方法中,为变量n赋值* static关键字的特点
- 被static修饰的成员变量属于类,不属于这个类的某个对象
- 静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
- 同一个类中,静态成员只能访问静态成员
- 多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量
- main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中
匿名对象与内部类
匿名对象的特点:
- 创建匿名对象直接使用,没有变量名
- 匿名对象在没有指定其引用变量时,只能使用一次。
- 匿名对象可以作为方法接收的参数、方法返回值使用
内部类的分类
- 成员内部类
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
- 局部内部类
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
匿名内部类作用:匿名内部类是创建某个类型子类对象的快捷方式
//已经存在的父类:
public abstract class Person{
public abstract void eat();
}
//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量
Person p = new Person(){
public void eat() {
System.out.println(“我吃了”);
}
};
//调用eat方法
p.eat();
//匿名内部类的实现
//前提:必须有继承或者接口,new的不是子类而是父类或者接口
new 父类或接口(){
//进行方法重写
};
访问修饰符和代码块
修饰符: 编写的类、方法、成员变量的权限访问
- 要想仅能在本类中访问使用private修饰;
- 要想本包中的类都可以访问不加修饰符即可;
- 要想本包中的类与其他包中的子类可以访问使用protected修饰
- 要想所有包中的所有类都可以访问使用public修饰。
- 注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。
代码块分类:局部代码块,构造代码块,静态代码块
局部代码块是定义在方法或语句中
class Demo{
public static void main(String[] args) {
{
int x = 1;
System.out.println("普通代码块" + x);
}
int x = 99;
System.out.println("代码块之外" + x);
}
}
构造代码块是定义在类中成员位置的代码块
1. 优先于构造方法执行,构造代码块用于执行所有对象均需要的初始化动作
2. 每创建一个对象均会执行一次构造代码块。
public class Person {
private String name;
private int age;
//构造代码块
{
System.out.println("构造代码块执行了");
}
Person(){
System.out.println("Person无参数的构造函数执行");
}
}
静态代码块是定义在成员位置,使用static修饰的代码块。
1. 它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。
2. 该类不管创建多少对象,静态代码块只执行一次。
3. 可用于给静态变量赋值,用来给类进行初始化。
public class Person {
private String name;
private int age;
//静态代码块
static{
System.out.println("静态代码块执行了");
}
}
上一篇:Java基础笔记——环境搭建&变量
下一篇:Java常用API
网友评论