Java回顾第四章

懒懒张187 2021-04-20 12:02:43
每种修饰符的作用范围
private:只能在本类中使用
默认(不写):能在本类中使用,又能在本包的其他类中使用
protected:本类、本包、不同包子类中使用
Public:任意包、任意类都可使用
需要注意:
1.private使用:定义成员变量需要私有
2.public使用:定义成员方法、构造方法、定义类
代码块

/**
代码块:被{}包裹起来的代码叫代码块
局部代码块:写在方法中的代码块
构造代码块:写在成员位置(类中,方法外)的代码块
静态代码块:写再成员位置(类中方法外)被static修饰的代码块
*/
public class DemoStudent{
public static void main(String[] args){
/**
局部代码块作用:修饰变量的作用域提高效率
变量作用域:在变量所在的{}范围内有效,出了作用域,就会被垃圾回收
*/
{
int a = 10;
System.out.println(a);
}
//System.out.println(a); //cannot resolve 'a'

System.out.println(s1.getName()+"\t"+s1.getAge()+"\t"+s1.getSex());
Student s2 = new Student();
System.out.println(s2.getName()+"\t"+s2.getAge());
Student s3 = new Student("李四",20);
}
}

public class Student{
private String name;
private int age;
private static String sex;
/**
构造代码块的特点:优先构造执行,每创建对象一次,就会执行一次
作用:1.可以成员变量赋值
2.可以把每个构造方法中共性的代码提取出来,写在构造代码块中
需求:无论是使用空参数|满参数构造方法创建对象,都先打印10次HelloWord
*/
{
this.name = "张三";
this.age = "18";
System.ouut.println("构造代码块");
//构造方法中的共性代码块
/** for(int i = 0; i < 10; i++){
System.out.println("HelloWord");
}
*/
}
/**
静态代码块:写在成员位置(类中方法外)被static修饰的代码块
特点:
static修饰的成员属于类,不属于某个对象,无论创建多少次对象,只会执行一次
静态优先加载到内存中,优先于构造代码块和构造方法执行
作用:
1.可以给静态成员变量赋初始化值
2.在项目启动过程中做一些初始化的设计(只执行一次 数据库)
*/
static{
sex = "男";
System.out.println("静态代码块");
}
public Student(){
/** for(int i = 0; i < 10; i++){
System.out.println("HelloWord");
}
*/
}

public Student(String name, int age){
this.name = name;
this.age = age;
System.out.println("Person满参数构造方法!");

}
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public static String getSex() {
return sex;
}

public static void setSex(String sex) {
Student.sex = sex;
}
}


Object类
Object类是类层次结构的根类(最顶层的类)
每个类都使用Object类作为超类,任何类直接或间接继承了Object类
Object类的toString方法

public class Person extends Object{
private String name;
private int age;
public Person(){
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

//alt+insert 重写Object类的toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

}

/**
Object类中的常用成员方法
String toString() 返回该对象的字符串表示。
Object类toString方法的源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
getClass().getName():使用反射技术获取类的全类名(包名+类名) com.itheima.demo04Object.Person
"@":字符串原样输出
hashCode():Object类中的方法,可以获取对象的哈希值,哈希值是系统给出的一个随机的十进制的整数 100000
Integer.toHexString(hashCode()):可以把十进制的整数转换为十六进制 0-9 a-f
组合在一起:om.itheima.demo04Object.Person@AS12sdA(对象的地址值)
*/
public class Demo01ToString {
public static void main(String[] args) {
/**
Person类默认继承了Object类,所以可以使用Object类中的toString方法
*/
Person p = new Person("迪丽热巴",18);
String s = p.toString();
System.out.println(s);//com.llz.demo04Object.Person@4554617c | 1 | Person[name = 迪丽热巴, age = 18]

//直接打印对象的名字,就是调用对象的toString方法
System.out.println(p);//p = p.toString() com.llz.demo04Object.Person@4554617c | 1 |Person[name = 迪丽热巴, age = 18]

/**
注意:
以后查看一个类是否重写toStirng方法,打印对象名看是否为地址值
是地址值:没有重写toString方法
不是地址值:重写了toString方法
*/
String str = new String("aaaa");
System.out.println(str);//aaaa String类重写了toString方法

Random r = new Random();
System.out.println(r);//java.util.Random@74a14482 Random类没有重写toString方法

Scanner sc = new Scanner(System.in);
System.out.println(sc);//java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][ma Scanner类重写了toString方法

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list);//[1, 2] ArrayList类重写toString方法
}
}

Object类的equals方法

public class Student {
private String name;
private int age;

public Student() {
}

public Student(String name, int age) {
this.name = name;
this.age = age;
}

//重写Object类的equals方法,比较两个对象的属性(name,age)
public boolean equals(Object obj) {
/**
如果obj是this本身,那么没有必须在比较属性,直接返回true,可以提高程序效率
*/
if(obj == this){
return true;
}
/**
如果obj的值是null,那么直接返回false,可以提高程序的效率
*/
if (obj==null){
return false;
}

/**
为了防止类型转换异常:ClassCastException: java.util.Random cannot be cast to com.itheima.demo04Object.Student
强转之前使用instanceof关键字进行判断
*/
if (obj instanceof Student){
/**
问题:多态==>多态无法访问子类特有的成员==>需要向下转型
Object obj = s2 = new new Student("韦德",38);
*/
Student s = (Student)obj;
//比较this(s1)和s(obj-->s2)两个对象的属性
boolean b = this.name.equals(s.name) && this.age == s.age;
return b;
}
//不是Student类型,直接返回false
return false;
}

//快捷键alt+insert 重写equals方法
/**@Override
public boolean equals(Object o) {
if (this == o){
return true;
}
//getClass() != o.getClass() 使用反射技术判断对象的类型 相当于 obj instanceof Student
if (o == null || getClass() != o.getClass()) {
return false;
}

Student student = (Student) o;

if (age != student.age) {
return false;
}
return name != null ? name.equals(student.name) : student.name == null;
}*/

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

/**
Obeject类中的常用方法:
boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。
Object类中的源码:
public boolean equals(Object obj) {
return (this == obj);
}
==:比较运算符
基本数据类型:比较的是值
引用数据类型:比较的是地址值
*/
public class Demo02Equals {
public static void main(String[] args) {
Student s1 = new Student("詹姆斯",35);
Student s2 = new Student("韦德",38);
//Student类继承了Object类,可以使用Object类中的equals方法
System.out.println(s1);//com.llz.demo04Object.Student@4554617c
System.out.println(s2);//com.llz.demo04Object.Student@74a14482
boolean b = s1.equals(s2);
System.out.println(b);//false

s1 = s2;//把s2的地址值赋值给s1
System.out.println(s1);//com.llz.demo04Object.Student@74a14482
System.out.println(s2);//com.llz.demo04Object.Student@74a14482
b = s1.equals(s2);
System.out.println(b);//true
System.out.println("------------------------------");
Student s3 = new Student("马尔扎哈",30);
Student s4 = new Student("马尔扎哈",30);
System.out.println(s3);//com.llz.demo04Object.Student@1540e19d
System.out.println(s4);//com.llz.demo04Object.Student@677327b6
Random r = new Random();
//boolean b2 = s3.equals(s4);
//boolean b2 = s3.equals(r);
//boolean b2 = s3.equals(null);
boolean b2 = s3.equals(s3);
System.out.println(b2);//true
}
}







...全文
65 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧