Java---(三)面向对象编程基础上

一:面向对象的基本概念

  1.封装性

    含义:

      ①把对象的属性和行为看成一个密不可分的整体,把这两者"封装"在一个不可分割的对立单位中

      ②"信息隐蔽",把不需要外界知到的信息隐蔽起来.

 

  2.继承性

    一个类继承另一个类的属性和行为,并进行扩展.

    继承分为多继承和单继承(即一个子类有多个父类和一个子类只有一个父类)目前java只支持单继承

    java可以通过实现多个接口来达到多继承的目的.

  3.多态性.

    多态是允许程序中出现重名现象.

    java分为方法重载和对象多态两种多态.

    ①方法重载:在一个类中允许多个方法使用同一个名字,但方法参数不同(个数或类型)

    ②对象多态:子类对象可以和父类对象进行相互转换,并且根据其使用的子类完成不同的功能.

二对象的创建与引用

  类名 对象名称 = null;        //声明对象

  对象名称 = new 类名();        //实例化对象,只要用new就表示开辟新的堆内存空间

  注意:对象使用前一定要先实例化(new)

 

  传递引用

  ①per2 其实指向的是per1的堆内存,所以当per2对其修改时,per1也会收到影响

        Person per1 = new Person("zhangsan",12);
        Person per2 = per1;

 

  ②per2和per1虽然信息完全相同,但实质上指向的不是同一个堆内存,所以对per2进行修改,不会影响到per1.

        Person per1 = new Person("zhangsan",12);
        Person per2 = new Person("zhangsan",12);

  

垃圾回收机制

        Person per1 = new Person("zhangsan",12);
        Person per2 = new Person("lisi",22);
        per2 = per1;

堆内存中的空间在没有被任何内存引用时会被GC(垃圾回收机制Garbage Collection)释放.

 

三.封装性

  类中的属性都使用private来修饰,使外部不能访问(private修饰的属性和方法只能在其内部被调用,不能再外部调用)

  外部只能使用setter,getter来获取和修改属性.

class Person{
    private String name;
    private int 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;
    }
}

this.xxx 表示调用当前类中的属性或者方法

四.构造方法

  构造方法没有返回值

  访问权限 类名称 (类型1 参数1,类型2 参数2){  

    程序语句

    //无返回值

  }

  注意:构造方法与类名称相同

     ①方法声明处没有返回值类型

    ②不能使用return返回一个值

    ③类一定有构造方法,当不声明时,程序默认有一个无参构造方法,但如果声明了一个构造方法后,程序默认的无参构造会消失.

    ④构造函数也可以进行方法的重载

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

 五.匿名对象

  1.匿名对象只在堆内存中开辟空间,不存在栈内存的引用

  匿名对象一般只使用一次.(用来直接调用方法),因为没有然后栈内存引用此处的堆内存,这个对象会在使用后被GC垃圾回收机制回收.

六.String类

  1.String类的初始化

    String类可以直接初始化   String name = "sy";

    也可以通过其构造方法初始化  String name = new String("sy");

    注:String类还存在一个构造方法  String name = new String("sy".getBytes("字符集"),"目标字符集");

      例如:

        uname = new String(uname.getBytes("iso8859-1"),"utf-8");

        将uname字符串从iso8859-1编码转成utf-8编码.

  2.String的比较

    直接使用  字符串 == 字符串  实际比较的是两个字符串的地址,只有当堆内存相同时才会放回相等

    如果要判断内容是否相同,一般使用 字符串.eqauls(String str);

    注:String类采用的设计模式其实是共享设计模式

      即当两个字符串采用直接赋值的方式定义了两个字符串,jvm不会再开辟新的内存空间

    面试题:解释String类的两种对象实例化方式的区别

      答:(1).直接赋值(String str = "字符串';): 只会开辟一块堆内存空间,并且会自动保存到对象池中,供下次重复使用

        (2).构造方法(String str = new String("字符串")) 会开辟两个堆内存空间(匿名字符串一个,str一个)但实际使用的只有一共空间,并且不会自动入池,手动入池的方法是(inter());

  3.字符串内容不会改变.只会不断更换栈内存中指向堆内存的地址

    注:在实际操作中当遇到需要对字符串进行频繁修改时可以使用StringBuffer类来定义字符串.

  4.String的常用方法

    见p111

  5.引用传递

    

        String str1 = "hello";
        System.out.println("fun()方法调用前"+str1);
        fun(str1);
        System.out.println("fun()方法调用后"+str1);
    }
    public static void fun(String str2){
        str2 = "MLDN";
    }

六.This关键字

  this的作用

  (1).表示类中的属性

  (2).可以使用this调用本类的构造方法

  (3).this表示当前对象

  注:this.() 调用的是当前对象的无参构造方法

七.两个对象比较  

  进行对象比较时应从对象的方法中出发通用的对象比较代码,覆写equals方法

  ①.优先比较地址

  ②.确认传入对象是否为null

  ③.对对象的属性进行比较

  

    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return age == person.age &&
                Double.compare(person.high, high) == 0 &&
                Objects.equals(name, person.name);
    }

八.static关键字

  1.static声明的属性为全局属性,所有对象共享.(当static修饰的属性发生改变时,所有对象的此属性都会改变)

  2.一般修改static属性都采用类名.属性调用,而不是用对象调用来修改

  3.static修饰的方法也是通过类名直接调用的.

  关于static方法定义的说明:(一般定义方法都不采用static定义方法)

    ①本类中没有提供有普通属性(这种类只是为了使用方法)

    ②本类无法直接进行对象实例化,只能够利用static操作.

  4.static修饰的方法和属性可以被其他类调用,但static修饰的方法只能调用static修饰的类和方法.

   原因:在程序中所有的属性和方法必须在对象实例化(即开辟堆内存)之后才能被调用,但static类型的方法在未被实例化时可以通过类名调用.

九.理解main方法

  main方法中的参数 String args[] 实际时在终端运行程序时传入的参数.

十.代码块

  一共分为四种代码块 ①普通代码块 ②构造块 ③静态代码块 ④同步代码块

  ①.直接对代码进行分割,,外部和内部的重名变量不影响

  

    public static void main(String[] args) {
        {
            int x = 20;
            System.out.println(x);
        }
        int x = 10;
        System.out.println(x);
    }

  ②构造块 是写在类中的,在每次实例化对象时都会先于构造方法执行.

 

public class Person {
    String name;
    int age;
    double high;

    {
        System.out.println("1.构造块");
    }

    public Person() {
        System.out.println("2.构造方法");
    }

}

  ③静态代码块 在主方法类中定义的静态代码块会先于主方法执行,在类中定义的静态代码块会先于构造方法执行,且只执行一次.

   注:在jdk1.7之前可以在主方法类中使用static完成主方法的操作后直接退出程序,1.7之后不能. 

    static{
        System.out.println("hello");   
    }
    public static void main(String[] args) {
        System.out.println("word");
    }
posted @ 2020-09-10 15:24  relo  阅读(76)  评论(0)    收藏  举报