Java 封装 封装是指将对象的状态信息隐藏在对象内部
封装好处
1、提高了安全性
2、提高了复用性
3、隐藏了实现细节
private 只能在同一个类
default 同一个类和同一个包使用
protected 同样一个类,同一个包,子类
public 所有类
属性一定要用
private String name;
在类中定义set和get 方法,在方法内可以设置取值范围。
set 赋值
get 取值
定义set和get方法,使得在main函数里的对象,不能再直接调用属性了,通俗来说就是不能直接点出来了,只能通过get和set方法进行调用,从而隐形了细节。
=============================================================================================
继承的使用
语法:[修饰符] class 类名 extends 父接口{
//属性定义
//方法定义
}
说明
(1)子类继承了父类的所有属性和方法,只不过只能调用父类的非private属性和方法。
(2)Java 中的继承只支持单继承,意思就是一个子类只能继承一个父类,但允许多层继承。
//好比王健林和王思聪 王健林是父亲,王思聪是儿子
this 和 super关键字区别:
( 1 )通俗的讲,this指的是当前对象,super则指父类的。
(2)仅在了类中的构造方法中可以用“this(参数列表)”调用另一个构造方法,别的地方不可以这么用;
(3)可以用“this.成员变量”的方式引用成员变量。(适用于方法中局部变量和成员变量重名的情况);
(4)super是在子类构造方法中调用父类的构造方法时的使用方法,并且此句必须在构造方法的第一行;
(5)super成员变量名可用于引用父类的成员变量。、
(6)super可用来引用被子类屏蔽的成员变量和成员方法。不过super是在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类。
重写和重载的区别:
重载与重写是 Java 多态性的不同表现。
重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定)
而重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。
1、如果父类拥有自定义构造器,但并没有定义不带参构造器,那么子类也一定要自定义构造器,否则无法通过编译。
2.子类自定义构造函数的首行要显式的调用父类的某一构造函数进行初始化,如果不显式的调用,那么子类构造函数就会调用父类默认构造函数(即无参构造函数),否则无法通过编译。
3、子类不能直接使用和读取父类的private数据,要通过父类提供的public access方法,即getter和setter。
4、如果子类重写了父类的某个method,那么子类在重写的方法中要调用父类的方法就需要用super.someMethod()的形式调用,否则系统会报运行时错误 java.lang.StackOverflowError(因为系统反复调用的都是子类的重写方法,造成死循环)。
5、重写的意思是:返回值类型,方法名,参数类型和个数都要相同(返回值类型在SE5.0时也可以不同)
6、子类重写父类的方法,子类方法不可降低父类方法的作用域,如:父类某方法的作用域是protected,那复写方法不可以是friendly和private,只能是protected或public。
7、可以将子类对象赋给父类型变量,即 SuperClass e = new SubClass(), 反之不可; 但编译器仍只认为e属于SuperClass类型,因此不能调用SubClass的特有成员和方法(即新增的方法,而不是重写的方法),但可以调用被重写了的方法,并且由于动态绑定,e所调用的方法将按照子类中的方法逻辑执行。
多态的表现形式
多态的表现形式有方法重载,方法改写,多态变量和泛型。重载是一种静态的多态性,在程序编译时确定被调用的方法,称为早绑定。而多态变量和改写相结合之后,方法的调用在运行时才能确定,是动态的多态性,称为晚绑定。
向上转型,向下转型;
抽象的表现形式
关键词abstract
使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。
语法格式:
public abstract class 类名{
}
例如定义一个动物抽象类
public abstract class animal{
}
抽象方法
格式语法:
public abstract 返回值类型 方法名();注意没有大括号!
抽象的特点
1、抽象类和抽象方法必须用abstract关键字修饰。
- abstract class 类名()
- public abstract void eat();
2、抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口。
- 一个抽象类如果没有抽象方法,是可以定义为抽象类的。这么做的目的只有一个,就是不让其他类创建本类对象,交给子类完成。
3、抽象类不能实例化。那么抽象类如何实例化呢?
- 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
4、抽象类的子类
- 要么是抽象类
- 要么重写抽象类中的所有抽象方法
5、abstract不能和哪些关键字共存?
- abstract和static
* 被abstract修饰的方法没有方法体。
* 被static修饰的方法可以用类名.调用,但是类名.调用抽象方法是没有意义的。
- abstract和final
* 被abstract修饰的方法强制子类重写
* 被final修饰的方法不让子类重写,所以他两是矛盾的
- abstract和private
* 被abstract修饰是为了让子类看到并强制重写
* 被private修饰不让子类访问,所以他两是矛盾的