
封装 是指 将类的属性隐藏在内部,外部不能直接访问和修改 ,如何实现?
通过修改成员变量的可见性,从公有改为私有。
封装的核心思想就是 尽可能把属性都隐藏在内部,对外提供方法来访问,我们可以在这些方法中添加逻辑处理来实现过滤,以屏蔽错误数据的赋值。
继承 是用来描述类之间的关系的,即一个类继承(拥有)另外一个类中的属性和方法,被继承的类叫做父类,继承父类的类叫做子类。
继承的基本语法: extends 关键字
public class 类名 extends 父类名 {
}
Java中的继承是单继承,也就是说一个子类只能有一个直接父类。
创建一个子类对象的时候,会默认先创建一个父类对象,无论是通过有参构造或是无参构造来创建子类对象,都是通过无参构造来创建父类对象的。
可以通过 super 关键字让子类创建对象时调用父类的有参构造。
public Student(){
super(1);
System.out.println("通过无参构造创建了Student对象");
}
子类可以访问父类的构造方法、普通方法、成员变量,都是通过 super 关键字来完成,具体语法:
构造方法: super(参数列表)
普通方法: super.方法名(参数列表)
成员变量: super.成员变量名
注意: 在子类的构造方法中,可以通过super访问父类的构造方法和普通方法。在子类的普通方法中,只能通过super访问父类的普通方法。
Java访问权限修饰符:public、protected、默认修饰符、private。

子类在继承父类方法的基础上,对父类方法重新定义并覆盖的操作叫做 方法重写 。构造方法不能被重新,方法重写的规则:
一个事物具有多种表现形态,在Java程序中,定义一个方法,在具体的生成环境中根据不同的需求呈现不同的业务逻辑,多态的前提是继承。
多态的具体使用有两种形式:
本质上多态分两种:
①编译时多态(又称静态多态)
重载(overload) 就属于编译时多态,编译时多态在编译时就已经确定,运行时调用的是确定的方法。
②运行时多态(又称动态多态)
通常所说的多态指的都是运行时多态,也就是编译时不确定究竟调用哪个具体方法,一直等到运行时才能确定(如子类继承父类后实现的方法)。
①方法参数列表: 代码量大了之后,一些逻辑可以提取出来成为公共的部分,剩余的部分就自然而然地成为多态了。
如:定义方法参数列表时定义为父类类型,这样就可以传递任意子类类型的对象,从而根据传入不同的子类对象来实现不同子类的方法。
②向上转型: 在多态中需要将父类的引用指向子类的对象,只有这样该引用才既可以调用父类的方法,又能调用子类的方法。
Person per = new Student();
接口是 由抽象类衍生出来的 一个概念,并由此产生了一种编程方式:面向接口编程。
面向接口编程就是将程序中的业务模块进行分离,以接口的形式去对接不同的业务模块。
面向接口编程的优点:当用户需求变更时,只需要切换不同的实现类,而不需要修改串联模块的接口,减少对系统的影响。
接口在Java中时独立存在的一种结构,和类相似,我们需要创建一个接口文件,Java 中用class关键字来标识类,用 interface 来标识接口,基本语法:
public interface 接口名{
public 返回值 方法名 (参数列表);
}
接口其实就是一个抽象类,极度抽象的抽象类。
抽象类: 一个类中一旦存在没有具体实现的抽象方法时,那么该类就必须定义为抽象类,同时抽象类允许存在非抽象方法。
但是接口完全不同,接口中不能存在非抽象方法,接口中必须全部是抽象方法=。
因为接口中必须全部都是抽象方法,所以修饰抽象方法的关键字abstract可以省略。
接口中允许定义成员变量,但是有如下要求:
public class MyInterfaceImpl implements MyInterface {
@Override
public void test() {
// TDDO Auto-generated method stub
}
}
通过 implement 关键字来指定实现类具体要实现的接口,在实现类的内部需要对接口的所有抽象方法进行实现,同时要求访问权限修饰符、返回值类型、方法名和参数列表必须完全一致。
接口和继承,Java类只支持单继承,但是接口可以多实现(一个实现类可以同时实现多个接口)。
Java种创建对象共有5种方式:
对象实体在堆内存中;对象引用指向对象实例,对象引用存放在栈内存中。
举例: 一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)。
对象相等:比较的是内存中存放的 内容是否相等;
引用相等:比较的是它们指向的 内存地址是否相等。
完成**对象的初始化**。

public int add(int a,String b)
public String add(int a,String b)
// 编译错误
返回值不同不是方法重载。




抽象类 可以存在普通成员函数,而 接口 中只能存在public abstract抽象方法。
抽象类 中的成员变量可以是各种类型的,而 接口 中的成员变量只能是public static final常量类型的。
抽象类 只能继承一个,接口 可以实现多个。
抽象类和接口都不允许实例化。
注意: Java中是单继承,多实现。(即继承只能是单继承,一个子类仅有一个父类。接口可以多实现,即一个实现类可以同时实现多个接口)
接口的设计目的,是对类的行为进行约束 (更准确的说是一种 “有” 约束, 因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。
而 抽象类的设计目的,是代码复用 。当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给各个子类自己实现。正是因为A-B在这里没有实现,所以 抽象类不允许实例化 出来(否则当调用到A B时,无法执行)。
抽象类 是对类本质的抽象,表达的是is a的关系,比如:BMW is a Car。抽象类包含并实现子类的通用特性,将子类存在差异化的特性进行抽象,交由子类去实现。而 接口 是对行为的抽象,表达的是like a的关系。
比如: Bird like a Aircraft (像飞行器一样可以飞),但其本质上 is a Bird。接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁、是如何实现的,接口并不关心。
使用场景: 当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。 在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口,在设计阶段会降低难度。
何谓接口? Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口中全是抽象方法。
抽象方法: 只声明未实现(即没有方法体的方法)。
抽象类: 包含抽象方法的类(抽象类中不只有抽象方法)。
①抽象方法: 只给出方法定义而不具体实现的方法被称为抽象方法,抽象方法是没有方法体的,在代码的表达上就是没有“{}”。使用 abstract 修饰符来表示抽象方法和抽象类。
②抽象类: abstract修饰符表示所修饰的类没有完全实现,还不能实例化。
如果在类的方法声明中使用abstract修饰符,表明该方法是一个抽象方法,它需要在子类实现。如果一个类包含抽象方法,则这个类也是抽象类,必须使用abstract修饰符,并且不能实例化。
③ 抽象类除了包含抽象方法外,还可以包含具体的变量和具体的方法。类即使不包含抽象方法,也可以被声明为抽象类,防止被实例化。
由于父类方法的不确定性,所以用抽象类来把父类设计的抽象,以至于它都没有任何具体的事例,所以没有必要在父类里写,可以精简代码。(比如我们在实现多态的时候,就是会定义许多实现类去继承父类,父类中没有必要去实现方法,只需要定义即可,使用抽象类定义父类,可以精简代码)
互斥关系。
abstract定义的抽象类作为模板让子类继承;final定义的类不能被继承。
抽象方法定义通用功能让子类重写;final定义的方法子类不能重写。
abstract修饰的方法是抽象方法,只有定义没有实现。
static修饰的静态方法属于类,可以直接使用”类名.方法名“调用,使用类名调用抽象方法是没有意义的。
深拷贝: 拷贝整个对象。
浅拷贝: 如果是引用对象,则直接复制对象引用地址,不拷贝对象里面的内容。
引用拷贝: 两个不同的引用指向同一个对象。

因此深拷贝是安全的,浅拷贝的话如果有引用类型,那么拷贝后对象,引用类型变量修改,会影响原对象。
Object类提供的 clone() 方法可以非常简单地实现对象的浅拷贝。
