声明:学基础,在校学生,本文所有内容来自书本和视频,然后通过自己的理解和筛选编写而来,如有理解不到位的写得不到位的地方,欢迎评论指错!!!(仅做学习交流)
笔者: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弹栈;
十、一些面试题
- 静态变量和实例变量的区别?
答:在语法定义上静态变量要加static,实例变量不加;静态变量在方法区,实例变量在堆内存,静态变量随类的加载而加载,实例随对象的加载而加载;静态变量也称类变量,当类加载就可以使用,而实例变量也称对象对象,当创建才能使用;
- 抽象类和接口区别是什么?
答:接口中所有的方法都是抽象方法,抽象类中可以有抽象方法,也可以有非抽象方法;
接口中只有常量,并且默认修饰符:public static final;抽象类中可以有常量,也可以有变量;
抽象类中有构造方法,接口中没有;类可以实现多个接口,但只能继承一个抽象类;
接口是绝对抽象化的不可以实例化,抽象类也不能实例化;
- Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
答:方法覆盖就是重写父类方法的意思,方法重写必须方法名相同,参数一致,返回值类型相同,并且权限不能低于父类方法权限;
方法重载发生在同一个类中,多个方法名相同,参数列表必须不同返回值类型无关的方法
- 是否可以在static环境中访问非static变量?
答:很明显是不行的;因为static是随类的加载而加载,而static修饰的方法有一个特点就是不用创建就可以直接类名点调用,而非static 变量是随对象加载而加载,有对象才可以调用;所以有可能在调用static方法时还没有创建对象,所以就会出错,所以不可以在static环境中访问非static变量;原则:静态只能访问静态;结论:内存不同静态在方法区,非静态在堆内存;
- Java支持哪些数据类型?
答:Java支持的基本数据类型有:byte、int、char、double、float、boolean、long、short;
- Java中支持多继承么?
答:java中类不支持多支持只能单继承,但支持多层继承;Java中接口支持多继承;
- Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
当创建一个对象时,就会调用构造方法每一个类都有构造方法;在没有给的时候,Java编译器都会默认给它一个无参的构造方法;
Java中构造方法重载和方法重载相似,每一个类可以有多个构造方法,但参数列表不同;
Java不支持像C++那样的方法复制;