封装·继承·多态

19 篇文章 0 订阅

声明:学基础,在校学生,本文所有内容来自书本和视频,然后通过自己的理解和筛选编写而来,如有理解不到位的写得不到位的地方,欢迎评论指错!!!(仅做学习交流)
笔者:Fhvk
微信:WindowsC-

一、封装

  • 封装:是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式。

  • 封装的好处
    1,隐藏实现细节,对外提供公式访问方式;
    2,提高代码复用性;
    3,提高安全性;

  • 封装的原则
    1,将不需要对外提供的内容隐藏起来;
    2,把隐藏属性提供公共方法对其访问;

  • 封和private的应用
    1,把成员变量用private修饰;
    2,提供对应的getXXX()和setXXX()方法;
    注意:private仅仅是封装的一种体现形式,不能说封装就是私有;

二、static(静态)

  • static作用:用于修饰成员变量和成员方法;

  • static的特点:
    1,随着类的加载而加载,随着类的消失而消失;
    2,优先于对象存在(先加载.class,再创建对象,所以肯定优先于对象存在);
    3,可以用类名调用,也可以用对象名调用,没有创建对象也可以用类名调用;
    4,被该类所有对象所共享(原因第5点);
    5,被static的成员变量和成员方法在方法区中(以便于共享);

  • 什么时候使用static?
    答:共性用静态,特性用非静态;
    例子:假设有学生这个类,属性有姓名、年龄、班级编号,一个班N个学生,所以要在堆内创建N个学生并分配内存,这个时候班级编号就可以修饰为static ,因为每一个学生对象班级编号都是一样的,没必要浪费内存空间,不然意味着N个学生对象就创建了N个班级编号;

  • static的注意事项:
    1, 在静态方法中没有this、super关键字(原因:static是随着类的加载而加载,this、super随着对象存在而存在,静态比对象先存在);
    2,静态方法只能访问静态成员变量和静态成员方法;
    3,非静态方法可以访问静态或非静态;
    总结:静态只能访问静态

  • 静态变量和成员变量的区别:
    1,静态变量也称为类变量,成员变量也称为实例变量或者说对象变量吧;
    2,静态变量随着类存在而存在(方法区),成员变量随对象存在而存在(堆内存);
    3,静态变量可以用类名和对象名调用,成员变量只能通过对象名调用;

三、{}(代码块)

  • 代码块的分类及出现的位置
    1,静态代码块 :类中方法外加static修饰 例:static{};
    2,构造代码块:类中方法外 例:{};
    3,局部代码块:方法内,局部位置 例:{};

  • 作用
    1,静态代码块:用于初始化类,加载驱动;
    2,构造代码块:可以理解为对象的初始化;
    3,局部代码块:限定变量的作用和范围生命周期;

  • 注意事项
    1,静态代码块:类加载只执行一次;
    2,构造代码块:比构造方法先执行,new一个对象执行一次;
    3,局部代码块:调用该方法即执行,及早释放,提高内存利用率;

  • 执行顺序(重点)

class Student {
	static {
		System.out.println("我是Student静态代码块");  //3
	}
	{
		System.out.println("我是Student构造代码块");  //4   6
	}
	public Student() {
		System.out.println("我是Student构造方法");   //5   7
	} 
}
class Demo_Student {
	static {
		System.out.println("我是Demo_Student静态代码块");   //1
	}
	public static void main(String[] agrs) {
		System.out.println("我是main方法");      //2
		Student s1 = new Student();
		Student s2 = new Student();
	}
}

运行结果

四、继承(extends)

  • extends:让类与类产生关系,子父类关系;

  • 继承的好处和弊端
    1,提高了代码的复用性;
    2,提高了代码的维护性;
    3,让类与类之间产生了关系,是多态的前提;
    4,类的耦合性增强了(弊端);
    开发原则:高内聚,低耦合;

  • 继承的特点
    1,支持单继承,不支持多继承:一个儿子只能有一个爹(C++语言支持多继承)
    2,支持多层继承:儿子继承爹,爹又继承爷,这样就出现了继承体系;
    3,如果想用这个继承体系所有的功能就用最低层的类创建对象;
    4,如果想看这个继承体系共性功能,就看最顶层的类;

  • 继承的注意事项
    1,子类只能继承父类所有非私有(private)的成员方法和变量;
    2,子类不能继承父类的构造方法,但是可以通过super()访问父类的构造方法;
    3,不要为了部分功能而去继承;
    4, 父类比子类先加载进内存;

  • 什么时候使用继承?
    继承其实体现的是一种关系:“is a”;
    例如:A是B的一种,B是A的一种,这个时候就可以使用继承;

  • 继承中成员变量的关系
    1,同名的变量:就近原则,使用子类变量(当new 子类,没有意义,开发基本不会出现 );
    2,不同名变量:没有影响,照常继承下来;

  • 继承中成员方法的关系
    1,同名方法:当子父类出现同名的方法,我们称为子类重写了父类的方法;当想用父类的方法时,可以使用super调用;
    2,不同名方法: 没有影响,照常继承非私有方法;

  • 方法重写(Override)
    1,什么是方法重写:子父类出现一模一样的方法;
    2,当子类想继承父类的功能,又想添加一些细节;这个时候就可以使用重写;

  • 方法重写的注意事项
    1,子类不能重写父类私有方法;
    2,子类重写父非私有方法时,访问权限不能更低;
    3,父类是static修饰的,子类重写也必须是静态的(不算重写);(静态只能覆盖静态);
    4,子类重写父类的方法时,最好声明一模一样;
    5,也使用就近原则;子类对象调用方法时;先找子类,再找父类;
    6,方法重写与返回值类型有关(必须与父类一致);

四、this&super

  • this和super分别代表什么?
    1,this:代表当前对象的引用,谁来调用我,我就代表谁;
    2,super:代表当前对象父类的引用;

  • this和super的区别
    1,调用成员变量:this调用本类的成员变量,也可以调用父类的非私有成员变量(本类没有的情况下才会调用父类的);super调用父类非私有的成员变量;
    2,调用构造方法:this(…) 调用本类的构造方法;super(…) 调用父类的构造方法;
    3,调用成员方法:this调用本类的成员方法,也可以调用父类非私有的成员方法(本类没有的情况下才会调用父类的);super调用父类非私有的成员方法;

  • 子类构造与父类的关系
    1,子类中所有的构造方法默认都会访问父类中空参的构造方法;
    2,为什么?因为子类会继承父类中的数据,可能还会使用父类的数据;所以子类初始化之前先将父类初始化;
    3,每一个子类构造方法中第一行都隐藏了一个super();用来访问父类中的空参构造;

  • 如果父类没有无参的构造方法怎么办?
    这个时候可以通过子类有参构造调用父类有参构造 super(x1,x2…);

  • 注意事项
    1,this和super不能出现在类方法中也就是static方法;因为静态方法可以直接通过类名调用比对象先加载,这时可能没有任何对象产生;
    2,this()和super()必须在构造方法第一行语句上;且不能同时出现;

五、final(最终)

final:修饰类、方法、变量;
final特点:
1,被final修饰的类不能被继承(例:String类就是final修饰的);
2,被final修饰的方法不能被重写;
3,被final修饰的变量只能被赋值一次,也就变成了常量(配合使用:public static fianl);

  • 注意事项
    1,修饰基本数据类型:值不可以改变,变量名最好大写,见名知意,用于固定的值;例:圆周率;
    2,修饰引用数据类型:地址不能改变,对象中的属性可以被修改;
    3,用final修饰的成员变量默认初始化值是无效值,可以显示初始化,也可以通过构造函数进行赋值,但不能同时显示又通过构造,只能赋值一次;

六、多态(polymorphic)

  • 多态:事物存在的多种形态;

  • 多态的前提
    1,要有继承关系;
    2,要有方法重写;
    3,要有父类引用指定子类对象;

  • 多态中成员变量访问的特点
    如果出现同名变量:编译看左边(父类),运行看左边(父类);
    Fu f = new Zi();

  • 多态中成员方法的特点
    1,重写的情况下:编译看左边(父类),运行看右边(子类);
    2,也称为动态绑定,java编译时看的是在父类中有没有子类这个方法,保证编译通过,然后进栈的是子类中的方法,所以运行看的是子类;

  • 多态中的向上转型和向下转型
    1,向上转型:就是父类引用指向子类对象;将引用从子类提升为父类;
    2,向下转型:

Fu f = new Zi();
Zi z = (Zi)f;  //强转为zi类也称为向下转型;

注意:先有向上转型,然后才有向下转型;

  • 多态的利
    1,提高代码可维护性(由继承保证);
    2,提高代码的扩展性(由多态保证,当做参数使用,所有的子类都可以接收);

  • 多态的弊
    不能使用子类特有的属性和行为;

  • Instanceof
    1,使用:引用 instanceof 数据类型;
    2,功能:判断前边的引用是否是后面的数据类型;
    3,返回值:是返回true;不是返回false;
    4,配合if使用;

七、abstract(抽象类)

  • 抽象:就是看不懂的;

  • 抽象类的特点
    1,抽象类和抽象方法必须用abstract关键字修饰;
    2,抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类/接口;
    3,抽象类不能实例化,但是可以通过父类引用指向子类来实例化,也就是多态;
    4,抽象类的子类,要么是抽象类,要么是普通但要重写抽象类所有的抽象方法;

  • 抽象类成员的特点
    1,成员变量可以是变变量,也可以是常量,但不能用abstract修饰;
    2,构造方法有没有?有;用于子类访问父类数据的初始化;
    3,成员方法可以是抽象的(强迫子类要做的事,子类必须要重写父类抽象方法),也可以是非抽象的(提高代码的复用性);

  • 抽象类和普通类的异同?
    1,相同之处:都是用来描述事物的,都可以定义属性、行为、构造方法;
    2,不同之处:普通类不可以定义抽象方法,抽象类可以;普通类可以实例化,抽象类不可以;普通类可以不被继承也可以被继承,而抽象类要使用,必须被继承并且子类重写抽象方法;抽象类中抽象方法没有方法体,普通类中方法有方法体;

  • 注意事项:
    abstract关键字不能与static、private、final共存;
    原因:static:可以类名调用,调用一个抽象方法没有意义;private:私有抽象方法,子类不能访问没有意义也重写不了;final:修饰方法不能被重写,而抽象方法就是为了子类去重写;

八、interface(接口)

  • 接口:对外提供规则的都是接口;

  • 接口的特点:
    1,用interface修饰的;
    interface 接口名{}
    2,没有构造函数,所以不能实例化,但可以多态实现;
    3,子类要么是抽象类,没有意义;要么是普通类,但必须重写里面所有的抽象方法;
    5,子类通过implements来实现接口;
    class 类名 implements 接口名{}

  • 接口的成员特点
    1,接口中只有常量;默认修饰符:public static final
    2,接口中没有构造方法;
    3,接口中所有的方法都是抽象方法;默认修饰符:public abstract

  • 类与类
    支持单继承,不支持多继承,支持多层继承;

  • 类与接口
    支持多实现,也支持单实现;可以继承一个类的同时,还实现多个接口;

  • 接口与接口
    支持多继承,也支持单继承;

  • 抽象类与接口的区别
    成员区别:抽象类有构造方法,接口没有;抽象类可以有抽象方法,也可以有非抽象方法;抽象类可以有常量,变量;接口没有构造方法;接口只有常量;接口只有抽象方法;

  • 设计理念的区别:
    1,抽象类被继承的体现是:“is a”的关系。抽象类中定义的抽象方法是该继承体系中的共性功能;
    2,接口被实现的关系是:"like a"的关系.接口中定义的抽象方法是该继承体系的扩展功能;

九、 一个对象在内存中产生的过程

在这里插入图片描述
1,将Test.class加载进方法区;
2,jvm调用main进栈;
3,声明Test类型的引用;
4,通过new 在堆内存中开辟空间;
5,对象中的属性默认初始化;
6,构造方法进栈;
5,super()进栈;对父进行初始化,此时父类是Object;
6,super弹栈;
7,通过构造方法对属性进行显示初始化;
8,构造方法弹栈
9,把地址赋给t;
10,main弹栈;

十、一些面试题

  1. 静态变量和实例变量的区别?

答:在语法定义上静态变量要加static,实例变量不加;静态变量在方法区,实例变量在堆内存,静态变量随类的加载而加载,实例随对象的加载而加载;静态变量也称类变量,当类加载就可以使用,而实例变量也称对象对象,当创建才能使用;

  1. 抽象类和接口区别是什么?

答:接口中所有的方法都是抽象方法,抽象类中可以有抽象方法,也可以有非抽象方法;
接口中只有常量,并且默认修饰符:public static final;抽象类中可以有常量,也可以有变量;
抽象类中有构造方法,接口中没有;类可以实现多个接口,但只能继承一个抽象类;
接口是绝对抽象化的不可以实例化,抽象类也不能实例化;

  1. Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

答:方法覆盖就是重写父类方法的意思,方法重写必须方法名相同,参数一致,返回值类型相同,并且权限不能低于父类方法权限;
方法重载发生在同一个类中,多个方法名相同,参数列表必须不同返回值类型无关的方法

  1. 是否可以在static环境中访问非static变量?

答:很明显是不行的;因为static是随类的加载而加载,而static修饰的方法有一个特点就是不用创建就可以直接类名点调用,而非static 变量是随对象加载而加载,有对象才可以调用;所以有可能在调用static方法时还没有创建对象,所以就会出错,所以不可以在static环境中访问非static变量;原则:静态只能访问静态;结论:内存不同静态在方法区,非静态在堆内存;

  1. Java支持哪些数据类型?

答:Java支持的基本数据类型有:byte、int、char、double、float、boolean、long、short;

  1. Java中支持多继承么?

答:java中类不支持多支持只能单继承,但支持多层继承;Java中接口支持多继承;

  1. Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?

当创建一个对象时,就会调用构造方法每一个类都有构造方法;在没有给的时候,Java编译器都会默认给它一个无参的构造方法;
Java中构造方法重载和方法重载相似,每一个类可以有多个构造方法,但参数列表不同;
Java不支持像C++那样的方法复制;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值