javaSE面向对象初级01

Posted 少侠gqk

tags:

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

作者:gqk


面向对象(OOP):

  什么是面向对象:万物皆是对象(扯淡)

  面向对象是一种编程思想,事物都有自己的属性,方法,以人为的思想来解决我们开发中的问题

  面向对象的特征:

       封装性:保证对外部不可见。   
       继承性:继续发扬广大; 提高代码的重复使用  
       多 态 性:就属于变来变去;

类与对象(重点)

 在整个的面向对象之中,实际上最重要的就是类与对象的关系,

既然类和对象是核心的基础部分,那么两者之间存在着怎样的关系呢?

类:类是一组共性的产物,是同一类事物的集中表现。 

对象:是一种个性的体现,是个体的产物。  对象中的所有操作行为都由类决定,所以,在使用中只要是类定义出的操作对象都可以应用,而如果类没有定义出 的操作,对象肯定无法使用

类是对象的模板,对象是类的实例

类与对象的使用:

在 Java 中可以使用 class关键字来定义一个类,在类中有两大组成部分:属性(变量)、 方法。(分析内存地址)

 


 

  那么下面来进一步分析以上代码的每一步操作: · 对象产生:Person per = new Person() ; 既然存在了关键字 new,而且类又属于引用数据类型,那么肯定现在 就开辟了相应的栈及堆内存空间,而且以上的代码可以拆分成两步:

|- 声明对象:Person per = null ;     在 栈内存中声明 

|- 实例化对象:per = new Person() ;     开辟对应的堆内存空间 

 

只要存在了关键字 new 就表示永远会 开辟新的内存空间

 栈内存保存的是对堆内存的引用地址,而堆内存中保存的是每一个对象所拥有的属性,而全局代码区之中保存的是 所有类中的方法,表示公共调用

对象的引用传递(重点)

所谓的引用传递指的就是一个堆内存空间,可以同时被多个栈内存所指向, 那么类本身也是一样的,即:一块堆内存可以同时被多个对象所同时指向(演示内存传递)

 

public class OODemo04 {
    public static void main(String args[]){
    Person per1 = null ; 
    Person per2 = null ;
    per1 = new Person() ; // 实例化 
    per2 = per1 ;   // 引用传递 
    per1.name = "张三" ; 
    per2.age = 20 ; 
    per1.tell() ; 
 } };

 情况比较特出:画图演示 不被引用的交给 gc处理

 

 

 封装性(重点)


装性属于面向对象的第一大特性,所谓的封装性就是指类内部的定义对外部不可见。

以后只要是属性就必须进行封装,封装之后的属性必须通过 setter 和 getter 设置和取得。

 

 强调:在一个类中所有的方法是允许互相调用的,如果非要强调是本类中的方法的话,则在调用的方法前增加一个 “this”关键字,表示的是本类中的方法。

 

 构造方法(重点)


构造方法的定义:在一个类中定义的方法名称与类名称相同,且无返回值声明的方法,称为构造方法。

Person per = new Person() ;

以上的 Person()就表示的是一个构造方法,此构造方法属于默认的构造方法。

所有的构造方法是在对象使用关键字 new 进行实例化的时候调用的,而且每次使用关键字 new 开辟新的 堆内存空间时,构造方法都要被调用。

当一个类中已经明确的定义了一个构造方法的时候,则无参构造方法将不再自动生成,也就是说一个类永远都会保 证至少有一个构造方法

 构造方法的作用:

  对象的创建;

  属性的初始化;

匿名对象:匿名对象就是表示没有名字的对象。

public class NonameDemo { 

  public static void main(String args[]){ 

    new Person("张三",30).tell() ; 

  } };


 

题目(重点)

现在要求实现一个雇员的操作类,里面包含雇员编号、姓名、基本工资、奖金,要求可以输出一个雇员的完整信息, 可以求出一个雇员的年薪、月薪、日平均工资,计算工资的时候要加上奖金

String 类(重点):特殊的引用数据类型;

String 在使用中有两种实例化的方法,

第一种是采用直接赋值(将字符串赋 String 的对象)

第二种方法是通过构造方 法完成实例化的操作

字符串的比较(重点)

 观察一下代码

两个数字之间直接使用==进行判断即可,但是,==也同样可以应用在 String上。

画图分析下图结果

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String str1 = "hello" ;
		String str2 = new String("hello") ;
		String str3 = str2 ;  
		System.out.println("str1 == str2 --> " + (str1==str2)) ; // false  
		System.out.println("str1 == str3 --> " + (str1==str3)) ; // false 
		System.out.println("str2 == str3 --> " + (str2==str3)) ; // true 
		}; 
	}

所以“==”用在数值上表示判断是否相等,如果是用在了对象上,则表示的是判断两个对象的地址是否相等。

如果现在要是想进行内容比较的话,则就只能靠 String 类提供的方法完成了。

两种比较的区别:==和 equals()  · ==:用于数值比较,比较的是两个字符串的地址值  · equals():用于内容的比较,比较两个字符串的内容是否相等

两种实例化的区别 

 

 之所以内容会相等,是因为在 JAVA 底层中存在了一个字符串的对象池,每次的内容都会从池中取出,如果内容已经 存在了,则使用已经存在的,如果不存在,则会生成一个新的,放入池中,属于共享设计模式。  由于这种原因,只要是使用 String类的话,永远都要采用直接赋值的方式完成。

 字符串的内容一旦声明则不可改变(画图解释下面程序)

 通过内存图可以发现一点,每一个字符串的内容原本并没有发生任何的改变,改变的是只一个字符串的内存地址的 指向,而且操作完成之后会发现有很多的垃圾产生,所以,以后对于频繁修改字符串的代码应该尽可能的回避


String 类的相关操作(重点)

 在实际的开发中,String类的使用是最频繁的,而且在 String类中提供了大量的操作方法,这些操作方法对于程序的 开发都是非常有帮助的,所以必须把该背的都背下来。  所有的方法都是在 JDK 的 doc 文档之中存在的

字符串与字符数组

字符串和字符数组的转换

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String str = "helloWorld";
		char c[] = str.toCharArray();//将字符串转化为字符数组
		for(int x=0;x<c.length;x++){ 
			System.out.println(c[x]+",");
		}
		 System.out.println("\\n" + new String(c)) ; //将字符数组转化为字符串
		 System.out.println(new String(c,0,5)) ; //输出字符串c从第0个输出5个字符
		}; 
	}

取出指定位置的字符

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String str = "helloWorld";
		System.out.println(str.charAt(0));
		System.out.println(str.charAt(1));
		}; 
	}

字符串比较

之前已经讲解过了字符串的比较方法使用的是 equals()但是,这种比较的方法本身是区分大小写的,所以如果不区分 大小写,可以使用如下的方法完成

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String str = "helloWorld";
		System.out.println(str.equals("helloWorld"));
		System.out.println(str.equalsIgnoreCase("HELLOwORLD"));
		}; 
	}

字符串截取 

 

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String str = "helloWorld123";
		System.out.println(str.substring(5));//World123
		System.out.println(str.substring(2, 5));//llo
		}; 
	}

判断字符串是否存在

indexOf(String str)示例

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String email = "272247284@qq.com";
		if(email.indexOf("@")!=-1){
			System.out.println("@出现的位置为:"+email.indexOf("@"));
		}else{
			System.out.println("格式有问题");
		}
		}; 
	}
package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String email = "272247284@qq.com";
		if(email.indexOf("@",10)!=-1){
			System.out.println("@出现的位置为:"+email.indexOf("@"));
		}else{
			System.out.println("格式有问题");
		}
		}; 
	}

contains()方法,可以直接判断是否存在

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String email = "272247284@qq.com";
		System.out.println(email.contains("qq"));
		}; 
	}

字符串拆分

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String str = "h,e,l,l,o,w,o,r,l,d";
		String[] newstr = str.split(",");
		for(String s : newstr){
			System.out.println(s);
		}
		}; 
	}

试着拆分ip地址;192.168.85.30

当拆分特殊字符的时候 需要添加转义符号“\\\\”

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String str = "192.168.1.3" ; 
		String[] newstr = str.split("\\\\.");
		for(String s : newstr){
			System.out.println(s);
		}
		}; 
	}

 字符串替换

package demo;
public class StringDemo04 { 
	public static void main(String args[]){
		String str = "helloworld" ; 
		System.out.println(str.replaceAll("l", "@"));
		System.out.println(str.replaceFirst("l", "@"));
		}; 
	}

其他操作  

题目:

  1、 要求将以下的内容进行拆分显示  · 原始内容: “张三:30 | 李四:20 | 王五:25”  ·

      显示结果: 姓名:张三,年龄:20

  2、 判断一个 email地址是否合法  ·

     提示:只需要判断@和.即可

   

对象数组(重点)

4、总结
1、 面向对象的三大特性的概念必须理解;

2、 类与对象的关系,类的组成、对象的使用、引用传递、垃圾的产生;

3、 使用 private可以对属性或方法进行封装,只要是属性就必须封装,封装之后的属性必须使用setter 和 getter;

4、 当一个新对象实例化的时候要调用构造方法,构造方法名称与类名称相同,无返回值声明,而且一个类中至少保留 一个构造方法,如果任何一个构造方法都没有定义的话,则会自动生成一个无参的,什么都不做的构造;

5、 String类的各个特点及常用的方法(名称、参数的类型及含义、作用);

6、 对象数组

预习任务 

面向对象基础部分,深入引用传递的使用、this关键字、static关键字、内部类  

  

  

  

 

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

python 面向对象(初级)

python面向对象初级

Python 面向对象(初级篇)

面向对象编程其实很简单——Python 面向对象(初级篇)

Python 面向对象(初级篇)

Python 面向对象(初级篇)