Java面向对象

Java 面向对象

Java 继承

继承的概念

Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类,有的也称为基类,超类。父类和子类的关系,是一种一般和特殊的关系。

格式

class 父类 {
}
class 子类 extends 父类 {
}

继承类型

Java支持多重继承,但不支持多继承

[外链图片转存失败(img-fA2rl4M8-1564542982925)(C:\Users\大狼狗skr~\Desktop\extends.png)]

继承的特点

  • 子类继承了父类,子类拥有父类的非private的属性和方法
  • 子类可以拥有自己的属性和方法,即子类对父类进行了扩展
  • 子类可以用自己的方式实现父类的方法,即重写父类方法

super与this关键字

  • super:可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
  • this:指向自己的引用

当子类没有重写父类的方法,或者没有与父类相同变量名的属性时,在子类调用时可以直接调用。

若子类重写了父类的方法,或者有与父类相同的属性时,在子类调用时要用super关键字

public class Test {
    public String name = "666";
    public static void main(String[] args) {
        Flag f= new Flag();
        f.print();
    }

    public void printf(){
        System.out.println("888");
    }
}
class Flag extends Test{
   public void print(){
       System.out.println(name);
       printf();
   }
}

//输出:666
//	   888

public class Test {
    public String name = "666";
    public static void main(String[] args) {
        Flag f= new Flag();
        f.print();
    }
    public void print(){
        System.out.println("888");
    }
}
class Flag extends Test{
    String name = "999";
   public void print(){
       System.out.println(super.name);
       System.out.println(name);
       super.print();
   }
}
//输出:666
//     999
//     888

final关键字

final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:

final class 类名 {//类体}
修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}

继承中的构造器

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。

如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

Java 多态

多态实现的前提

  • 继承
  • 重写
  • 父类引用指向子类对象
    • Father p = new Son();

多态特点

编译过程中,子类必须重写父类的方法(除private,构造,以及final修饰),否则出现编译错误。

调用方法时,调用子类的方法,调用属性时,调用父类的属性。

public class Test {

    public static void main(String[] args) {
    Father f = new Son();
    f.print();
    System.out.println(f.name);
    }

}

class Father {
    String name="大头";
    int age=26;
    public Father(){
    }
    public Father(String name,int age){
        this.age=age;
        this.name=name;
    }

    public void print(){
        System.out.println("i am father");
    }
}
class Son extends Father{
    String name = "小头";
    public Son(){
    }

    public void print(){
        System.out.println("i am son");
    }
}

//输出:i am son
//     大头

Java 抽象类

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

抽象方法

如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。

Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。

抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。

声明抽象方法会造成以下两个结果:

  • 如果一个类包含抽象方法,那么该类必须是抽象类。
  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。

抽象类总结规定

    1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
    1. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
    1. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
    1. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
    1. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

Java 封装

概念

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

要访问该类的代码和数据,必须通过严格的接口控制。

封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

实现步骤

1. 修改属性的可见性来限制对属性的访问(private)

public class Person {
    private String name;
    private int age;
}

在Person类中将name,age私有化,只有在本类中可以访问

2. 设置相应的set,get方法

public class Person{
    private String name;
    private int age;

    public int getAge(){
      return age;
    }

    public String getName(){
      return name;
    }

    public void setAge(int age){
      this.age = age;
    }

    public void setName(String name){
      this.name = name;
    }
}

提供公共方法访问属性

Java 接口

接口与抽象类类似,但是有区别

抽象类和接口的区别

    1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。(也就是接口中只有抽象方法)
    1. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
    1. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
    1. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

接口特点

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。

格式

interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}

接口的实现

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

class 类名 extends 类名 implements 接口名,接口名,接口名...{}

接口的继承与多继承

interface 接口名 extends 接口名{}
interface 接口名 extends 接口名,接口名,接口名...{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值