面向对象基础

2019-02-14  本文已影响0人  Harper324
1、类
修饰符 class 类名 {
    类变量
    成员变量
    构造方法
    类方法
    成员方法
    ...
}

//eg.
public class Person {
    static public String name; // 类变量
    private int age; // 成员变量

    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 成员方法
    public int getAge() {
        return age;
    }

    // 成员方法
    public void setAge(int age) {
        this.age = age;
    }
}
2、对象

对象就是类的实例化结果,实例化指的是创建对象的过程。

类名 对象名 = new 类的构造方法

//eg.
Person zhangsan = new Person("zhangsan", 18);
对象名.变量名
对象名.方法

//eg.
zhangsan.name;
zhangsan.getAge();
3、包(package)

是Java语言用来区分类的最主要方式,在Java系统开发中,会产生成千上万的各式各样的类,那么区分不同类就是很关键的问题,包概念的引入解决了这个问题。包与我们在操作系统下面的文件夹非常类似,我们会将同种类别的文件用文件夹来区分,方便管理。另一个方面来看,包也能解决同名文件的问题,相同名称的类在一个包下面是无法区分的,但可以放在不同的包里面,从这个角度来看,包创建了一个独立的命名空间。

4、import

在Java中,如果给出一个完整的限定名,包括包名、类名,那么Java编译器就可以很容易地定位到源代码或者类。Import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。

//引用上面model包里面定义的Student类
import model.Student;

public class Main {

    public static void main(String[] args) {
        Student student = new Student();
        student.setName("zhangsan");
        System.out.println(student.getName());
    }
}
5、继承

子类继承父类的特征和行为,使得子类对象具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

//语法
class ParentClass {

}

class SubClass extends ParentClass {

}

//eg.
public class Person {
    protected String name;
    protected int age;
    private int money;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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 class Student extends Person {

    private int studentNumber;

    public Student(String name, int age) {
        super(name, age);
    }

    public int getStudentNumber() {
        return studentNumber;
    }

    public void setStudentNumber(int studentNumber) {
        this.studentNumber = studentNumber;
    }
}

public class Test {
    public static void main(String[] args) {
        Student student = new Student("zhangsan", 18);
        student.setStudentNumber(101);
        System.out.println(student.name);
        System.out.println(student.getStudentNumber());
    }
}
6、多态

对同一个行为具有多个不同表现形式或形态的能力。

class ParentClass {
    public void method() {
        // code
    }
}

class SubClass extends ParentClass {
    @Override
    public void method() {
        // code
    }
}

例子:

public class Animal {
    public void eat() {
        System.out.println("老子就知道吃!!!");
    } //重写方法
}

public class Cow extends Animal {
    @Override
    public void eat() {
        System.out.println("人家可是素食主义者呢!!");
    } //重写方法
}

public class Lion extends Animal {
    @Override
    public void eat() {
        System.out.println("老子是吃肉长大的!!!");
    }
}


public class Test {
    public static void main(String[] args) {
        Animal cow = new Cow();
        cow.eat();  //人家可是素食主义者呢!!
        Animal lion = new Lion();
        lion.eat();  //老子是吃肉长大的!!!
    }
}
7、抽象类(Abstract Class)
// 语法:
abstract returnType methodName();

//eg.
abstract void eat();
abstract class ClassName {

    abstract returnType methodName(); //抽象方法

    returnType methodName(){
        // other method
   }
}

// eg.
public abstract class Animal {
    public abstract void eat();  //抽象方法
}

public class Cow extends Animal {
    @Override
    public void eat() {
        System.out.println("人家可是素食主义者呢!!");
    }
}

public class Lion extends Animal {
    @Override
    public void eat() {
        System.out.println("老子是吃肉长大的!!!");
    }
}
8、接口(Interface)
public interface interfaceName {
    returnType method();
    ...
}

public class className implement iterfaceName {
    public returnType method() {
    // code
    }
    ...
}

// eg.
public interface AnimalInterface {
    void eat();
}

public class LionImplement implements AnimalInterface {
    @Override
    public void eat() {
        System.out.println("老子是吃肉长大的!!!");
    }
}

public class Test {
    public static void main(String[] args) {
        AnimalInterface animalInterface = new LionImplement();
        animalInterface.eat();
    }
}
[修饰符] class 【类名】extends 【父类名】implements【接口列表】{
// code
}

9、引用类型
  1. 从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类
    型转换:
  2. 布尔型和其它基本数据类型之间不能相互转换;
  3. byte型可以转换为short、int、long、float和double;
  4. short可转换为int、long、float和double;
  5. char可转换为int、long、float和double;
  6. int可转换为long、float和double;
  7. long可转换为float和double;
  8. float可转换为double
    • 算术运算中的类型转换:
  9. 基本就是先转换为高位数据类型,再参加运算,结果也是最高位的数据类型;
  10. byte short char运算会转换为Int;
  11. 如操作数之一为double,则另一个操作数先被转化为double,再参与算术运算。
  12. 如两操作数均不为double,当操作数之一为float,则另一操作数先被转换为float,再参与运算。
  13. 如两操作数均不为double或float,当操作数之一为long,、则另一操作数先被转换为long,再参与算术运算。
  14. 如两操作数均不为double、float或long,则两操作数先被转换为int,再参与运算。
  15. 特殊:
    a. 如采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换为目标变量的类型。
    b. 当运算符为自动递增运算符(++)或自动递减运算符(--)时,如果操作数为byte,short或char类型不发生改变;
  1. 自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。
  2. 自动装箱是将boolean值转换成Boolean对象,byte值转换成Byte对象,char转换成Character对象,float值转换成Float对象,int转换成Integer,long转换成Long,short转换成Short,自动拆箱则是相反的操作。


    image.png
10、Java常用类
Object类

Object类是Java中所有类的父类,也就是所有类的祖宗,所有类都是继承自Object类,所以,在这个类里面,会包含一些所有对象共有的方法。

常用方法:
1) clone

class CloneClass implements Cloneable {
    public int aInt;
    public Object clone() {
        CloneClass o = null;
        try {
            o = (CloneClass) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }
}
package clone;
 
class UnCloneA {
    private int i;
 
    public UnCloneA(int ii) {
        i = ii;
    }
 
    public void doublevalue() {
        i *= 2;
    }
 
    public String toString() {
        return Integer.toString(i);
    }
}
 
class CloneB implements Cloneable {
    public int aInt;
    public UnCloneA unCA = new UnCloneA(111);
 
    public Object clone() {
        CloneB o = null;
        try {
            o = (CloneB) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }
}
 
public class CloneMain {
    public static void main(String[] a) {
        CloneB b1 = new CloneB();
        b1.aInt = 11;
        System.out.println("before clone,b1.aInt = " + b1.aInt); //11
        System.out.println("before clone,b1.unCA = " + b1.unCA);  //111
 
        CloneB b2 = (CloneB) b1.clone();
        b2.aInt = 22;
        b2.unCA.doublevalue();
        System.out.println("=================================");
        System.out.println("after clone,b1.aInt = " + b1.aInt); //11
        System.out.println("after clone,b1.unCA = " + b1.unCA); //222
        System.out.println("=================================");
        System.out.println("after clone,b2.aInt = " + b2.aInt); //22
        System.out.println("after clone,b2.unCA = " + b2.unCA); //222
    }
}

在对b2中b2.aInt进行赋值后,原b1中的b1.aInt的值不会发生改变,而b2.unCA的值会改变,这是因为b2.unCA和b1.unCA是仅仅指向同一个对象的不同引用,所以调用Object类中clone()方法对于基本数据类型来说可以得到新的内存空间而对于引用数据类型来说只是生成了一个新的引用,这种被称为"影子clone"

package ss;
 
class UnCloneA implements Cloneable {
    private int i;
 
    public UnCloneA(int ii) {
        i = ii;
    }
 
    public void doublevalue() {
        i *= 2;
    }
 
    public String toString() {
        return Integer.toString(i);
    }
 
    public Object clone() {
        UnCloneA o = null;
        try {
            o = (UnCloneA) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }
}
 
class CloneB implements Cloneable {
    public int aInt;
    public UnCloneA unCA = new UnCloneA(111);
 
    public Object clone() {
        CloneB o = null;
        try {
            o = (CloneB) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        o.unCA = (UnCloneA) unCA.clone();
        return o;
    }
}
 
public class CloneMain {
    public static void main(String[] a) {
        CloneB b1 = new CloneB();
        b1.aInt = 11;
        System.out.println("before clone,b1.aInt = " + b1.aInt); //11
        System.out.println("before clone,b1.unCA = " + b1.unCA); //111
 
        CloneB b2 = (CloneB) b1.clone();
        b2.aInt = 22;
        b2.unCA.doublevalue();
        System.out.println("=================================");
        System.out.println("after clone,b1.aInt = " + b1.aInt); //11
        System.out.println("after clone,b1.unCA = " + b1.unCA); 111
        System.out.println("=================================");
        System.out.println("after clone,b2.aInt = " + b2.aInt); //22
        System.out.println("after clone,b2.unCA = " + b2.unCA); //222
    }
}

b1.unCA与b2.unCA指向了两个不同的UnCloneA实例

2) equals

用于判断两个数据是否相等。

public class Test {
     public static void main(String[] args) {
        String a = "abc";
        String b = "abc";
        String c = new String("abc"); 
        String d = new String("abc");
        System.out.println(a==b);//true
        System.out.println(c==d);//false
        System.out.println(a.equals(b));//true
        System.out.println(c.equals(d));//true
        System.out.println(b.equals(d));//true
        System.out.println(a.hashCode()); //96354
        System.out.println(b.hashCode()); //96354
        System.out.println(c.hashCode()); //96354
        System.out.println(d.hashCode()); //96354
    }
}

3) hashCode

- 作用
为了配合基于散列的集合会根据对象的hashCode返回值来初步确定对象在容器中的位置,然后内部再根据一定的 hash 算法来实现元素的存取。这样的散列集合包括HashSet、HashMap以及HashTable。

不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。

4) getClass
在Java中获得类名的方法,getClass() 是一个类的实例所具备的方法,而class() 方法是一个类的方法。getClass() 是在运行时才确定的,而class() 方法是在编译时就确定了。

class A{
    public void func(){

    }
}

class B extends A{

}
public class Test {

    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        A ab = new B();
        System.out.println(a.getClass()+" "+A.class); //class A class A
        System.out.println(b.getClass()+" "+B.class); //class B class B
        System.out.println(ab.getClass()); //class B
        ab = a;
        System.out.println(ab.getClass()); //class B
    }

}

5) toString

该方法返回的是该Java对象的内存地址经过哈希算法得出的int类型的值在转换成十六进制。这个输出的结果可以等同的看作Java对象在堆中的内存地址。

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

        Object o1 = new Object();
        System.out.println(o1.toString()); //java.lang.Object@16d3586
    }

}
上一篇下一篇

猜你喜欢

热点阅读