一、static(下)
修饰方法:类方法/静态方法,直接用类名调用
应用场景:工具类
注意:该类只是纯粹的功能,就可以把该类变为工具类,直接用类名调用静态方法即可
静态代码块:
应用场景:初始化数据(功能和构造方法类似)
构造方法 vs 代码块 vs 静态代码块构造方法:创建对象时调用,初始化数据(成员变量、静态变量)
代码块:创建对象时优先于构造方法调用,初始化数据(成员变量、静态变量)
静态代码块:字节码文件加载到方法区时调用,初始化数据(静态变量
A类
package com.dream.test02;
public class A {
//构造方法在创建对象时被调用
public A() {
System.out.println("A类的无参构造");
}
//代码块在创建对象时优先于构造方法被调用
{
System.out.println("A类的代码块");
}
//静态代码块在A.class加载到方法区时被调用
static{
System.out.println("A类的静态代码块");
}
}
测试类
package com.dream.test02;
public class Test01 {
public static void main(String[] args) {
/**
* 静态代码块
*/
A a1 = new A();
A a2 = new A();
}
}
二、继承
含义:子类继承父类的属性和方法
语法:public class 子类 extends 父类{}
注意:一个类只能继承另一个类(单继承)
好处:减少代码的冗余
应用场景:多个类,拥有相同的属性和方法,就可以把这些相同的属性和方法抽取到父类中
人类
package com.dream.test03;
public class Person {
String name;
char sex;
int age;
public void eat(){
System.out.println("吃饭饭");
}
public void sleep(){
System.out.println("睡觉觉");
}
}
中国人类
package com.dream.test03;
// 子类 继承 父类
public class Chinese extends Person{
String chineseId;
public void playTaiJi(){
System.out.println("打太极");
}
}
日本人类
package com.dream.test03;
public class Japanese extends Person{
String japaneseId;
public void playVedio(){
System.out.println("拍电影");
}
}
测试类
package com.dream.test03;
public class Test01 {
public static void main(String[] args) {
/**
* 继承
*
* 需求:编写中国人和日本人
* 分析:
* 人类:属性:姓名、年龄、性别 方法:吃饭饭、睡觉觉
* 中国人类:属性-chineseId 方法:打太极
* 日本人类:属性-japaneseId 方法:拍电影
*/
Chinese c = new Chinese();
c.name = "杨晨";
c.sex = '男';
c.age = 18;
System.out.println(c.name);
System.out.println(c.sex);
System.out.println(c.age);
c.eat();
c.sleep();
c.chineseId = "123456789";
System.out.println(c.chineseId);
c.playTaiJi();
Japanese j = new Japanese();
j.name = "麻生希";
j.sex = '女';
j.age = 23;
System.out.println(j.name);
System.out.println(j.sex);
System.out.println(j.age);
j.eat();
j.sleep();
j.japaneseId = "987654321";
System.out.println(j.japaneseId);
j.playVedio();
}
}
三、深入继承
子类可以继承父类的私有化属性和方法吗?
可以的
创建子类对象,会调用父类构造方法吗?
会
创建子类对象,调用父类构造方法的目的?
在子类对象中开辟空间,用于存储父类的属性
创建子类对象,会创建父类对象吗?
不会
创建子类对象,先调用父类构造方法还是子类构造方法?
先调用子类构造方法
人类
package com.dream.test04;
public class Person {
private String name;
private char sex;
private int age;
public Person() {
System.out.println("Person类的构造方法");
}
public Person(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("吃饭饭");
}
public void sleep(){
System.out.println("睡觉觉");
}
private void fatherMethod01(){
System.out.println("父类私有化方法");
}
public void fatherMethod02(){
fatherMethod01();
}
}
中国人类
package com.dream.test04;
// 子类 继承 父类
public class Chinese extends Person{
String chineseId;
public Chinese() {
//super();//默认实现调用父类的无参构造
System.out.println("Chinese类的构造方法");
}
public void playTaiJi(){
System.out.println("打太极");
}
}
日本人类
package com.dream.test04;
public class Japanese extends Person{
String japaneseId;
public Japanese() {
}
public void playVedio(){
System.out.println("拍电影");
}
}
测试类
package com.dream.test04;
public class Test01 {
public static void main(String[] args) {
/**
* 深入继承
*
* 1.子类可以继承父类的私有化属性和方法吗?
* 可以继承,但是不可以直接调用
*
* 2.创建子类对象,会调用父类构造方法吗?
* 会
*
* 3.创建子类对象,调用父类构造方法的目的?
* 在子类对象中开辟空间,用于存储父类的属性
*
* 4.创建子类对象,会创建父类对象吗?
* 不会
*
* 5.创建子类对象,先调用父类构造方法还是子类构造方法?
* 先调用子类构造方法
*
* 6.创建子类对象,先完成父类构造方法还是子类构造方法?
* 先完成父类构造方法
*
*/
Chinese c = new Chinese();
c.setName("杨晨");
System.out.println(c.getName());
c.fatherMethod02();
}
}
四、super
含义:父类
作用:
super.属性:在子类中,调用父类非私有化属性
super.方法:在子类中,调用父类非私有化方法
super():在子类中,调用父类非私有化构造方法
人类
package com.dream.test05;
public class Person {
private String name;
private char sex;
private int age;
public Person() {
}
public Person(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println(this.name + "吃饭饭");
}
public void sleep(){
System.out.println(this.name + "睡觉觉");
}
}
中国人类
package com.dream.test05;
public class Chinese extends Person{
private String chineseId;
public Chinese() {
}
public Chinese(String chineseId) {
this.chineseId = chineseId;
}
public Chinese(String name,char sex,int age,String chineseId){
//调用父类的非私有化构造方法
super(name, sex, age);
this.chineseId = chineseId;
}
public void playTaiJi(){
//调用父类的非私有化方法
System.out.println(super.getName() + "打太极");
}
}
日本人类
package com.dream.test05;
public class Japanese extends Person{
private String japaneseId;
public Japanese() {
}
public Japanese(String name, char sex, int age, String japaneseId) {
super(name, sex, age);
this.japaneseId = japaneseId;
}
public void playVedio(){
System.out.println(super.getName() + "拍电影");
}
}
测试类
package com.dream.test05;
public class Test01 {
public static void main(String[] args) {
/**
* super
*
*/
Chinese c = new Chinese("大牛", '男', 18, "123456789");
c.eat();
c.playTaiJi();
}
}
五、重写
含义:将父类里的方法,在子类中重新写一遍
应用场景:父类方法不满足子类需求时,考虑使用重写
条件:
在子类中
返回值、方法名、参数列表必须和父类重写的方法一致
访问修饰符不能比父类更严格
人类
package com.dream.test06;
public class Person {
private String name;
private char sex;
private int age;
public Person() {
}
public Person(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println(this.name + "吃饭饭");
}
public void sleep(){
System.out.println(this.name + "睡觉觉");
}
}
中国人类
package com.dream.test06;
public class Chinese extends Person{
private String chineseId;
public Chinese() {
}
public Chinese(String name, char sex, int age, String chineseId) {
super(name, sex, age);
this.chineseId = chineseId;
}
public String getChineseId() {
return chineseId;
}
public void setChineseId(String chineseId) {
this.chineseId = chineseId;
}
public void playTaiJi(){
System.out.println(super.getName() + "打太极");
}
//@Override注解:重写
//注释:给程序员解释的
//注解:既给程序员解释,也给程序解释
@Override
public void eat() {
System.out.println(super.getName() + "吃山珍海味");
}
}
日本人类
package com.dream.test06;
public class Japanese extends Person{
private String japaneseId;
public Japanese() {
}
public Japanese(String name, char sex, int age, String japaneseId) {
super(name, sex, age);
this.japaneseId = japaneseId;
}
public String getJapaneseId() {
return japaneseId;
}
public void setJapaneseId(String japaneseId) {
this.japaneseId = japaneseId;
}
public void playVedio(){
System.out.println(super.getName() + "拍电影");
}
@Override
public void eat() {
System.out.println(super.getName() + "吃马赛克");
}
}
测试类
package com.dream.test06;
public class Test01 {
public static void main(String[] args) {
/**
* 重写:
*
* 需求:编写中国人和日本人
*
* 含义:方法与方法之间的关系
* 条件:
* 1.重写的位置是在子类中
* 2.返回值类型、方法名、参数列表必须和父类重写的方法一致
* 3.访问修饰符不能比父类更要严格
*
* 应用场景:父类里的方法不能改变时,并且父类的方法不满足子类需求时,在子类重写父类的方法
*
*/
Chinese c = new Chinese("杨晨", '男', 18, "123456789");
c.eat();
Japanese j = new Japanese("波多野结衣", '女', 23, "987654321");
j.eat();
}
}
六、访问修饰符
访问修饰符 本类 本包 同包子类 不同包 不同包子类 private ok default(默认权限) ok ok ok protected ok ok ok ok public ok ok ok ok ok