1. 父子类构造方法
子类没有通过super调用父类的有参构造,也没有this调用本类的有参构造,那么系统默认调用
父类的无参构造方法
如果调用了父类的有参构造,将不再调用无参构造方法
子类必须调用父类的有参或者无参构造方法其中一个
,默认调无参
package com.edu.test1;
/**
* 父类
* 父类中编写子类共有的属性 和 方法
*/
public class Pet {
private String name;
private int health;
private int love;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public void print() {
System.out.println("宠物的名字是:" + name + ",健康值是:" + health + ",爱心值是:" + love );
}
public Pet() {
System.out.println("父类Pet类的无参构造执行了");
}
public Pet(String name, int health, int love) {
System.out.println("父类Pet类的全参构造方法");
this.name = name;
this.health = health;
this.love = love;
}
}
package com.edu.test1;
/**
* Dog类
* 品种
* print()
*
* 子类没有通过super调用父类的有参构造,也没有this调用本类的有参构造,那么系统默认调用
* 父类的无参构造方法
* 如果调用了父类的有参构造,将不再调用无参构造方法
*
* 子类必须调用父类的有参或者无参构造方法其中一个,默认调无参
*/
public class Dog extends Pet{
private String strain;
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public Dog() {
System.out.println("子类Dog类的无参构造执行了");
}
public Dog(String strain) {
this.strain = strain;
}
public Dog(String strain,String name,int health,int love) {
// super(name, health, love);
this.strain = strain;
}
}
package com.edu.test1;
/**
* 企鹅类
* 性别
* print()
*/
public class Penguin extends Pet{
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Penguin() {}
}
package com.edu.test1;
/**
* 测试类
*
*
*/
public class TestPet {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println("----------------------------------");
Dog dog1 = new Dog("金毛");
System.out.println("----------------------------------");
Dog dog2 = new Dog("金毛", "大黄", 100, 100);
}
}
2.不能继承哪些内容
3.可以继承哪些内容
继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里 继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里
4. 方法重写
方法重写规则 1.父子类之间
2.方法名相同
3.参数列表相同
4.返回值类型相同 或者是其子类
5.访问权限不能严于父类(不能窄化父类的访问权限)
6.不能抛出比父类更多的异常
7.静态方法可以被继承,但是不能被重写
package com.edu.test3;
/**
* 父类
* 父类中编写子类共有的属性 和 方法
*/
public class Pet {
private String name;
private int health;
private int love;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
void print() {
System.out.println("宠物的名字是:" + name + ",健康值是:" + health + ",爱心值是:" + love );
}
}
package com.edu.test3;
/**
* Dog类
* 品种
* print()
*/
public class Dog extends Pet{
private String strain;
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public Dog() {}
/**
* 方法重写规则
* 1.父子类之间
* 2.方法名相同
* 3.参数列表相同
* 4.返回值类型相同 或者是其子类
* 5.访问权限不能严于父类(不能窄化父类的访问权限)
*
* 6.不能抛出比父类更多的异常
* 7.静态方法可以被继承,但是不能被重写
*/
public void print() {
super.print();
System.out.println("狗狗的品种是:" + strain);
}
}
package com.edu.test3;
/**
* 企鹅类
* 性别
* print()
*/
public class Penguin extends Pet{
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Penguin() {}
public void print() {
super.print();
System.out.println("企鹅的性别是:" + sex);
}
}
package com.edu.test3;
/**
* 测试类
*/
public class TestPet {
public static void main(String[] args) {
Penguin penguin = new Penguin();
penguin.print();
Dog dog = new Dog();
dog.print();
}
}
5. @Override注解
@Override注解可以加在子类的方法上,表示重写父类的方法,如果没有正确重写,则编译报错
6.方法重写和方法重载的区别?
方法重写:Override
方法重载:Overload
7. Object类
Object类是所有的类父类。我们可以重写此类中的方法实现我们的个性化操作。
8. 重写toString()
Object类的toString方法默认是返回当前对象的全限定名(包名 + 类名)+@+hash值,我们可以根据自己的需求进行重写,我们直接打印一个对象将默认调用此对象的toString方法
实际开发中,通常都会写为返回当前对象的属性名 + 属性值
package com.edu.test5;
/**
* 学生类
* 名字
* 年龄
* 性别
* 爱好
*
* 我们重写toString方法的目的是为了在我们直接输出一个对象的时候
* 不再打印包名类名+hash值,而是打印属性名+属性值,因为这样我们查看对象的信息更便捷
*/
public class Student {
private String name;
private int age;
private String sex;
private String hobby;
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public String toString() {
return "Student[name = " + name + ",age=" + age + ",sex = " + sex + ",hobby = " + hobby + "]";
}
public static void main(String[] args) {
Student stu1 = new Student();
stu1.setName("赵四");
stu1.setAge(20);
stu1.setSex("男");
stu1.setHobby("尬舞");
System.out.println(stu1.getName());
System.out.println(stu1.getAge());
System.out.println(stu1.getSex());
System.out.println(stu1.getHobby());
System.out.println(stu1.toString());
// 直接打印某个对象 将默认调用此对象的toString方法
System.out.println(stu1);
}
}
9. 重写equals()
==和equals的区别?
==比较基本数据类型比较值 , 比较引用数据类型比较内存中的地址
equals本身也比较地址,但是我们可以重写按照我们指定的规则来比较
String类就是对equals方法进行了重写,将原本 父类的比较地址重写为了比较内容
package com.edu.test6;
/**
* 人类
* 名字
* 身份证号
*
* ==和equals的区别?
* ==比较基本数据类型比较值 , 比较引用数据类型比较内存中的地址
* equals本身也比较地址,但是我们可以重写按照我们指定的规则来比较
* String类就是对equals方法进行了重写,将原本 父类的比较地址重写为了比较内容
*/
public class Person {
private String name;
private String idCard;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public Person(String name, String idCard) {
this.name = name;
this.idCard = idCard;
}
public Person() {
}
public static void main(String[] args) {
Person p1 = new Person("赵四", "5612157843213265632323");
Person p2 = new Person("赵四", "5612157843213265632323");
System.out.println(p1 == p2); // ==比较基本数据类型比较值 比较引用数据类型比较地址
System.out.println(p1.equals(p2)); // 比较内存中的地址是否相同
System.out.println("---------------------------------------------------");
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2));// true
}
}
自己模拟equals方法 实现字符串比较
String类equals方法比较规则:
1.先比较地址,如果地址相同则直接返回true
2.如果地址不同,再将两个字符串转换为char数组,然后对应位置的元素进行比较
package com.edu.test6;
/**
* 自己模拟equals方法 实现字符串比较
* String类equals方法比较规则:
* 1.先比较地址,如果地址相同则直接返回true
* 2.如果地址不同,再将两个字符串转换为char数组,然后对应位置的元素进行比较
*
*/
public class MyString {
public static void main(String[] args) {
String str1 = "abcdefg";
char [] ch1 = str1.toCharArray();
for (int i = 0; i < ch1.length; i++) {
System.out.print(ch1[i] + "\t");
}
System.out.println();
System.out.println("--------------------------------");
System.out.println(myEquals("abcd", "abc"));
}
public static boolean myEquals(String str1,String str2) {
char [] ch1 = str1.toCharArray();
char [] ch2 = str2.toCharArray();
if(ch1.length != ch2.length) {
return false;
}
for(int i = 0;i < ch1.length;i++) {
if(ch1[i] != ch2[i]) {
return false;
}
}
return true;
}
}