面向对象day1
正式开始学习对象!!!
有点囫囵吞枣…感觉还有很多的原理没弄懂
对象的执行原理
先把Test.class的main放在到方法区,遇到"Student s1=new Student()"时将Student的类加载到方法区中,并在栈中产生一个Student类的s1指针,在堆中创建Student的对象,将栈中的s1指针指向堆中的该对象(存放对象在堆的地址),同时堆中的对象也会有一个类地址指向方法区中的Student类。s1为引用类型
需要用类中的方法时,先通过栈中的对象指针找到堆中的对象,在通过堆中的对象的堆指针找到方法区的对应类的方法。
类的注意事项
-
类的名字应该首字母大写并应用驼峰原则(与变量和方法的命名方法不同),如 ImageCar,GoodPerson
-
一个代码文件中,可以写多个class,但只能有一个class用public修饰,并且public修饰的类名必须要成为代码的文件名
-
当堆中一个对象没有任何变量指向它时就会被认为垃圾对象,与C++不同,java有自动垃圾回收机制,会自动清除垃圾对象!!!!
this指针
- 在类中的方法中,this指向堆中的当前类的对象 与c++类似,主要用来解决变量名字冲突
在编译中,编译器会自动往用到了this指针的方法中添加形参 类名 this,当使用时,就把当前的对象当作this参数填入方法中:
构造器
- 与c++的构造函数类似,不写构造器时,java自动生成一个无参构造器
- 一旦定义了有参构造器,java就不会自动生成无参构造器,需要自己手写一个无参构造器
封装 (面向对象的三大特性:封装、继承、多态)
c++学过,有点忘了…
- 当用类设计对象处理某个事物时,需要把处理的数据,和处理这些数据的方法放到一个对象中去,就叫封装
- 封装的设计规范:合理隐藏和合理暴露
- 将变量隐藏起来(private),将处理这些变量的方法暴露(public) Java中声明类的成员变量和成员方法时不加修饰词private,默认为public
JavaBean (实体类)
-
实体类的定义:
-
实体类中的成员变量都要是私有的,并向外提供对应的get()和set()
-
并且类中必须要有一个公共的无参构造器
-
-
IDE中构造器和set()|get()方法都可以自动生成,generat->Constructor|Getter and Setter
-
实体类只是用来保存某个事物的数据,将处理这个实体类的方法封装到另外一个类中,如class 实体类Operator(){},以此来实现数据和数据业务进行分离
成员变量与局部变量的区别
- 成员变量在类中;局部变量在方法中
- 成员变量有默认值,无需初始化;局部变量没有默认值,使用前需要初始化
- 成员变量在堆中;局部变量在栈中
- 成员变量随对象同生同死;局部变量与方法或所属大括号内同生同死
包(package)
之前学过一点,现在学更具体一点
-
同一个包下的class可以直接访问
-
需要访问其他包下的文件需要导入包才可以,eg: import java.until.Arrays
-
访问多个包下的同一名字的class,第一个可以不写包名,后面一定要带,java默认只能导入一个程序
java中的基本数据类型一定存储在栈中吗?
不一定。
- 当是在方法中声明的变量,即使局部变量时,每当程序调用该方法时,都会为其创建一个方法栈,其所在方法中声明的变量就在方法栈中,方法栈随方法结束而消失,所以局部变量只能存在方法中。
- 当是基本类型的变量时,其变量名和值存储在方法栈中
- 而当是引用类型时,方法栈中存储对象的地址,对象存储在堆中
- 当时在类中声明的变量时,即全局变量。
- 当是基本类型时,其变量名和值存储在堆中
- 当是引用类型时,栈中存储对象的地址,对象存储在堆中
String类
-
2种创建String对象的方法
- 直接String a=“string”,直接用双引号赋值
- new String(“string”),用new来创建对象,输入的参数也可以是char[],或者byte[]
-
String常用的函数
package src.string; public class string_samples { public static void main(String[] args) { String str="test"; char t=str.charAt(0); System.out.println(t); // str.length().fori 简便写更快速 for (int i = 0; i < str.length(); i++) { } //把字符串转变成字符数组 char[] chars=str.toCharArray(); for (int i = 0; i < chars.length; i++) { System.out.println(chars[i]); } //比较内容 String str1="Leo"; String str2=new String("Leo"); System.out.println(str1==str2); //比较指针内容,地址不一样所以显示false System.out.println(str1.equals(str2));//比较字符串内容,内容相同true String str3="leo"; System.out.println(str1.equalsIgnoreCase(str3)); //忽略大小写比较,显示true //截取字符串 String str4="我享受大大大大的一个"; System.out.println(str4.substring(0,6));//从0的位置截取到6 System.out.println(str4.substring(5));//从5截取到末尾 //替换字符串 String str5="我擦擦擦擦"; String str6=str5.replace("擦","**"); System.out.println(str6); //判断字符串是否包含某个关键字 String str7="没事的,我爱你"; System.out.println(str7.contains("爱")); //注意这是大小写敏感 //判断字符串是否以某个字符串开头 System.out.println(str7.startsWith("没事的")); //把字符串按照某个指定内容分割成多个字符串,放到一个字符串数组中返回 String str8="我,你,我,他说的,真的"; String[] s=str8.split(","); for (int i = 0; i < s.length; i++) { System.out.println(s[i]); } } }