面向对象三大主线
类及类的成员
三大特性
其他关键字
二、面向对象三大特性
封装
原因
使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。所以要将属性保护起来,防止乱用。保护的方式:信息隐藏
方式
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;
使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
便于修改,增强代码的可维护性;
权限修饰符
修饰符
内部类
同一个包
子类
任何地方
private
Yes
default
Yes
Yes
protected
Yes
Yes
Yes
public
Yes
Yes
Yes
Yes
get set 方法
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节
使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
便于修改,增强代码的可维护性;
class Person{
private int age;
private String name;
private String gender;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
代码如上
继承
格式
class SubClass extends SuperClass{
}
Java只支持单继承,不可以多继承,可以多层继承(直接父类,间接父类)
方法重写 override
格式:
权限修饰符 返回值类型 方法名(形参列表) throws 异常类型{
方法体
}
使用规则和注意事项:
重写方法不能使用比被重写方法更严格的访问权限
重写和被重写的方法须同时为static的,或同时为非static的
子类方法抛出的异常不能大于父类被重写方法的异常
Object是所有类的祖宗
class SuperClass{
public String say(){
return "Father";
}
}
class SubClass extends SuperClass{
public String say(){
return "Son";
}
}
优点
减少了代码的冗余,提高了代码的复用性
便于功能的扩展
为多态提供了前提
具体体现
单例模式
饿汉式1
私有化类的构造器
在类的内部创建当前类的一个对象,声明为静态,私有
创建公共的静态方法,返回创建的对象
class SingleTon{
private SingleTon(){
}
private static SingleTon singleTon;
public static SingleTon getSingleTon(){
return new SingleTon();
}
public String say(){
return "SingleTon!";
}
}
public class SingleTonTest {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getSingleTon();
System.out.println(singleTon.say());
}
}
饿汉式2
私有化类的构造器
在类的内部声明一个该类的引用,声明为静态,私有的并且赋值为null
通过静态代码块创建一个该类的引用,并赋值给2声明的引用
创建公共的静态方法,返回创建的对象
class SingleTon{
private static SingleTon singleTon = null;
static {
singleTon = new SingleTon();
}
private SingleTon(){
}
public static SingleTon getSingleTon(){
return singleTon;
}
public String say(){
return "SingleTon!";
}
}
public class SingleTonTest {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getSingleTon();
System.out.println(singleTon.say());
}
}
懒汉式
私有化类的构造器
在类的内部声明一个该类的引用,并声明为静态,私有的并赋值为null,
创建公共的静态方法,在方法体重判断该2中声明的引用是否为null,如果是null则创建类的对象并赋值,返回创建的对象
class SingleTon{
private SingleTon(){
}
private static SingleTon singleTon = null;
public static SingleTon getSingleTon(){
if (singleTon == null) {
singleTon = new SingleTon();
return singleTon;
} else {
return singleTon;
}
}
public String say(){
return "SingleTon!";
}
}
public class SingleTonTest {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getSingleTon();
System.out.println(singleTon.say());
}
}
枚举类
必须在枚举类的第一行声明枚举类对象
l枚举类和普通类的区别:
使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
枚举类的构造器只能使用 private 访问控制符
枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰
枚举类对象可以有属性
若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数
//代码稍后写
多态
定义
多态性,是面向对象中最重要的概念,在java中有两种体现:
1.对象的多态性
2.引用变量的多态性
Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
若编译时类型和运行时类型不一致,就出现多态(Polymorphism)