类,对象,字符串
1、类和对象
类的组成:属性和行为
属性:在类中通过成员变量体现(类中方法外的变量)
行为:通过成员方法来体现(去掉static关键字即可)
1.1 类的定义
例:
手机类:
类名:phone
成员变量:
brand, price
成员方法:
call, sendMessage
public class Phone{
String brand;
int price;
}
public void call(){
}
public void sendMessage(){
}
1.2对象的使用
1.2.1创建对象
格式:类名 对象名 = new 类名();
范例:Phone p = new Phone();
1.2.2 使用对象
使用成员变量:
格式:对象名.变量名
范例:p.brand
使用成员方法:
格式:对象名.方法名()
范例:p.call()
1.3 操作
1.3.1 建一个手机类
建一个package,里面new一个class,
使用时可以再建一个文件进行使用
1.3.2 建一个学生类
测试
1.4 对象内存图
其中s1的地址给了s2,s1和s2的数据内容相同。
1.5 类变量,实例变量,类方法,实例方法
public class Person {
static String name = "张三";//被static修饰,是类变量
public int age = 30;//实例变量
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person();
p1.name = "漂亮姐姐";
p1.age = 18;
System.out.println(p1.name + " "+ p1.age);
//name变量为类变量,已经被修改。int为实例对象,沿用之前的值
Person p2 = new Person();
System.out.println(p2.name + " "+ p2.age);
p2.doing();
Person.kiss();
}
public void doing(){
System.out.println("逛街");
}
public static void kiss(){
System.out.println("羞羞");
}
}
运行结果
2.成员变量和局部变量
红色为成员变量,蓝色为局部变量
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中方法外的变量 | 方法中的变量 |
内存中位置不同 | 堆内存 | 栈内存 |
初始化值 | 有默认的初始化值 | 没有默认的初始值 |
3、封装
3.1 private
如果一个成员变量被private修饰了,外界无法直接访问。
如,在学生类中年龄设置了private,则在测试类中无法直接访问。
若想被其他类使用
例子
private 可以对测试类中想要输入的年龄进行判断,如果不合法,输出提示语句。年龄合法才会输出。
3.2 private 关键字的使用
一个标准类的编写
一个例子:建立一个类
进行测试
3.3 this 关键字的使用
3.4 封装
外界要是想访问private修饰的变量,需要用提供的外界的方法。
4. 构造方法
4.1 构造方法概述
构造方法是一种特殊的方法
4.2 构造方法注意事项
区别 | 构造方法 | 成员方法 |
---|---|---|
格式 | 构造方法与类名相同,没有返回值和返回类型 | 任意起名,必须有返回类型,可以没有返回值 |
作用 | 用于创建对象,并进行初始化 | 用于完成特定功能 |
调用 | 在创建对象时被调用,一个对象的建立,只调用一次相应的构造函数 | 由创建好的对象调用,可以调用多次 |
4.3 标准类的制作
要求
例:
//测试类
package com.lei;
public class StudentDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(40);
s1.show();
Student s2 = new Student("朱茵", 30);
s2.show();
}
}
//类
package com.lei;
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name, int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void show(){
System.out.println(name + "," + age);
}
}
2.字符串
2.1 API
应用程序编程接口
键盘录入字符串的练习
package String;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
System.out.println(line);
}
}
2.2 String
Java程序中所有的双引号的字符串,都是String的对象
2.2.1 String类的构造方法
直接赋值:
String s4 = "abc";
System.out.println("s4 " + s4);
其他赋值方法:
2.2.2 字符串的比较
使用 == 做比较
基本类型:比较数据值
引用类型:比较地址值
字符串比的也是地址值
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
String s1 = "ASDF";
String s2 = "azxc";
String s3 = "ASDF";
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
}
}
2.3 案例
案例一:用户登录
public class ScannerDemo {
public static void main(String[] args) {
//已知用户名和密码,建立两个字符串
String username = "文淑慧";
String password = "qwer";
int i;
for(i=0; i<3; i++){
//键盘录入要登陆的用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String pass = sc.nextLine();
if(name.equals(username) && pass.equals(password)){
System.out.println("log in successfully");
break;
}
else if(2-i == 0){
System.out.println("你的账户被锁定,请尽快与管理员联系!");
}
else {
System.out.println("你还有" + (2-i) +"次机会");
}
}
}
}
案例二:遍历字符串
public class traversal {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = sc.nextLine();
for(int i=0; i<s.length(); i++)
System.out.println(s.charAt(i));
}
}
使用了charAt方法:指定索引处的字符值
案例三:统计字符个数
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("please input a string:");
String s = sc.nextLine();
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
for(int i=0; i<s.length(); i++){
char ch = s.charAt(i);
if(ch>='A' && ch<='Z')
bigCount++;
else if (ch>='a' && ch<='z')
smallCount++;
else if (ch>='0' && ch<='9')
numberCount++;
}
System.out.println("Capital:" + bigCount);
System.out.println("small letter:" + smallCount);
System.out.println("number:" + numberCount);
}
案例四:拼接字符串
public class joint {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1, 2, 3};
String s = arrayToString(arr);
System.out.println("s:"+ s);
}
//定义一个方法,用于把int数组中的数据按照指定格式拼接成一个字符串返回
public static String arrayToString(int[] arr){
String s = "";
s = s+"[";
for(int i=0; i<arr.length; i++){
if(i==arr.length-1)
s = s+arr[i];
else{
s = s+arr[i];
s = s+",";
}
}
s = s+"]";
return s;
}
}
案例五:字符串反转
public class reversal {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.println("please input a string: ");
String s = reader.nextLine();
String result = reverse(s);
System.out.println(result);
}
public static String reverse(String s){
String re ="";
for(int i=0; i < s.length(); i++){
re = re+s.charAt(s.length()-1-i);
}
return re;
}
}
2.4 StringBuilder
2.4.1 String 和StringBuilder的区别
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
String str="abc";
System.out.println(str);
str=str+"de";
System.out.println(str);
代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,
2.4.2 String Builder的添加和反转方法
public class StringBuilder_learn {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
//sb.append("hello ");
//sb.append("world ");
//sb.append("java ");
//sb.append(100);
//链式编程
sb.append("every ").append("thing ").append("is ").append("going ").append("well");
System.out.println("sb:"+sb);
sb.reverse();
System.out.println("sb:" + sb);
}
}
2.4.3 StringBuilder 和String相互转换
StringBuilder里有两个好用的方法,append() 和 reverse()
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
sb.append("hello");
String s = sb.toString();
System.out.println(s);
String s = "hello-";
StringBuilder sb = new StringBuilder(s);
System.out.println(sb);
}
}