1.封装
封装是将对象的属性和具体实现隐藏起来,通过提供方法来操作对象属性,提高了程序的安全性与扩展性
全类名包含包名 -- 包名.类名。
package,包,用于解决命名冲突问题,并且优化了项目结构,便于理解
package 包名;---要放在文件的第一行
import用于引进其他包的类 -- import 包名.类名 引入某个包里的某个类
import 包名.*引入某个包里的所有类
import要放在package下面,放到class类上面。
2. 继承
Java继承只能单继承,并且继承具有传递性---父类的方法属性,子类可以使用调用
继承用关键字extends,class 子类名 extends 父类名{}
1.1 this
在方法中this其实是一个成员变量,存储的是地址值,指的是当前对象,调用当前方法的对象。
在构造方法中,可以调用其他构造方法,并且其必须要放在第一行,不然报错
1.2 super
super可以理解成父类对象,但super并不保存对象地址值,其是在堆内存中开辟了一个空间,并存储了父类的属性方法。
super()也必须要放在子类构造方法的第一行,不然报错,因此super()和this()不能同时出现。
当子类构造方法没有写super()方法时,编译器会自动添加一个super()方法。
当子类与父类属性方法同名时,可以通过super.属性名/方法名来调用父类的属性方法,如果不加super,则调用的是子类的属性方法。
1.3 语句块
语句块相当于没有修饰符没有返回值没有名字的方法。
静态语句块---static{}与实例语句块---{}
静态语句块在类加载时执行,并且在程序生命周期内只执行一次,所以常用于初始化属性
实例语句块在创建对象过程中,执行构造方法之前执行
static String count;
int name;
public static void main(String[] args) {
System.out.println(count);
System.out.println(User.count);
StaticPractise sp = new StaticPractise();
sp.nsm();
}
public StaticPractise(){
System.out.println("构造方法执行。。。");
}
//实例代码块
{
System.out.println("实例代码块执行。。。");
}
public static void sm() {
System.out.println("静态方法执行、、、");
}
public void nsm() {
System.out.print("成员方法执行。。。");
}
//静态代码块 用于属性初始化
static {
System.out.println("静态代码块执行,,,");
sm();
}
访问控制符:private只能在类中使用 default默认包内访问 protected同包或者有继承关系 public公共的,都可以访问
补充:静态属性与静态代码块在类加载进内存时进行初始化,并存储在方法区中,静态方法也存储在方法区,静态属性与静态代码块按顺序执行,从上到下。
3.多态
同一情况下,不同对象会有不同的状态就是多态
多态发生的前提是继承,重写与父类引用指向子类对象,
多态会降低代码的耦合度,维护性,扩展性和灵活性得到提高但是却会丢失子类的特有属性与方法。
public class Practise {
public static void main(String[] args) {
Father1 f1 = new Son1();
// instanceof判断左边对象跟右边类是否是同种类或者有继承关系
if (f1 instanceof Son1) {
f1 = (Son1) f1;
}
System.out.println(f1.count);
// 父类的
System.out.println(f1.age);
// 子类的,因为继承重写会覆盖父类的方法
f1.m1();
// 父类的
f1.m2();
// 多态会丢失子类的特有的方法,所以调用出错
// f1.m3();
// 返回值的多态
System.out.println(returnPoly());
argumentPoly(new Son1());
}
//返回值的多态
public static Father1 returnPoly() {
return new Son1();
}
//实参形参的多态
public static void argumentPoly(Father1 f1) {
f1.m1();
}
}
class Father1 {
int age = 1;
static int count = 1;
public void m1() {
System.out.println("父类的m1方法");
}
public void m2() {
System.out.println("父类的m2方法");
}
}
class Son1 extends Father1 {
int age = 2;
static int count = 2;
@Override
public void m1() {
System.out.println("子类的m1方法");
}
public void m3() {
System.out.println("子类的m3方法");
}
}
3.1 重写
重写需要方法名参数列表返回值类型相同,不能比原方法出现更宽泛的异常,也不能低于原方法的访问权限。
重写发生在父子类之间,子类重写父类方法
父类方法不能解决子类需求所以会发生重写
@Override源码注解,在编译之后就删除了,是为了提醒这是重写,并且不要写错
3.2 重载
方法名相同,参数列表不同(类型或个数不同)发生在一个类中