1、4 第四天 魔乐java基础视频学习笔记1、课程名称:面向对象2、知识点2.1、上次课程的主要知识点1、String类的主要特点: String类的对象由两种实例化方式; |.方式一:直接赋值,只开辟一块堆内存空间,并且对象可以入池; |.方式二:构造方法,开辟两块堆内存空间,有一块将成为垃圾,不会自动入池,使用intern()方法手工入池; String对象的比较方法: |.=:比较的是两个字符串对象的内存地址数值; |.equals():字符串内容比较; 字符串对象一旦声明,则内容不可改变,改变的只能是字符串对象的地址指南。2、String类的常用方法:所有的方法要记住返回值类型、方法名称
2、、参数的类型及个数。 字符与字符串: |.【构造方法】将全部字符数组变为字符串:public String(char data); |.【构造方法】将部分字符数组变为字符串:public String(char data,int offset,int count); |.【普通方法】取得指定索引位置上的字符:public char charAt(int index); |.【普通方法】将字符串变为字符数组:public char toCharArray(); 字节与字符串: |.【构造方法】将全部字节数组变为字符串:public String(byte data); |.【构造方法】将部分字节
3、数组变为字符串:public String(byte data,int offset,int count); |.【普通方法】将字符串变为字节数组:public byte getBytes(); |.【普通方法】转码操作:public byte getBytes(String charset) throws UnsupportEncodingException 字符串替换: |.【普通方法】全部替换:public String replaceAll(String regex,String str); |.【普通方法】替换首个:public String replaceFirst(String
4、regex,String str); 字符串查找: |.【普通方法】查找是否包含指定的内容:public boolean contains(string str); |.【普通方法】查找指定字符串的位置:public int indexOf(String str); |.【普通方法】从指定位置向后查找指定字符串位置:public int indexOf(String str,int begin); |.【普通方法】由后向前查找指定字符串的位置:public int lastIndexOf(String str); |.【普通方法】从指定位置由后向前查找指定字符串位置:public int la
5、stIndexOf(String str,int begin); |.【普通方法】判断是否以指定的字符串开头:public Boolean startsWith(String str); |.【普通方法】从指定位置判断是否以指定的字符串开头:public Boolean startsWith(String str,int be); |.【普通方法】判断是否以指定的字符串结尾:public Boolean endsWith(String str); 字符串截取: |.【普通方法】从指定位置截取到结尾:public String substring(int begin); |.【普通方法】截取指定
6、范围:public String substring(int begin,int end); 字符串拆分: |.【普通方法】全部拆分:public String split(String regex); |.【普通方法】拆分成指定个数:public String split(String regex,int limit); 字符串比较: |.【普通方法】区分大小写比较:public boolean equals(String str); |.【普通方法】不区分大小写比较:public boolean equalsIngoreCase(String str); |.【普通方法】比较字符串大小:p
7、ublic int compareTo(String str); 其他方法: |.【普通方法】判断是否是空字符串:public boolean isEmpty(); |.【普通方法】取得字符串长度:public int length(); |.【普通方法】转大写:public String toUpperCase(); |.【普通方法】转小写:public String toLowerCase(); |.【普通方法】去掉左右空格:public String trim(); |.【普通方法】字符串连接:public String concat(String str); |.【普通方法】手工入池:
8、public String intern()。3、this关键字,三个主要功能: this.属性:表示本类中的属性; this.方法():本类方法、this():本类构造,但是本类构造在调用的时候只能放在构造方法的首行; ths表示当前对象。4、引用传递给了三个题目,这三个代码和之前讲解的对象引用操作要一起去理解;5、对象比较:是一个类自己本身所具备的功能。2.2、本次预计讲解的知识点1、static关键字;2、内部类;3、引用传递深入。3、具体内容3.1、static关键字(重点) 这个关键字一直在见到,从未被真正使用过,而在Java中,static关键字可以用于定义属性及方法。3.1.1、
9、使用static定义属性 在讲解static定义属性操作之前,首先编写如下程序。范例:现在定义一个表示北京人的操作类,所有人所在的城市都是北京。 class Person private String name ; private int age ; String country = 北京 ; public Person(String name , int age ) this.name = name ; this.age = age ; public String getInfo() return 姓名:+this.name+,年龄:+this.age+,城市:+this.country;
10、public class TestDemo public static void main (String args) Person per1 = new Person(张三,20); Person per2 = new Person(李四,21); Person per3 = new Person(王五,22); System.out.println(per1.getInfo(); System.out.println(per2.getInfo(); System.out.println(per3.getInfo(); 那么,以上的程序的内存分配图如下: 很明显,现在不管有多少个Person
11、对象,那么所有的country属性都应该是相同的内容,那么现在请思考一下,如果有一天时光穿越了,北京变为燕京了,这个时候如果Person类已经有5000W个对象产生了,你认为此时的代价是什么? 5000W个Person对象都要修改country内容,那么如果按照修改一个对象的country属性内容要花费1ms来计算,那么5000W个对象的修改时间是5000WS=很多分钟,那么现在就可以发现问题: country属性应该是一个公共的内容,但是以上代码是将其分配给了每一个对象; 对country属性维护的时候要考虑的对象太多了,也不方便。所以,如果要想将country与普通属性相区分,并且表示公共
12、的概念,则应该使用static关键字完成。class Person private String name ; private int age ; static String country = 北京 ;/此处暂时不封装 public Person(String name , int age ) this.name = name ; this.age = age ; public String getInfo() return 姓名:+this.name+,年龄:+this.age+,城市:+this.country; public class TestDemo public static v
13、oid main (String args) Person per1 = new Person(张三,20); Person per2 = new Person(李四,21); Person per3 = new Person(王五,22); per1.country = 燕京; System.out.println(per1.getInfo(); System.out.println(per2.getInfo(); System.out.println(per3.getInfo(); 那么,现在一个对象对country属性所做的修改,一定会影响到其他对象,但是这里有一个问题了,既然使用了st
14、atic定义的属性表示的是公共属性,那么如果现在由某一个对象修改是不合适的,应该由所有对象的集合的最大代表,就是类了,即:static属性最好的调用,是通过“类名称.static属性”的方式来完成。Person.country = 燕京;/类.属性 通过本程序,就应该清楚以下几点: 使用static定义的属性不在堆内存之中保存,保存在全局数据区; 使用static定义的属性表示类属性,类属性可以由类名称直接进行调用; static属性虽然定义了在类之中,但是其可以在没有实例化对象的时候进行调用(普通属性保存在堆内存里,而static属性保存在全局数据区之中);提示:在以后的开发之中,首先想到的
15、不是static属性,而是普通属性。3.1.2、使用static定义方法 除了使用static定义属性之外,方法上也可以使用static进行定义,那么很明显,使用static定义的方法也可以在没有实例化对象产生的情况下由类名称直接进行调用。class Person private String name ; private int age ; private static String country = 北京 ; public Person(String name , int age ) this.name = name ; this.age = age ; public static vo
16、id setCountry(String c) country = c; public static String getCountry() return country ; public String getInfo() return 姓名:+this.name+,年龄:+this.age+,城市:+this.country; public class TestDemo public static void main (String args) Person.setCountry(燕京); System.out.println(Person.getCountry(); Person per1
17、 = new Person(张三,20); System.out.println(per1.getInfo(); 以上的代码如果单独观察应该都不难理解,主要都是由于static定义的特殊性所决定的,但是现在的类之中就比较热闹了,因为分成了两派:static派、非static派,而对于方法的操作有如下两个定义: static定义的方法不能调用非static的方法或属性; 非static定义的方法可以调用static的属性或方法。讨论:为什么要有这样的限制呢? 使用static 定义的属性和方法,可以在没有实例化对象的时候使用; 非static定义的属性和方法,必须实例化对象之后才可以进行调用。3
18、.1.3、主方法 在讲解主方法之前,首先来思考一下小小的区别:在讲解Java方法定义的格式给过以下的格式:如果一个方法在主类之中定义,并且由主方法直接调用的时候,那么前面必须有public static。public static 返回值类型 方法名称(参数列表) return 返回值;范例:观察代码public class TestDemo public static void main (String args) print(); /直接调用 public static void print() System.out.println(Hello World !); 按照之前所学的概念来讲,
19、此时,表示的是一个static方法调用其他的static方法,但是如果这个时候的print()方法上没有static呢?所有的非static方法几乎都有一个特点:方法要由实例化对象调用。public class TestDemo public static void main (String args) new TestDemo().print(); public void print() System.out.println(Hello World !); 那么现在继续来观察主方法的组成,可以发现里面有很多的关键字: public:是一种访问权限,表示公共; static:此方法由类名称直接
20、调用,执行类:java类名称; void:主方法是一切的开始; main:系统规定的一个方法名称,执行类的时候默认找到此名称; String args:表示的是一些运行时参数,通过字符串接收。范例:接收参数public class TestDemo public static void main (String args) for ( int x = 0 ; x args.length ; x+ ) System.out.println(argsx); 所有的属性在执行类的时候使用空格分隔,例如:java TestDemo 参数 参数 参数 .但是,由于在默认情况下空格作为参数的分隔符,那么如
21、果现在要输入的参数本身之中存在空格呢?那么这些参数上就可以使用“”声明:java TestDmo “hello world” “hello world”。3.1.4、static关键字的使用 在实际的工作之中,使用static的原因有二: 希望可以在没有实例化对象的时候可以轻松的执行类的某些操作; 现在希望表示出数据共享的概念。范例:统计出一个类产生的实例化对象个数。 一个类肯定可以有多个实例化对象产生,那么现在希望增加一个统计操作,可以统计出一个类之中的所产生的实例化对象的个数。如果现在要产生新的实例化对象,则一定会调用类中的构造方法,所有可以在构造方法中增加统计,并且这个统计的变量,应该是
22、所有对象共享的, class Person private static int count = 0 ; public Person() System.out.println(对象个数:+ +count); public class TestDemo public static void main (String args) new Person(); new Person(); new Person(); 范例:为类的属性自动命名例如,在一个类之中可能会有多个构造方法,那么假设类之中存在了一个name属性,要求这个属性一定要有内容,即:如果用户调用了无参构造方法,那么name也需要有一个具体
23、的内容出现,所以这个时候就可以利用static完成。class Book private static int count = 0 ; private String title ; public Book() this(NOTITLE- + count+); public Book(String title) this.title = title ; public String getTitle() return this.title ; public class TestDemo public static void main (String args) System.out.println
24、(new Book().getTitle(); System.out.println(new Book(Java SE).getTitle(); System.out.println(new Book().getTitle(); 以上的两个代码只是为了说明static声明变量的特点,实际之中基本很少去这样使用,不过如果出现了类似的应用,应该能够反应出来其实现的基本原理。3.2、代码块(了解) 代码块是在程序之中使用“”定义起来的一段程序,而根据代码块声明位置以及声明关键字的不同,代码块一共分为四种:普通代码块、构造块、静态块、同步块(暂时不讲解)。3.2.1、普通代码块 普通代码块是定义在方法
25、之中的代码块public class TestDemo public static void main (String args) if(true) int x =10; /局部变量 System.out.println(x=+x); int x = 100 ;/全局变量 System.out.println(x=+ x); 普通代码块就是if取消public class TestDemo public static void main (String args) /普通代码块 int x =10; System.out.println(x=+x); int x = 100 ; System.
26、out.println(x=+ x); 几乎用不到的,知道就行了。3.2.2、 构造块 普通代码块是定义在方法之中的,而构造块是定义在类之中的代码块。class Person public Person() System.out.println(构造方法。); /构造块 System.out.println(构造块。); public class TestDemo public static void main (String args) new Person() ; new Person(); new Person(); 可以发现,构造块优先于构造方法执行,而且每当有一个新的实例化对象产生的
27、时候,就会出现构造块的执行。3.2.3、静态块 静态块也是定义在类之中的,如果一个构造块上使用了static关键字进行定义的话,那么就表示静态块,但是静态块要考虑两种情况: 情况一:在非主类之中定义的静态块:class Person public Person() System.out.println(构造方法。); /构造块 System.out.println(构造块。); static System.out.println(静态块。); public class TestDemo public static void main (String args) new Person() ; n
28、ew Person(); new Person(); 静态块。构造块。构造方法。构造块。构造方法。构造块。构造方法。可以发现,静态块优先于构造块执行,而且不管有多少个实例化对象产生,静态块只调用一次。情况二:在主类中定义的静态块。public class TestDemo static System.out.println(静态块。); public static void main (String args) System.out.println(Hello World); 在主类之中的静态块优先于主方法执行,那么既然静态块有这个特点,实际上就可以简单的修改一下。有意思的操作:不使用主方法输
29、出“Hello World”。public class TestDemo static System.out.println(Hello World); System.exit(1); 3.3、思考题 要求完成一个系统的登录程序,通过初始化参数输入用户名和密码,如果用户名是“mldn”,密码是“hello”,则显示欢迎光临的信息,如果不是则显示登录失败的信息。 设计的时候多考虑一下类的组成结构,以及可能出现的问题。 如果说现在什么都不考虑,代码编写如下:public class TestDemo public static void main(String args) if (mldn.equals(args0)&hello.equals(args1) System.out.println(用户登录成功!); else S
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1