码迷,mamicode.com
首页 > 编程语言 > 详细

java类与对象

时间:2020-02-06 01:40:50      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:image   div   封装   的区别   span   添加   getname   ati   类与对象   

面向对象:

三大特征:封装性,继承性,多态性

类与对象的关系:类是对某一事物描述,是抽象,概念上的定义;对象是实际存在该类事物的每个个体,因而成为实例

定义类和对象:

class 类名称{

     数据类型 属性;

         .....                                                                                              // 声明成员变量(属性)

          public   返回值的数据类型 方法名称(参数1,参数2,,,,){

                         程序语句;

                        【return表达式;】  

    }                                                                                                             //  定义方法内容                                         }

class Person{
        String name;
         int age;
         public void tell(){
         System.out.println("姓名:"+name+"年龄:"+age);
       }
}

此时定义了一个类,一个类定义完成之后不能直接使用,需要产生对象;

对象也需要使用其产生的固定格式,

对象的创建及使用

类名对象名称=null;            //声明对象
 类名名称=new 类名();  //实例化对象

    类名  对象名称=new 类名();

class Person{
String name;
int age; public void tell(){ System.out.println("姓名"+name+"年龄"+age); } } public class ClassDemo{ public static void main(String args[]){ Person per=new Person(); //创建并实例化对象 } }

类属于引用传递类型,从数组中可以知道,引用数据类型必然存在栈内存-堆内存的引用关系;

类与对象也存在这样的关系 

技术图片

 

 

 Person per=new Person();

  •    声明对象:Person per,栈内存中声明的,与数组一样,数组名称就保存栈内存之中,只开辟了栈内存的对象是无法使用的,必须有其堆内存的引用才可以使用;
  • 实例化对象:new Person(),在对中开辟空间,所有的内容都是默认值

            |-String:是一个字符串,本身是一个类,就是一个引用数据类型,此时默认值为null;

            |-int:是一个整数,本身是一个数,是基本数据类型,此时默认值就是0;   

可以进一步划分以上代码,则可以写成如下的形式:

Person per=null;        //声明对象

per=new Person();     //实例化对象

 

 

 

为属性赋值,并调用类中的方法,使用格式:

  •   调用属性:  对象.属性 
  •    调用方法:对象.方法

public class ClassDemo{

       public static void main(){
     

                   Person per=new Person();

                   per.name="张三";//为姓名赋值

                   per.age=15;    //为年龄赋值

                   per.tell();     //调用方法,打印信息

   }

}

 

  

 

 

 

 

 

 

 

此时,内容显示出来之后,实际所有的操作都是要在内存中直接体现出来的;

注意:在使用对象的时候,对象必须被实例化之后才可以使用(实例化对象,并不单单指的是直接通过new关键字时实现的,只有其有堆内存的空间指向,则就表示实例化成功)

不实例化会出现空指向异常;在应用操作中,如果一个对象没有堆内存的引用,而调用了类中的属性或方法,则会出现此问题;

空间没有任何的栈内存空间所引用,就形成了垃圾空间,等待垃圾收集机制进行回收;

  • 封装性:保护某些属性或方法可以不被外部看见。(封装性在java中有很多形式,private只是最基本的一种形式,也是一种比较常见的一种形式)
  • 封装的实现: 为属性封装:private 属性类型 属性名称        

                       为方法封装:private 方法返回值 方法名称(参数列表){}

    私有的访问权限,外部根本无法调用

  • 访问封装内容:被封装的属性如果需要被访问,则需要编写setter及getter方法完成
  • 例如:现有属性:private String name;
  •             Setter(设置):public void setName(String n)()

           Getter String getName()

    只要一有对象实例化就会调用构造方法   ;构造方法的名称必须与类名一致,不能有任何返回值类型的声明,

package holidayjava;
class Person{
    public Person() {       //声明构造方法
        System.out.println("一个新的Person对象产生");
    }
}
public class Demo {
    public static void main(String[] args) {
        
      System.out.println("声明对象:Person per=null");
      Person per=null;    //声明对象是并不去调用构造方法
      System.out.println("实例化对象:per=new Person();");
      per=new Person();    //实例化对象
    }

}

   在整个java操作中,如果一个类中没有明确的声明一个构造方法,则会自动生成一个无参的什么都不做的构造方法,供用户使用,就类似于以下的形式:

class Person{
     public Person(){
      }                              //如果没有编写构造方法,则会自动生成此代码
}

构造方法的主要目的是为类中的属性初始化,

package holidayjava;
class Person{
    private String name;
    private int age;
    public Person(String n,int a) {       //声明构造方法
        this.setName(n);
        this.setAge(a);
    }
    public void setName(String n) {
        name=n;
    }
    public void setAge(int a) {
        age=a;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public void tell() {
        System.out.println("姓名:"+name+"年龄;"+age);
    }
}
public class Demo {
    public static void main(String[] args) {
        
      System.out.println("声明对象:Person per=null");
      Person per=null;    //声明对象是并不去调用构造方法
      System.out.println("实例化对象:per=new Person();");
      per=new Person("张三",15);    //实例化对象
      per.tell();
    }

}

构造方法重载:构造方法本身与普通方法一样,都是支持重载操作的,只要参数的类型的个数或个数不同,则可以完成重载操作

匿名对象:在Java中如果一个对象只使用一次,则可以将其定义成匿名对象

所谓的匿名对象就是比之前少一个栈内存的引用关系,只在堆内存中开辟空间,而不存在栈内存的引用。

public class Noname{
    public static void main(String args[]){
         new Person("张三",30).tell();       //匿名对象
     }
}

程序分析思路:

1.根据要求写出类包含的属性

2.所有的属性必须进行封装(private)

3.封装之后的属性通过setter和getter设置和取得

4.如果需要可以加入若干构造方法

5.再根据其他要求添加相应的方法

6.类中的所有方法都不要直接输出,而是交给被调用处输出

 

 

 

 

 

 

 

String类

1.1 实例化String对象

A.直接复制

String name="zhanghong";

B.通过new关键字

String name=new String("zhanghong");

1.2 String的内容比较

基本数据类型中使用“==”进行比较,

package holidayjava;

public class Demo {
    public static void main(String[] args) {
        String str1="hello";      //直接赋值
        String str2=new String("hello");   //通过new赋值
        String str3=str2;      //传递引用
        System.out.println("str1==str2"+(str1==str2)); //flase
        System.out.println("str1==str3"+(str1==str3)); //flase
        System.out.println("str2==str3"+(str2==str3));  //true
    }

}

 

进行内存的分析,

 

 

技术图片

 

 

 现在使用判断相等,是判断地址空间是否相等,判断的是地址值;

如果是判断其内容是否相等,则必须使用String类提供的equals()方法

public class Demo {
    public static void main(String[] args) {
        String str1="hello";      //直接赋值
        String str2=new String("hello");   //通过new赋值
        String str3=str2;      //传递引用
        System.out.println("str1==str2"+str1.contentEquals(str2)); //true
        System.out.println("str1==str3"+str1.contentEquals(str3)); //true
        System.out.println("str2==str3"+str2.contentEquals(str3));  //true
    }
}

结论:String有两种比较方式:“==”-------->地址值        equals-------->具体内容

1.3两种实例化方式的区别

一个字符串就是String的匿名对象,通过以下代可知:

public class Demo {
    public static void main(String[] args) {
       System.out.println("hello".equals("hello"));   //true
    }
}

String name="zhanghong";

就表示将一个堆内存空间的指向给了栈内存空间,使用直接赋值方式,可以有效节省内存

使用new String()方式则意味着要开辟两个内存空间;

技术图片

 

 

 

1.4字符串的内容一旦声明不可改变

public class StringDemo{
     public static void main(String[]args){
         String str="hello";
         str=str+"hello";
          System.out.println("str="+str);
     }
}

此时,字符串对象改变了,但是字符串改变了么?

技术图片

 

 

 

实际上字符串内容的改变,改变的是内存地址的引用关系;

在开发中应该避免使用如下操作:

public class Demo {
    public static void main(String[] args) {
      String str1="zhanghong";  //声明字符串
      for(int i=0;i<100;i++) {    //循环修改内容
          str1=str1+i;            //字符串的引用不断改变
      }
    }
}

这样的操作,要断开-连接引用100次才可以完成,性能很低,应该避免使用。

2.String类的常用方法

一个字符串可以变为一个字符数组,同样,也可以把一个字符数组,变为一个字符串,

2.1将字符串变为字符数组 public char[] toCharArray()

    将字符数组变为字符串 public String(char[]value)

                                        public String(char[] value,int offset,int count)

package holidayjava;

public class Demo {
    public static void main(String[] args) {
     String str1="hello";                //定义字符串
     char c[]=str1.toCharArray();       //将一个字符串变为字符数组
     for(int i=0;i<c.length;i++) {      //循环数组
          System.out.print(c[i]+",");
     }
      System.out.println("");        //换行
      String str2=new String(c);      //将全部字符数组变为String
      String str3=new String(c,0,3);   //将部部字符数组变为String
      System.out.println(str2);    //输出字符
    }
}

2.2从字符串中取出指定位置的字符

  str.charAt(int index);

2.3字符串与byte数组的转换

byte数组(字节数组),在一般IO操作中会经常使用到,在String 类中提供了以下的方法可以进行字符串与字节数组间的转换: 

  • 字符串变为字节数组:public byte[]getBytes()
  • 将一个字节数组变为字符串:将全部字节数变为String:public String(byte[]bytes)                  将部分字节数组变为String:public String(byte[]bytes,int offset,int length)

  2.4取得一个字符串的长度      

public class Stringdemo{
   public static void main(){
       String str1="hello Lixinghua";
       System.out.println("/"+str1+"/的长度为:"+str1.length());
          }
}

2.5查找指定的字符串是否存在

  • 从头开始查找:publicint indexOf(String str)
  • 从指定位置开查找:public int indexOf(String str,int fromIndex)

2.6去掉空格

去掉左右空格  trim()

2.7字符截取

从一个指定的字符串中取出里面的部分内容,使用方法:

  • 从指定位置开始一直截取到结束位置
    String str=“hello world”;          //定义字符串
    System.out.println("str.substring(6)");   //从第7个位置开始截取
    System.out.println("str.substring(0,5)");  //截取0到5位置的内容

     

  • 截取指定范围的字符串

2.8拆分字符串

public class Demo {
    public static void main(String[] args) {
     String str1="hello world";              //定义字符串
     String s[]=str1.split(" ");       //按空格进行字符串的拆分
     for(int i=0;i<s.length;i++) {       //循环输出
           System.out.println(s[i]);
     } 
    }
}

3.9大小写转换

大写变小写;小写变大写;

public class Demo {
    public static void main(String[] args) {
     System.out.println("将\"hello world\"转成大写:"+"hello world".toUpperCase());
     System.out.println("将\"HELLO WORLD\"转成小写:"+"HELLO WORLD".toLowerCase());
             
    }
}

3.10判断字符串是否以指定字符串开头或结尾

sartWith,endWith

3.11不区分大小写的比较

在String类中equals()比较,则可以使用一下的方法:方法是可以用来进行字符串比较的,但是此种比较方法的只能针对于大小写完全一样的字符串进行比较,如果现在要是想进行不区分大小写的比较,则可以使用equalsIgnoreCase(str2);

3.12字符串替换功能

replaceAll

 

java类与对象

标签:image   div   封装   的区别   span   添加   getname   ati   类与对象   

原文地址:https://www.cnblogs.com/QNaa/p/12257446.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!