static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量
被static修饰的成员变量,叫做静态变量
被static修饰的成员方法,叫做静态方法
类
用工具类构造方法,相当于构造函数,如果定义好了工具类,那么直接再次想要复用方法时,可以直接复制类中的代码。
总结:
静态方法中,只能访问静态。
非静态方法可以访问所有。
静态方法中没有this关键字
public class Helloworld {
public static void main(String[] args) {
system.out.println( "Helloworld");
}
}
public
: 被JVM调用,访问权限足够大static
:被JVM调用,不用创建对象,直接类名访问因为main方法是静态的,所以测试类中其他方法也需要是静态的。void
:被JVM调用,不需要给JVM返回值main
:一个通用的名称,虽然不是关键字,但是被JVM识别String[] args
:以前用于接收键盘录入数据的,现在没用封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为
继承:
extends
,用这个关键字,我们可以让一个类和另一个类建立起继承关系。public class Student/*子类*/ extends Person/*父类*/ {}
使用继承的好处:
什么时候用继承?
当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码
Java只支持单继承,不支持多继承,但支持多层继承。
构造方法
成员变量
成员变量的访问特点
重名:
package entends.aFUzientends;
public class Text{
public static void main(String[] args){
zi z = new zi();
z.ziShow();
}
}
class Fu {
String name = "fu";
}
class zi extends Fu{
String name = "zi";
public void ziShow(){
String name = "zishow";
System.out.println(name);//zishow
System.out.println(this.name);//zi
System.out.println(super.name);//fu
}
}
super指向下会调用父类里面的成员变量
this指向下会调用子类里面的成员变量,如果子类没有就会向父类寻找
没有指向就会采用就近原则来调用变量
成员方法的访问特点
方法的重写
当父类的方法不能满足子类现在的需求时,需要进行方法重写
书写格式
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。
@Override重写注解
@Override
是放在重写后的方法上,校验子类重写时语法是否正确。
加上注解后如果有红色波浪线,表示语法错误。
建议重写方法都加@Override
注解,代码安全,优雅!
方法重写注意事项和要求
package entends.chongxieAnimal;
public class Text {
public static void main(String[] args) {
hasky dog1 = new hasky();
shapi dog2 = new shapi();
chineseDog dog3 = new chineseDog();
dog1.Eat();
dog2.Eat();
dog3.Eat();
dog1.play();
dog2.drink();
dog3.lookhome();
}
}
package entends.chongxieAnimal;
public class Dog {
public void Eat(){
System.out.println("吃狗粮");
}
public void drink(){
System.out.println("喝水");
}
public void lookhome(){
System.out.println("看家");
}
}
package entends.chongxieAnimal;
public class chineseDog extends Dog{
@Override
public void Eat(){
System.out.println("吃剩饭");
}
}
package entends.chongxieAnimal;
public class hasky extends Dog {
public void play(){
System.out.println("拆家");
}
}
package entends.chongxieAnimal;
public class shapi extends Dog {
@Override
public void Eat(){
super.Eat()
System.out.println("吃骨头);
}
}
为什么?
怎么调用父类构造方法的?
public class Person (){
String name;
int age;
pnblic Person(){
System.out.println("父类的无参构造")
}
pnblic Person(String name,int age){
this.name = name;
this.age = age;
}
}
public class Student (){
public Student(){
super();
System.out.println("子类的无参构造")
}
public Student (String name,int age){
super(name,age);
}
}
public class Text(){
public static void main(String[] args){
Student s = new Student(zhangsan,23);
}
}
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
---|---|---|---|
this | this.成员变量 访问本类成员变量 | this.成员方法 访问本类成员方法 | this.(…) 访问本类构造方法 |
super | super.成员变量 访问父类成员变量 | super.成员方法 访问父类成员方法 | super.(…) 访问父类构造方法 |
package entends.extendsjavabean;
public class text {
Manger a = new Manger(001,"xiaoli",8000,3000);
cooker b = new cooker(002,"xiaowang",8000);
}
package entends.extendsjavabean;
public class Emplyee {
private int num;
private String name;
private int money;
public void work(){
System.out.println("员工在工作");
}
public void eat(){
System.out.println("吃米饭");
}
public Emplyee() {
}
public Emplyee(int num, String name, int money) {
this.num = num;
this.name = name;
this.money = money;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String toString() {
return "Emplyee{num = " + num + ", name = " + name + ", money = " + money + "}";
}
}
package entends.extendsjavabean;
public class Manger extends Emplyee{
private int boen;
public Manger() {
}
public Manger(int num,String name,int money,int boen) {
super(num,name,money);
this.boen = boen;
}
public int getBoen() {
return boen;
}
public void setBoen(int boen) {
this.boen = boen;
}
public String toString() {
return "Manger{boen = " + boen + "}";
}
@Override
public void work() {
System.out.println("管理别人");
}
}
package entends.extendsjavabean;
public class cooker extends Emplyee{
@Override
public void work() {
System.out.println("炒菜");
}
public cooker(){
}
public cooker(int num,String name,int money){
super(num,name,money);
}
}
什么是多态?
同类型的对象,表现出的不同形态。
多态的表现形式
父类类型 对象名称=子类对象
;
多态的前提
Fu f = new Zi()
;多态的好处
使用父类型作为参数,可以接受所有子类对象,体现多态的扩展性与便利
优势:
弊端:
//假设有三个类,其中animal类是Dog类和Cat类的父类
//进行类的转换
animal a = new Dog;
if(a instanceof Dog){
Dog b = (Dog)a;
b.lookhome();
}else if (a instanceof Cat c){
Cat c = (Cat)a;
c.catmouse();
}else{
System.out.println("没有这个类型,无法转换")
}
//JDK14之后的新特性
if(a instanceof Dog b){
b.lookhome();
}else if (a instanceof Cat c){
c.catmouse();
}else{
System.out.println("没有这个类型,无法转换")
}
package entends.Polymorphism02;
public class Text {
public static void main(String[] args) {
Dog b = new Dog(2,"黑色");
Cat c = new Cat(2,"白色");
Person p = new Person("老王",40);
p.keepPet(b,"骨头");
p.keepPet(c,"小鱼干");
}
}
package entends.Polymorphism02;
public class animal {
private int age;
private String color;
public animal() {
}
public animal(int age, String color) {
this.age = age;
this.color = color;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void eat(String somthing){
System.out.println("正在吃东西");
}
}
package entends.Polymorphism02;
public class Dog extends animal {
public Dog(int age,String color){
super(age,color);
}
@Override
public void eat(String somthing){
System.out.println(getAge()+"岁的"+getColor()+"的狗正在抱着"+somthing+"吃");
}
public void lookHome(){
System.out.println("狗正在看家");
}
}
package entends.Polymorphism02;
public class Cat extends animal{
public Cat(int age,String color){
super(age,color);
}
@Override
public void eat(String somthing){
System.out.println(getAge()+"岁的"+getColor()+"的猫正在抱着"+somthing+"吃");
}
public void catchMouse(){
System.out.println("猫正在抓老鼠");
}
}
package entends.Polymorphism02;
public class Person {
private String name;
private int age;
public Person() {
}
public void keepPet(animal a,String something){
if(a instanceof Dog b){
System.out.println(getAge()+"岁的"+getName()+"正在用"+something+"喂养狗");
b.eat(something);
} else if (a instanceof Cat c) {
System.out.println(getAge()+"岁的"+getName()+"正在用"+something+"喂养猫");
c.eat(something);
}
}
public Person(String name, int age) {
this.name = name;
this.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;
}
}
包就是文件夹。用来管理各种不同功能的Java类,方便后期代码维护。
包名+类名 被称为:全类名或者全限定名
使用其他类的规则
常量
实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性。常量的命名规范:
细节:
特例:如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有。
static{}
抽象类和抽象方法的定义格式
public abstract 返回值类型 方法名(参数列表)
;public abstract class 类名{}
;抽象类和抽象方法到的注意事项
package abstract_.A0dome1;
public abstract class animal {
private String name;
private int age;
public animal() {
}
public animal(String name, int age) {
this.name = name;
this.age = age;
}
public void drink(){};
public abstract void eat();
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "animal{name = " + name + ", age = " + age + "}";
}
}
package abstract_.A0dome1;
public class Dog extends animal {
public Dog(String name,int age) {
super(name,age);
}
@Override
public void eat() {
System.out.println("吃骨头");
}
}
package abstract_.A0dome1;
public class frog extends animal{
public frog(String name,int age) {
super(name,age);
}
@Override
public void eat() {
System.out.println("吃虫子");
}
}
package abstract_.A0dome1;
public class sheep extends animal{
public sheep(String name,int age) {
super(name,age);
}
@Override
public void eat() {
System.out.println("吃草");
}
}
package abstract_.A0dome1;
public class Text {
public static void main(String[] args) {
Dog d = new Dog("quiqui",2);
frog f = new frog("xiao",2);
sheep s = new sheep("meiyangyang",3);
d.eat();
f.eat();
s.eat();
}
}
接口的定义和使用
public interface接口名{}
;注意1:接口和类的实现关系,可以单实现,也可以多实现。
public class 类名 implements接口名1,接口名2{}
;
注意2:实现类还可以在继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements接口名1,接口名2{}
;
package interface_.aDome1;
public abstract class animal {
private String name;
private int age;
public animal() {
}
public animal(String name, int age) {
this.name = name;
this.age = age;
}
public abstract void eat();
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "animal{name = " + name + ", age = " + age + "}";
}
}
package interface_.aDome1;
public class dog extends animal implements swim{
public dog(){};
public dog(String name ,int age){
super();
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
@Override
public void swim() {
System.out.println("狗刨");
}
}
package interface_.aDome1;
public class forg extends animal implements swim{
public forg(){};
public forg(String name ,int age){
super(name,age);
}
@Override
public void eat() {
System.out.println("青蛙吃虫子");
}
@Override
public void swim() {
System.out.println("蛙泳");
}
}
package interface_.aDome1;
public class rabbit extends animal{
public rabbit(){};
public rabbit(String name ,int age){
super();
}
@Override
public void eat() {
System.out.println("兔子吃胡萝卜");
}
}
package interface_.aDome1;
public interface swim {
void eat();
public abstract void swim();
}
package interface_.aDome1;
public class Text {
public static void main(String[] args) {
dog g = new dog("quiqui",2);
forg f =new forg("qiongwa",2);
rabbit r = new rabbit("tuzxi",3);
g.eat();
g.swim();
f.eat();
f.swim();
r.eat();
}
}
接口中成员的特点
public
static final接口和类之间的关系
package interface_.aDome2;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Person{name = " + name + ", age = " + age + "}";
}
}
package interface_.aDome2;
public abstract class Player extends Person {
public Player(){};
public Player(String name,int age){
super(name,age);
};
public abstract void study();
}
package interface_.aDome2;
public abstract class trainer extends Person {
public trainer(){};
public trainer(String name,int age){
super(name,age);
};
public abstract void teaching();
}
package interface_.aDome2;
public interface english {
public abstract void sayenglish();
}
package interface_.aDome2;
public class basketballplay extends Player{
public basketballplay(){};
public basketballplay(String name,int age){
super(name,age);
};
@Override
public void study() {
System.out.println("学篮球");
}
}
package interface_.aDome2;
public class basketballtariner extends trainer {
public basketballtariner(){};
public basketballtariner(String name,int age){
super(name,age);
};
@Override
public void teaching() {
System.out.println("学篮球");
}
}
package interface_.aDome2;
public class pingpangplayer extends Player implements english{
public pingpangplayer(){};
public pingpangplayer(String name,int age){
super(name,age);
};
@Override
public void study() {
System.out.println("学乒乓球");
}
@Override
public void sayenglish() {
System.out.println("说英语");
}
}
package interface_.aDome2;
public class pingpangtrainer extends Player implements english{
public pingpangtrainer(){};
public pingpangtrainer(String name, int age) {
super(name,age);
}
@Override
public void study() {
System.out.println("教乒乓球");
}
@Override
public void sayenglish() {
System.out.println("说英语");
}
}
JDK7以前:接口中只能定义抽象方法。
JDK8的新特性:接口中可以定义有方法体的方法。(默认、静态)
JDK9的新特性:接口中可以定义私有方法。
JDK8新特性
允许在接口中定义默认方法,需要使用关键字default修饰
接口中默认方法的定义格式:
格式:public default 返回值类型 方法名(参数列表){}
;
接口中默认方法的注意事项:
default
关键字public
可以省略,default
不能省略允许在接口中定义定义静态方法,需要用static修饰
接口中静态方法的定义格式:
public static 返回值类型 方法名 (参数列表) {}
;public static void show(){ }
;接口中静态方法的注意事项:
JDK9新增的方法
接口的私有方法,此方法只为Inter接口提供服务,不需要外类访问
接口中私有方法的定义格式:
普通的私有方法(为普通的方法服务):
private 返回值类型 方法名 (参数列表) {}
;private void show(){}
;静态的私有方法(为静态的方法服务):
private static 返回值类型 方法名 (参数列表){}
;private static void method(){}
;类的五大成员:
属性,方法,构造方法,代码块,内部类
当B类表示的事物是A类的一部分,且B单独存在没有意义,此时就可以使用到内部类
public class Car{//外部类
String carName;
int carAge;
int carColor;
class Engine(//成员内部类
String engineName;
int engineAge;
)
}
外部类名.内部类名 对象名 = 外部类对象.内部类对象
;外部类变量名和内部类变量成员变量重名时,在内部类如何访问
System.out.println(Outer.this.变量名)
package innerclass.aDome1;
public class Outer {
String name;
private int a = 10;
public class Inner{
private int a = 20;
public void show(){
int a = 30;
System.out.println(a);
System.out.println(this.a);
System.out.println(Outer.this.a);
}
}
}
package innerclass.aDome1;
public class text {
public static void main(String[] args) {
Outer.Inner o = new Outer().new Inner();
o.show();
}
}
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。
创建静态内部类对象的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名()
;
Outer.inner oi = new Outer.inner()
调用非静态方法的格式:先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名()
;
匿名内部类本质上就是隐藏了名字的内部类
//格式:
new 类名或者接口名(){
重写方法;
};
例:
new Inter(){
public void show(){
}
};
什么是匿名内部类?
隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置。
格式的细节
包含了继承或实现,方法重写,创建对象。
整体就是一个类的子类对象或者接口的实现类对象
使用场景
当方法的参数是接口或者类时,
以接口为例,可以传递这个接口的实现类对象,
如果实现类只要使用一次,就可以用匿名内部类简化代码。