Java二面向对象

二 面向对象

继承
在Java中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类。
利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(subclass)。
类和类的关系
java中的类是单继承
子类可以拥有父类的所有属性和方法 但父类的修饰不能是private
代码的复用
规则 :Class 子类 entends 父类
1、子类拥有父类非private的属性和方法。
2、子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
3、子类可以用自己的方式实现父类的方法。
接口
在Java中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。
接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。
implements关键字
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
方法的重写
如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法的时候回优先调用子类的方法
规则:返回值类型 方法名 参数的类型及个数 都要与父类的继承方法相同,才叫方法的重写。
继承的执行顺序
1 初始化父类再初始化子类
2 先执行初始化对象中的属性,再执行构造方法中的初始化
this 关键字
This代表当前关键字
This.属性 操作 当前对象的属性
This.方法 调用当前对象的方法
封装对象属性的时候经常会用到this关键字
super关键字
代表父类
父类的属性 super.age 父类的方法 super.eat()
应用:
1子类的构造过程当中必须调用其父类的构造方法
2 如果子类的构造方法没有显示调用父类的构造方法,则系统默认调用父类的无参构造方法
3 如果显示调用构造方法,必须在子类的构造方法的第一行。
4 如果子类的构造方法中没有显示的调用父类的构造方法,而父类的又没有无参的构造方法,则编译出错
final关键字
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写
重写(Override)与重载(Overload)
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
(2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
(3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
构造器
子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。
如果父类有无参构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。

多态
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式
条件:
1继承
2重写
3父类引用指向子类对象
引用类型的转换
向上类型转换 (自动类型的转换) 小类型到大类型
向下的类型转换(强制类型装换) 大类型到小类型
Instanceof 运算符 解决引用对象的类型,避免类型转换的安全问题
多态的实现方式
方式一:重写:
这个内容已经在上一章节详细讲过,就不再阐述,详细可访问:Java 重写(Override)与重载(Overload)。
方式二:接口

  1. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
  2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。具体可以看 java接口 这一章节的内容。
    方式三:抽象类和抽象方法

抽象类
定义:抽象类前使用abstract关键字修饰,则为抽象类,不是所有的类都是用来描绘对 象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
应用:某些情况下,父类只是知道其子类应该包含怎样的方法,但无法准确知道子类如何实现这些方法
从多个相同特征的类中抽象出一个抽象类,以这个类为子类的模板,从而避免了子类设计的随意性
作用:规定子类的必须实现的方法,但不关注细节
使用规则:
1abstract定义抽象类
abstract 定义抽象方法,只有声明,不需要实现
3 包含抽象方法的类就是抽象类
4 抽象类中可以包含普通方法,也可以没有抽象方法
5抽象类不能直接创建,可以定义应用变量
抽象方法没有方法体以分号结束
public abstract class AbstractClass             //里面至少有一个抽象方法
{
   public int t;  //普通数据成员
   public abstract void method1();   //抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法
   public abstract void method2(); 
   public void method3();   //非抽象方法
   public int method4();
   publi int method4 (){
        …… //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现
   }
public void method3(){
        …… //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现
   }
}

接口
定义:
1类是一种具体的实现体,而接口定义了某一批类所需要遵守的规范,接口并不关心这些类的内部数据,也不关心这些类里的方法的实现细节,它只规定这些类中提供某些方法。
2 和类的定义不同,不再使用class关键字,而是使用了interface关键字
作用:接口就是用来被继承实现的,修饰符一般建议使用public,注意不能使用private和protect修饰接口。
内容: 接口中都是多个常量和多个抽象方法 也有abstract 关键字
可多继承 []可选的
常量 用public static final (自动) 方法只能是抽象方法,用public abstract(自动)
使用:一个类可以实现一个或多个接口,实现接口可使用implements关键字,java中的一个类只能继承一个父类,是不够灵活的,通过多个接口可以做补充。
类可以继承父类实现接口
用法:
1 Class 类名 extends 父类 implements 接口1 接口2…{
如果继承了抽象类,需要实现继承的抽象 方法,也要实现接口中的抽象方法。
}
如果要继承父类,继承父类必须在实现接口之前
2 接口在使用过程中,还经常与匿名内部类 配合使用
匿名内部类就是没有名字的内部类
多用于关注实现而不关注实现类的名称
3 直接new 接口 调用接口
public interface Interface
{ 
   static final int i;  //接口中不能有普通数据成员,只能够有静态的不能被修改的数据成员,static表示全局,final表示不可修改,可以不用static final 修饰,会隐式的声明为static和final

public void method1();  //接口中的方法一定是抽象方法,所以不用abstract修饰

public void method2();  //接口中不能赋予方法的默认行为,即不能有方法的具体实现
}

封装
将类的信息隐藏在类内部,不允许外界程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
修改属性的可见性(添加修饰符)
指定特指的方法来访问对象的属性 getter/setter方法 属性的读写
在getter/setter方法中加入控制语句 对属性值进行判断

内部类
定义在一个类里面的类,包含内部类的类称为外部类
作用:提供更好的封装
内部类的方法可以访问外部类的所有数据,包括私有数据
内部类所实现的功能同样可以实现,只是有时候内部类更方便
因为内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类 对象,这也是内部类的唯一优点
成员内部类
用法 内部类可以访问外部类的任意控制符 任意数据
定义了成员内部类之后,必须使用外部类对象来创建内部类对象
注意:外部类不能直接使用内部类的成员和方法,要先创建内部类对象
内部类如果要访问外部类的成员变量,可以使用THIS关键字
class Out {
private int age = 12;

//内部类
class In {
public void print() {
System.out.println(age);
}
}
}

public class Demo {
public static void main(String[] args) {
Out.In in = new Out().new In();
in.print();
//或者采用下种方式访问
/
Out out = new Out();
Out.In in = out.new In();
in.print();
/
}
}
静态内部类
就是static修饰的内部类
特点:
1静态内部类不能直接访问外部类的非静态成员,但可以通过new 外部类().成员的方式来访问。
2 外部类的静态成员与内部类的的成员名称相同,可以通过外部类.静态成员直接访问,如果不同,可以通过成员名直接访问外部类的静态成员
3 创建静态内部类的对象的时候,不需要借助外部类对象,可以直接创建内部类 对象名=new 内部类();
class Out {
private static int age = 12;

static class In {
public void print() {
System.out.println(age);
}
}
}

public class Demo {
public static void main(String[] args) {
Out.In in = new Out.In();
in.print();
}
}
方法内部类
内部类定义在外部类的方法中,由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和static修饰符

用法:类定义外部类的方法中, 创建方法内部类的对象,调用内部类的方法都在方法中
class Out {
private int age = 12;

public void Print(final int x) {
class In {
public void inPrint() {
System.out.println(x);
System.out.println(age);
}
}
new In().inPrint();
}
}

public class Demo {
public static void main(String[] args) {
Out out = new Out();
out.Print(3);
}
}

java包
包主要用来对类和接口进行分类。当开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。
Import语句
在Java中,如果给出一个完整的限定名,包括包名、类名,那么Java编译器就可以很容易地定位到源代码或者类。Import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。
例如,下面的命令行将会命令编译器载入java_installation/java/io路径下的所有类
import java.io.*;

猜你喜欢

转载自www.cnblogs.com/ww11/p/9112147.html