Java面向对象编程

Posted merlinfan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面向对象编程相关的知识,希望对你有一定的参考价值。

一、类和对象

对象

对象——用来描述一个客观事物的实体,由一组属性和方法构成;

属性——对象具有的各种你特征,比如收银员的年龄、身高、体重;

方法——对象执行的操作,比如收银员收银、打印账单、刷卡等;

类   ——具有相同属性和方法的一组对象的集合;类是对象的抽象,对象是类的具体;

技术分享图片

类的方法——用来完成某个特定的应用程序功能,并返回结果;

public class Visitor {  //创建一个类
     public String name;
     public int age;

    // 定义方法
    public void bookTicket(){
        if(age >= 20 && age < 65){
            System.out.println(name + "的年龄是" + age + ",全票为20¥");
        }else if(age >= 12 && age < 20 ){
            System.out.println(name + "的年龄是" + age + ",半票票为10¥");
        }else{
            System.out.println(name + "的年龄是" + age + ",可免费参观");
        }
    }
}
public class VistorTest {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String visName = "";
        int visAge = 0;
        do{
            System.out.print("请输入姓名:");
            visName = scanner.next();
            System.out.print("请输入年龄:");
            visAge = scanner.nextInt();

            Visitor v = new Visitor();
            v.age = visAge;
            v.name = visName;
            v.bookTicket();
        } while(!"n".equals(visName));
        scanner.close();
    }
}

方法传参(内存分配)

基本数据类型:在栈中进行分配;变量名指向具体的数值;变量在声明之后java就会立刻分配给他内存空间;基本类型之间的赋值是创建新的拷贝;“==”和“!=”是在比较值;基本类型变量创建和销毁很快; 引用数据类型:在堆中进行分配,堆的读写速度远不及栈;变量名指向存数据对象的内存地址,即变量名指向hash值;它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址;对象之间的赋值只是传递引用;“==”和“!=”是在比较两个引用是否相同,需要自己实现equals()方法;类对象需要JVM去销毁;

构造方法

每个类都有一个默认的构造方法,如上例程序, 这种方法固定繁琐;使用带参构造方法就方便许多,编写了构造方法之后,会取代类默认的构造方法;

 技术分享图片

public class Voter {
    private static int count;
    private static final int total = 100;
    private String name;

    public Voter(String name){
        this.name = name;
    }
    ......          
}
public class main {
    public static void main(String[] args) {
        Voter zhang=new Voter("张三");
        Voter li = new Voter("李四");
        Voter wang = new Voter("王舞");
        ......
    }
}

 方法重载

技术分享图片

public class Add {

    public int addSum(int num1, int num2){
        return (num1 + num2);
    }
    public int addSum(int num1, int num2, int num3){
        return (num1 + num2 + num3);
    }

    public double addSum(double num1, double num2){
        return (num1 + num2);
    }
    public double addSum(double num1, double num2, double num3){
        return (num1 + num2 + num3);
    }
}
public class Calc {
    public static void main(String [] ages){
        int [] a = new int[5];
        int [] s = new int[9];
        Add sum = new Add();
        System.out.println(sum.addSum(2.2, 3.3));
        System.out.println(sum.addSum(3, 5));
        System.out.println(sum.addSum(3, 5, 3.3));
        System.out.println();
    }
}

this关键字

调用属性

this.health = 170;
this.name = "张三”

调用方法

this.print();

调用构造方法

this();         // 如果使用,必须是构造方法中的第一条语句
this(“小黑”, 100, 100, “雄”); 

二、封装和继承

 封装

封装就是讲某些信息影藏在类内部,不让外部程序直接访问,而是通过该类提供的方法来实现对内部影藏信息的操作和访问;

封装的好处:防止属性被错误修改;有利于提高系统之间的松耦合,提高系统的独立性;提高软件的可重用性;降低构建大型系统的风险;

封装原则:①把尽可能多的东西藏起来,对外提供接口;②把所有的属性隐藏起来;

封装步骤:①修改属性的可见性(设为private);②创建公有的getter/setter方法;③在getter/setter方法中加入属性控制语句;

/**
 * 标准javaBean的创建过程
 */
public class JavaBean {
    // 第一步:创建私有属性
    private String name;
    private int ID;
    private int age;
    private String address;

    // 第二步:生产getter和setter方法
    public String getName() {
        return name;
    }

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

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
     if (ID < 0)
       ID = 0
this.ID = ID; } public int getAge() { return age; } public void setAge(int age) {
     if (age < 0)
       age = 0
this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } // 第三步:创建无参构造函数和有参构造函数 public JavaBean() { } public JavaBean(String name, int ID, int age, String address) { this.name = name; this.ID = ID; this.age = age; this.address = address; } @Override public String toString() { return "JavaBean{" + "name=‘" + name + ‘‘‘ + ", ID=" + ID + ", age=" + age + ", address=‘" + address + ‘‘‘ + ‘}‘; } }

包的使用

JDK包提供:①java.lang:虚拟机自动引入;② java.util:提供一些实用类;③ java.io:输入、输出; 

为了使用不在同一个包中的其他类,需要在程序中使用 import 关键字导入这个类;

package com.ibeifeng.java.oop.javabean;

import com.ibeifeng.java.oop.buytickets.Visitor;     // 导入buyticket包中的Visitor类

public class User {
    public static void main(String [] args){
        Visitor user = new Visitor();
        user.name = "李四";
        user.age = 22;
        user.bookTicket();
        // 当前包与导入包如果有重名,name都要使用全路径,
        // 如果不使用全路径,那么默认的是导入的类;
//        Visitor user1 = new Visitor();
        com.ibeifeng.java.oop.javabean.Visitor user1 = new com.ibeifeng.java.oop.javabean.Visitor();
        user1.name = "张三";
        user1.age = 55;
        user1.bookTicket();
    }
}

 成员变量访问权限控制

通过关键字修饰变量,从而控制访问权限

技术分享图片

三、继承和多态

static关键字

 静态变量在内存中只有一块控件,而实际变量,每次事例都会重新开辟内存空间;

当静态变量不同时,根据定义顺序先后执行;

当静态变量和代码快中的变量相同时,先定义再赋值;

实例方法可以直接调用静态方法,但静态方法不能直接调用实例方法,必须使用new实例化后,在调用。实例方法中不能定义静态变量,

技术分享图片

 静态代码块:初始化静态变量

构造方法:初始化实例变量

 继承

把共性或重复的属性方法单独提取出来,用类来封装,对于个性则不提取,各自保留;

继承就是把父类的所有属性和方法继承过来;

被继承的类是父类,主动继承的类是子类,子类(A)使用关键字extends继承父类(B)

单根性——java中只支持单根继承,即一个类智能有一个直接父类

public class A extends B(){}     // A继承父类B

传递性——A继承B,B继承C,那么A继承了C,即一个类可以间接有多个父类

子类可以继承父类,并且可以有自己的特性,但是父类不可以继承子类

this:本类对象

super:父类对象

技术分享图片

技术分享图片

 当实例化子类时,都会先执行父类的无参构造方法

如果父类有有参构造函数,则必须显示提供无参构造函数;

指定调用父类的有参构造函数,使用 super 关键字:

Public A(string name){
  super(“小王”);          
  System.out.println("子类的有参构造方法:” + name);  
}

技术分享图片

super关键字来访问父类的成员:

  super只能出现在子类的方法和构造发放中;

  super调用构造方法时,只能是第一句;

  super不能访问父类的 private 的成员;

 

四、抽象类和接口

 

 

五、异常

 

以上是关于Java面向对象编程的主要内容,如果未能解决你的问题,请参考以下文章

面向面试编程代码片段之GC

Java面向对象

Java基础教程:面向对象编程

Scala的面向对象与函数编程

Java——面向对象编程

JAVA学习:Java面向对象编程基础