Java面向对象

java面向对象的三大特性包括:封装,继承,多态。

一、封装

1.什么是封装

        封装就是把客观事物封装成抽象的类,并且类可以把⾃⼰的数据和⽅法只让可信的类或者对象操作,对不可信的进⾏信息隐藏。

2.封装的使用

 一般属性私有化(private),方法公有化(public),除非方法只是用来内部调用,可以使用private来修饰。

        1.对属性使用private私有化来进行修饰,实现了对外界的隐藏,外界不能直接操作类的属性。

public class Student {
    //成员属性(变量)------存储数据的
    private String name;
    private int age;
    private double height;
}

        2.定义针对属性的getter和setter方法,完成对属性的获取和设置值。

    /**
     * getter和setter方法
     */
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

        3.属性私有化后也可以通过有参数的构造方法进行赋值,且在有参构造方法中进行安全验证。

    //有参数的构造方法,可以实现对类的属性进行赋值
    public Student(String name,int age,double height){
        System.out.println("有参数的构造方法被调用!!!");
        this.name=name;
        if (age>=0 && age<=150){
            this.age=age;
        }
        if (height>=0){
            this.height=height;
        }
    }

//根据构造方法赋值
public static void main(String[] args) {

      Student student=new Student("张三",18,180.5);

}

3.封装的使用提高了代码的可重用性和安全性。

二、继承

1.继承关键字使用:extends

2.继承的含义

 继承就是把及各类中相同的属性和方法抽离出来定义在基类中,子类不再需要定义这些属性和方法,继承之后,就相当于拥有了这些属性和方法。

        1.子类继承父类,父类定义的公共的实行和方法子类会拥有,但是父类定义的私有化的属性和方法,子类不能继承。

        2.父类继承过来方法,子类可以进行改造,重新实现功能(方法的重写),调用的时候执行的是子类新实现的方法。

3.人的继承案例

person

//人类的功能和属性
public class Person {
    //属性
    public String name;
    public int age;
    public double height;

    //吃饭的功能
    public void eat(){
        System.out.println("按时吃饭");
    }
    
    //学习的功能
    public void study(){
        System.out.println("学习");
    }

    //睡觉的功能
    public void sleep(){
        System.out.println("睡觉");
    }
}

 Student

//学生类继承人类
public class Student extends Person{
    //学生的学号
    public String stuId;

    //学生的无参构造方法(系统默认生成的,不写也可以)
    public Student() {
    }

    //学生娱乐的功能
    public void paly(){
        System.out.println("学生在娱乐");
    }
}

Teacher

//教师类继承人类
public class Teacher extends Person{

    //老师的工号属性
    private String teacherNo;

    //老师在工作的功能
    public void work(){
        System.out.println("老师在工作");
    }

}

测试类

public class Test01 {
    public static void main(String[] args) {
        //创建Student类对象
        Student student=new Student();
        student.eat();
        student.paly();
        
        System.out.println("----------------------------");
        
        //创建teachert类对象
        Teacher teacher=new Teacher();
        teacher.eat();
        teacher.work();

    }
}

运行结果如下所示:

三、多态

1.概叙

1.1 多态是继封装、继承之后,面向对象的第三大特性。

生活中,比如跑的动作,小猫小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来不同的形态。多态,描述的就是这样的状态。

1.2 定义

多态:是指同一行为,具有多个不同表现形式(调用同样的方法,执行的是不同的功能)。

1.3 前提

1.发生在有继承(extends)或者实现(implements)接口的情况下。  { 注:二选一 }

2.在子类中对方法进行了重写(意义体现:不重写,无意义)

3.父类引用指向子类对象(格式体现)

2.多态的使用

多态使用的格式:

        父类类型  变量名  =  new  子类对象();

        变量名.方法名();

父类类型:指子类对象继承的父类类型,或者实现的父接口类型。

代码如下所示:

动物类

//动物类
public class Animal {
    public void call(){
        System.out.println("动物的叫声");
    }
}

猫类

//猫类
public class Cat extends Animal{
    public void call(){
        System.out.println("猫的叫声");
    }
}

狗类

//狗类
public class Dog extends Animal{
    public void call(){
        System.out.println("狗的叫声");
    }
}

测试类

//测试类
public class Test {
    public static void main(String[] args) {
        Animal a1 = new Cat();
        Animal a2 = new Dog();
        a1.call();
        a2.call();
    }
}

输出结果如下所示:

 

3.多态的好处

在开发中,可以把父类(或接口类型)类型定义为方法的形参,在实际调用的时候传入的实际参数就比较灵活,可以传入父类类型的对象,也可以传入任意一个子类类型的对象。

4.引用类型转换

多态的转型分为向上转型与向下转型两种:

        4.1 向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。

当父类引用指向子类对象时,便是向上转型。

使用格式:父类类型  变量名  =  new  子类类型();

                如:Animal  a  =  new  Cat();

代码如下:

public class Test {
    public static void main(String[] args) {
        Animal a1 = new Cat();
        Animal a2 = new Dog();
        a1.call();
        a2.call();
    }
}

        4.2 向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。

一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。

使用格式:子类类型  变量名  =(子类对象)  父类变量名;

                如:Cat  c  =  (Cat)  a;

代码如下:

public class Test {
    public static void main(String[] args) {

        Cat c= (Cat) new Animal();
        c.call();

    }
}

        注意:向上转型是自动转换,不会存在问题,但是向下转型是强制转换,可能存在问题

5. 转型的意义

当使用多态方法调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误,也就是说不能调用子类拥有而父类没有的方法,编译都错误更别说运行了。这也是多态给我们带来的一点"小麻烦" 。所以,想要调用子类特有的方法,必须做向下转型。

6. 补充

调用类里面的方法有两种方法:

        1. 静态方法:类名 . 方法名;

        2. 非静态方法:实例化对象 (new  类名() ),然后对象名 . 方法名();

四、抽象类及抽象方法

1.由来

父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法的类就是抽象类。

2.抽象类

①. 抽象类里面不是必须有抽象方法。

②. 一个类里面有抽象方法,这个类必须是抽象的。

3.抽象方法

①. 方法只有声明没有方法体;        声明即规定方法三要数:方法名、参数列表、返回值类型

②. 要使用abstract关键字进行修饰。

③. 抽象方法定义格式:修饰符  abstract  返回值类型  方法名(参数列表);

        代码举例:

public abstract void run();

3. 定义抽象方法的意义

①. 能够对子类进行约束:子类必须实现父类的抽象方法,或者子类声明为抽象类;

②. 抽象类通过定义抽象方法就实现了一种规范,要求他的子类必须具备某种功能,具体如何实现以子类的具体实现为准。

五、接口

1. 接口的概叙

接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK7及以前),默认方法和静态方法(JDK8),私有方法(JDK9)。

2.接口的定义

他与定义类方法相似,但是使用 interface 关键字。他也会被编译成 .class 文件,但是一定要明确他并不是类,二十另外一种引用数据类型。

        引用数据类型:数组,类,接口。

3.接口的使用

它不能创建对象,但是可以被实现(implements,类似于被继承)。一个实现接口的类(可以看作是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象类。

4.定义格式

含有抽象方法

抽象方法:使用abstract关键字修饰,可以省略,没有方法体,该方法共子类实现使用。

代码如下:

public interface InterFaceName{

    public abstract void method();

}

含有默认方法和静态方法

默认方法:使用default修饰,不可省略,供子类调用或重写。

静态方法:使用static修饰,供接口直接调用。

代码如下:

public interface InterfaceName {
    //抽象方法
   // public abstract void method();
    
    //默认方法
    public default void method(){
        System.out.println("默认方法");
    }
    
    //静态方法
    public static void method2(){
        System.out.println("静态方法");
    }
}

含私有方法和私有静态方法

私有方法:使用private修饰,供接口中的默认方法或静态方法调用。

代码如下:                注意:仅JDK9版本支持此方法

public interface InterfaceName {

    //私有方法
    private void test1(){
        System.out.println("私有方法");
    }

    //私有静态方法
    private static void test1(){
        System.out.println("私有方法");
    }

}

六、this、super

1. this和super的含义

this:代表当前对象的引用(谁调用就代表谁)。

super:代表父类的存储空间表示(可以理解为父亲的引用)。

2. this和super的用法

this.成员变量 表示本类的

super.成员变量 表示父类的

this.成员方法名() 表示本类的方法

super.成员方法名() 表示父类的方法

用法演示,代码如下:

class Animal {

public void eat(){
    system.out.println("动物:eat");

    }
}

class Cat extends Animal {
    public void eat(){
        system.out.println("猫:eat")
    }

    public void eatTest(){
        this.eat();    //this    调用本类的方法
        super.eat();   //super    调用父类的方法
    }

}

七、final关键字

final关键字的作用:

1.final关键字表示最终的,不可变的。

2.final关键字可以修饰变量、方法,还有类

3.final关键字修饰的类是不能被继承

4.final关键字修饰的方法不能被覆盖,无法被重写

5.final关键字修饰的变量成为常量不能被更改,一次赋值,终生不变()。

final关键字的语法格式:

1.final修饰类的格式:

final class 类名 {...}

2.final修饰方法的格式:

修饰符 final 返回值类型 方法名(参数列表){...}

3.final修饰变量的格式:

final 数据类型 变量名 = 变量 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值