目录
面向对象三大特性
封装、继承、多态
封装
定义:
就是将一个血细节信息隐藏起来,对于外界不可见,
将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过
该类提供的方法来实现对隐藏信息的间接操作和访问。
封装在java中的体现:
1.方法就是一种封装
2.关键字private
封装的步骤:
1.属性私有化
2.给每个属性提供setter和getter方法
public class Demo1 {
public static void main(String[] args) {
//创建对象
// Student student = new Student();
student.name="stu1";
// student.setAge(-20);
//
// System.out.println(student.getAge());
Person person = new Person();
System.out.println(person);
person.sayHello("stu2");
System.out.println("=================");
Person p=new Person();
System.out.println(p);
p.sayHello("stu3");
}
}
构造方法(构造器)
是专门用来创建对象的方法,当通过关键字new来创建对象时,本质上就是在调用构造方法
格式:
格式:
public 类名称(参数列表 参数名称){
方法体
}
public class Demo2 { public static void main(String[] args) { Penguin penguin = new Penguin("草莓", "Q仔", 89, 34); penguin.selfInfo(); } }
注意:
1.构造方法的名称必须和所在类名完全一样,大小写敏感
2.构造方法不要写返回值类型,void都不写
3.构造方法不能return一个具体的返回值
4.如果没有编写任何构造方法,那么编译器将会有一个默认的构造方法,没有参数、方法体
5.一旦编写了至少一个构造方法,那么编译器不再有默认值,要使用无参构造则需要手动创建
6.构造方法也是可以进行重载的
局部变量和类的成员变量
当局部变量和类的成员变量重名时,就近原则,优先访问使用局部变量
如果需要访问本类中的成员变量,需要使用this关键字
this.成员变量
【通过谁调用的方法,谁就是this】this就是当前对象
访问private成员变量
间接访问private成员变量,就是定义一对儿setter、getter方法
对于Getter来说,不能有参数,返回值类型和成员变量要对应
对于Setter来说,不能有返回值,参数类型和成员变量对应
对于基本类型中的boolean值,Getter方法一定要写成isXxx的形式,而Setter规则不变
Javabean
public class Student {
private String name;//姓名
private int age;//年龄
private boolean male;//是否是男生
public Student(){//无参构造
}
//有参(所有参数)构造
public Student(String name,int age,boolean male){
this.name = name;
this.age = age;
this.male =male;
}
public void showInfo(){
System.out.println("自我介绍方法!");
}
public void setMale(boolean male){
this.male=male;
}
public boolean isMale(){
return male;
}
public void setName(String name){
this.name =name;
}
public String getName(){
return name;
}
}
包
作用
允许类组成较小的单元(类似文件夹),易于找到和使用相应的文件
防止命名冲突区分名字相同的类
有助于实施访问权限控制
包的命名规范
1.包名由小写字母组成,不能以圆点开头或结尾
2.包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名
net.java.project
3.包名后续部分依不同的机构内部的规范不同而不同
JDK提供的包
java.lang:虚拟机自动引入
java.util:提供一些使用类
java.io:输入、输出
package cn.zhm;//必须位于第一行(忽略注释) //只允许有一个package
import java.util.*; //导入java.util包中的所有的类
static关键字
静态的
对于每个人来说,地球是唯一的,是我们公有的
静态变量:大家共有的
普通变量:每个人都有属于自己的
static修饰 | 非static修饰 | |
---|---|---|
属性 | 类属性、类变量 | 实例属性、实例变量 |
方法 | 类方法 | 实例方法 |
调用方法 | 类名.方法名、对象名.方法名【不推荐】 | 对象名.方法名 |
归属 | 类 | 单个对象 |
一旦使用static关键字修饰成员方法,就会成为静态方法,静态方法不属于对象,而是属于类
如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用
无论是成员变量,还是成员方法,如果有了static,都推荐使用类名进行调用
静态变量:类名.静态变量
静态方法:类名.静态方法
public class DemoStatic {
int num;//成员变量
static int numStatic;//静态变量
public void method(){
System.out.println("普通的方法!");
//成员方法中访问成员变量
System.out.println(num);
//成员方法中访问静态变量
System.out.println(numStatic);
}
public static void methodStatic(){
System.out.println("静态方法!");
//静态方法中【不可以】访问成员变量
// System.out.println(num);
//静态方法中【可以】访问静态变量
System.out.println(numStatic);
//静态方法中不可以使用this
// System.out.println(this);
}
}
注意事项:
1.静态只能访问静态,不能直接访问非静态
【原因:】因为在内存中是【先】有的静态内容,【后】有的非静态内容
2.静态方法中不能用this
【原因:】this代表当前对象,通过谁调用,谁就是this
静态代码块:
特点:
当第一次用到本类时,静态代码块执行唯一依次
静态内容总是优先于非静态,所以静态代码块比构造方法先执行
静态代码块典型用途
用来一次行对静态成员变量进行赋值
public class Demo1 {
static {
System.out.println("静态代码块");
}
public Demo1() {
System.out.println("构造方法");
}
}
静态代码块在内存中的运行图
API(jdk)
Application Programming Interface,应用程序编程接口。java API是一本程序员字典,是JDK提供给我们使用类的说明文档,这些类将底层的代码封装起来,我们不需要关注如何具体实现,只需要会使用即可。
String类
java.lang:lang是language的缩写
Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。
其实就是说,程序中的所有的字符串,都是String类的对象,(就算没有new,也是)
字符串的特点:
1.字符串的内容永不改变【重点】
2.正是因为字符串不可改变,所以字符串是可以共享使用。
3.字符串效果上相当于char[]字符数组,但是底层原理byte[]字节数组
创建字符串的常见3+1种方式:
3种构造方式:
public String():创建一个空白字符串,不含有任何内容
public String(char[] arr):根据字符数组的内容,来创建对应的字符串
public String(byte[] arr):根据字节数组内容,来创建对应的字符串
1种直接创建
String str="helloStr";
public class Demo1String {
public static void main(String[] args) {
}
public void test(){
//使用空参构造
String str1 = new String();
System.out.println(str1);
//根据字符数组创建字符串
char data[] = {'a', 'b', 'c'};
String str2 = new String(data);
System.out.println("第2个字符串是:"+str2);
//根据字节数组创建字符串
byte[] bytes={97,98,99};
String str3 = new String(bytes);
System.out.println("第3个字符串是:"+str3);
//获取字符串的长度
System.out.println(str3.length());
//equals():用于比较两个字符串对象的内容是否一样
System.out.println(str2.equals(str3));//true
System.out.println(str2==str3);//false
//String 重写了equals() 变成了比较字符串的内容,
// ==依然比较的是两个字符串是否是同一个对象
str2.equalsIgnoreCase(str3);//忽略大小写比较内容
System.out.println(str2.toUpperCase());//ABC 转大写
System.out.println(str2.toLowerCase());// 转小写
}
}
比较相关的方法
.length
.equals();
获取相关的方法
获取相关的方法:
int length():获取字符串的长度
String concat(String str):将当前字符串和参数字符串拼接成一个新的字符串返回
char charAt(int index):获取指定索引位置的单个字符(索引从0开始)
int indexOf(String str):查找参数字符串在本字符串中首次出现的索引位置,如果没有,返回-1值
public void getMethod(){
//拼接字符串
String str1="hello";
String str2="world";
String str3 = str1.concat(str2);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);//新的字符串
//获取指定索引位置的单个字符(索引从0开始)
char c = "Hello".charAt(1);
System.out.println(c);//e
//查找参数字符串在本字符串中首次出现的索引位置
String orgStr="helloworldhelloword";
int index1 = orgStr.indexOf("lloq");
int index2 = orgStr.indexOf("llo");
System.out.println(index1);//-1
System.out.println(index2);//2
}
截取相关的方法
String substring(int index):截取从参数位置一直到字符串末尾,返回新字符串
String substring(int begin,int end):截取从begin开始,到end结束的中间字符串
(begin,end) 左闭右开
String[] split(String regex):按照参数的规则,将字符串分割成若干个部分
注意:如果按照英文句点"."进行分割,必须写"\.";
public void splitMethod(){
String str1="helloworld";
String str2 = str1.substring(5);
System.out.println(str2);//world
System.out.println(str1);//helloworld
String str3 = str1.substring(4, 7);
System.out.println(str3);//owo
String str4="aaa.bbb.ccc";
String[] arr = str4.split("\\.");
for (String s : arr) {
System.out.println(s);
}
转换相关的方法
char[] toCharArray():将当前字符串拆分为字符数组返回
byte[] getBytes():获得当前字符串底层的字节数组String replace(char oldChar,char newChar):
将所有出现的老字符替换为新字符
public void convertMethod(){
//转换为字符数组
char[] chars = "Hello".toCharArray();
System.out.println(chars[0]);
System.out.println(chars.length);
//转换为字节数组
byte[] bytes = "abc".getBytes();
System.out.println(bytes[1]);
//replace
String str3="How do you do?";
String str = str3.replace("o", "*");
System.out.println(str);
}