封装
封装(Encapsulation)就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
封装的优点
- 减少代码耦合
- 便于修改,体高代码的可维护性
- 隐藏方法细节
Java封装的步骤
-
使用private修饰符,表示最小的访问权限。
-
对成员变量的访问,统一提供setXXX,getXXX方法
例:
public class Person{
private String name; //将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了
private int age;
public int getAge(){ //对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问
return age;
}
public String getName(){
return name;
}
public void setAge(int age){ //采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
继承
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的
继承优点
主要实现重用代码,节省开发时间。使代码更简洁,提高可维护性。
继承类型
需要注意的是 Java 不支持多继承,但支持多重继承。

继承的特性
-
子类拥有父类非 private 的属性、方法。
-
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法
- Java 的继承是单继承,但是可以多重继承
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
继承关键字
extends ,java中所有的类都是继承于 java.lang.Object,当一个类没有继承的关键字时,默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类
super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
final 关键字
final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
使用 final 关键字声明类,不能被继承,或者用于修饰方法,该方法不能被子类重写:
构造器
子类只是调用(隐式或显式)父类的构造器(构造方法或者构造函数)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
例:
class SuperClass {
private int n;
SuperClass(){
System.out.println("SuperClass()");
}
SuperClass(int n) {
System.out.println("SuperClass(int n)");
this.n = n;
}
}
// SubClass 类继承
class SubClass extends SuperClass{
private int n;
SubClass(){ // 自动调用父类的无参数构造器
System.out.println("SubClass");
}
public SubClass(int n){
super(300); // 调用父类中带有参数的构造器
System.out.println("SubClass(int n):"+n);
this.n = n;
}
}
// SubClass2 类继承
class SubClass2 extends SuperClass{
private int n;
SubClass2(){
super(300); // 调用父类中带有参数的构造器
System.out.println("SubClass2");
}
public SubClass2(int n){ // 自动调用父类的无参数构造器
System.out.println("SubClass2(int n):"+n);
this.n = n;
}
}
public class TestSuperSub{
public static void main (String args[]){
System.out.println("------SubClass 类继承------");
SubClass sc1 = new SubClass();
SubClass sc2 = new SubClass(100);
System.out.println("------SubClass2 类继承------");
SubClass2 sc3 = new SubClass2();
SubClass2 sc4 = new SubClass2(200);
}
}

接口
接口是比抽象类更为抽象的类 ,只有方法(全部是抽象方法)的声明没有方法的实现(由接口的实现类来实现)。
接口优点
- 1.类与接口是实现关系,一个类可以实现多个接口。
- 2.对外提供规则(类似USB接口)
- 3.降低了程序的耦合性(可以实现模块化开发,定义好规则,每个人实现自己的模块,提高了开发的效率)
定义接口(interface关键字)
public interface 接口名 {
抽象方法1;
抽象方法2;
抽象方法3;
}
接口的实现(implements)
类似于继承
class 类 implements 接口 {
重写接口中方法
}
接口中成员的特点
- 可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变
- 可以定义方法,方法也有固定的修饰符,public abstract
- 不可以创建对象(不能实例化)
- 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类
- 一个类实现一个接口必须实现它所有的方法
接口与类
- 类与类之间: 继承关系,一个类只能直接继承一个父类,但是支持多重继承
- 类与接口之间: 只有实现关系,一个类可以实现多个接口
- 接口与接口之间: 只有继承关系,一个接口可以继承多个接口
接口和抽象类的异同
同:都不能实例化,都含有抽象方法
异:接口只能有抽象方法,默认修饰符 public abstract
接口没有构造方法
抽象类可以有成员变量,也可以有常量,默认修饰符public static final
多态
多态是继封装、继承之后,面向对象的第三大特性。
现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。多态就是同一个接口,使用不同的实例而执行不同操作
Java 作为面向对象的语言,同样可以描述一个事物的多种形态。如 Student 类继承了 Person 类,一个 Student 的对象便既是 Student,又是 Person。
多态存在条件:
- 继承
- 重写
- 父类的引用变量(当变量指向一个对象时,这个变量就被称为引用变量)指向子类对象
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/244719.html