static静态
![](https://img-blog.csdnimg.cn/img_convert/fac35ed349701c7cf9efb8437f2e75a3.png)
这张图的问题是有多少人就会打印多少次 国家是什么
![](https://img-blog.csdnimg.cn/img_convert/2a9ecb0206fb88cdee8a12ef899b68d4.png)
我们可以在开始时对其定义为静态变量,这样在后面它会默认对国家一栏全为大清。
![](https://img-blog.csdnimg.cn/img_convert/67356e8b5134943cb2d84e726ac527a0.png)
并且static所对应内容是共享的,在22行我们将其中一个人的国家改为民国,会发现两个人都变化了。
但是我们不推荐通过对象去访问设置的静态内容,也就是a.country"民国"尽量不要使用。
这是因为static是属于类的,尽量通过类名去访问。
特点:
数据共享
属于类的,不属于对象
优先于对象产生
通用构造器,静态构造器
创建对象的过程(简单)
打印顺序:
静态构造器2.通用构造器3.构造方法->创建对象
![](https://img-blog.csdnimg.cn/img_convert/83d329e0a362ef0e1f89902574b3e1eb.png)
由于创建对象的过程是在静态内容加载完成之后,在静态方法和静态块里面不能使用this
静态的内容使用类命去访问
在静态方法里调用静态的东西是可以的
![](https://img-blog.csdnimg.cn/img_convert/cdca6c40bf3dc3b865846ab8ce69e945.png)
包和导包
包:其实本质上就是文件夹
在代码中需要写package+包名
导包:import+包+类
![](https://img-blog.csdnimg.cn/img_convert/d9d45fe9eb6feaf64e3a747c3f333392.png)
这是被导入的包package1
![](https://img-blog.csdnimg.cn/img_convert/d3ed6774bf8faf473ac8011bc70a22a6.png)
第三行操作:导入被导入的包
不需要导包:
即是在自己包里
在java.lang下所有内容不需要导包
如:String System.out.println
访问权限
public 公共访问权限
default 访问权限,平常用到的例如String name,在自己包内可以随意访问
private 私有的
我们可以发现,在自己包内定义三种权限后调用是没有什么问题的。
![](https://img-blog.csdnimg.cn/img_convert/c8e01b22a935fb579d3959be3e1decd6.png)
在其他的包内用的话,就会出错,只有公共的才能使用
![](https://img-blog.csdnimg.cn/img_convert/8159fa8a48e7575cb69c0fedbd52742b.png)
在同一个包下的不同类的呢?
私人private行不通
![](https://img-blog.csdnimg.cn/img_convert/a13f2c335cebeb479e02efa677423de8.png)
一般情况下public和private用的最多
getter和setter
用处:在成员变量用private声明后,保护变量不被胡乱赋值
用人话讲就是,当在其他包里或者同包的不同类里想使用private定义的成员变量,可以使用写入getter和setter的方式。
以下为定义private的类
![](https://img-blog.csdnimg.cn/img_convert/6d6162f64efb4b2441e422a5459f8eda.png)
![](https://img-blog.csdnimg.cn/img_convert/9b4259f83f8813d4a5e4052d9e6c112f.png)
以下为在同一个包内不同类
![](https://img-blog.csdnimg.cn/img_convert/e8e27ad362830b3dcf1fc2d8487d0465.png)
以下为在不同包里
![](https://img-blog.csdnimg.cn/img_convert/4270f97e852798439a3528ded727a162.png)
getter,从成员变量中获取数据
setter,给成员变量赋值,做一定保护
注:getter和setter可以自动生成
idea用户可以在空白位置点击右键,在generate中选择getter和setter,再全选即自动生成。
eclipse用户在写入private后会出现警告,根据提示内容可以直接点击自动生成。
继承
继承:子类可以自动拥有除了父类private以外的所有内容
当出现x是y的一种的时候,x就可以继承y
public class 类 extends 父类{
}
作用:简化代码的开发
子类对父类进行了扩展
以下作为父类
![](https://img-blog.csdnimg.cn/img_convert/acc55118603a6591ef3ec0f613a76756.png)
以下作为子类
拓展内容即是父类中没有的
![](https://img-blog.csdnimg.cn/img_convert/6c5c083a8128f28cc4212f090cc45bec.png)
以下是写入main方法 作为入口调用定义好的"父类"(实际上定义的是子类,但子承父业)
见第五行,其实是小牛怪(子)不是大牛怪(父)
第九行,在大牛怪中定义的,因为是private类型,所以不可用
![](https://img-blog.csdnimg.cn/img_convert/64bea8dd5c1974ac2933426181ccd72f.png)
以下为输出结果:分别是6 8 11行输出的结果
![](https://img-blog.csdnimg.cn/img_convert/2476cc1a18c9fd377a2a343edf62957d.png)
super关键字
super:父类中的内容
this:子类中的内容
super和this用来区分父类和子类相同的部分
父类:
![](https://img-blog.csdnimg.cn/img_convert/0e426becfbc4580f4e11b49fbc8d158b.png)
子类:
![](https://img-blog.csdnimg.cn/img_convert/492d73d651ad781aa5d4bc99ec66ce10.png)
结果:
![](https://img-blog.csdnimg.cn/img_convert/c06fe905d1bcb739de77cd2ba39dacf2.png)
总结:在子类中没有name,所以会借用父类中的name
那么,我们在子类中定义name,父类不变的情况下会出现什么呢?
![](https://img-blog.csdnimg.cn/img_convert/9604679d1eed568abb7efdeb9677edff.png)
总结:如果子类中有定义的name,会使用子类中定义的name作为this.name。如果没有才会考虑父类。
那么,如何既使用父类又使用子类呢?
我们需要用到上述的super。
![](https://img-blog.csdnimg.cn/img_convert/6141f6239d4a97ed011f4be349a5f728.png)
如图,super.name用来表示的是父类的关键字,所以会带出父类。
除此以外,super还可以调用父类中的构造方法,必须写在子类构造方法的第一行,如果父类是无参数的,可以不用写,有参数必须写。
例如第一张图第五行hero括号中有String a,那么第二张图第十行括号内就也要有String a
![](https://img-blog.csdnimg.cn/img_convert/dc75e010c6cc996e4eacf758dd64f179.png)
![](https://img-blog.csdnimg.cn/img_convert/eccabd545997ea3bf71f82ace3755a7d.png)
方法的重写
重写:子类对父类提供的方法重新定义
语法:子类和父类声明的方法完全一致
重写又被称为方法的覆盖
以下先在父类中写入方法,在子类中调用
![](https://img-blog.csdnimg.cn/img_convert/6aa22bc5ae8724d1bc2a7c6e3784ceb9.png)
![](https://img-blog.csdnimg.cn/img_convert/668e2ea0e20253ef3af7a8a85a831d26.png)
接着我们要在子类中写一个和父类中方法语法相同的方法,目的是验证方法的重写
在父类不做任何改变的情况下,子类如下
![](https://img-blog.csdnimg.cn/img_convert/d41214f52c86c93a13d70b672659bf5c.png)
我们可以看到,最后还是用的子类的方法,这就是方法的重写
如果想要将父类中的方法也一起使用,那我们就需要用到上节所学的知识
![](https://img-blog.csdnimg.cn/img_convert/f3e1f90aa655195c75ece51497d11123.png)
使用super即可
多态
多态:同一个对象拥有多种形态
作用:把不同的数据类型进行统一,让程序员有超强拓展性
例:写一个人去喂养猫和狗的代码
小猫的
![](https://img-blog.csdnimg.cn/img_convert/19ef65e24476f1b3ddbb06225ab70693.png)
小狗的
![](https://img-blog.csdnimg.cn/img_convert/ebd2576705d32b02f99d68851f10e8ee.png)
人去喂
![](https://img-blog.csdnimg.cn/img_convert/46752cbdc6c2ea9131facf362278aaab.png)
main方法
![](https://img-blog.csdnimg.cn/img_convert/d4ed36b80c71b6120c39bdfe7385fb0f.png)
总结:我们会发现,每加一个小动物,都要在person类中加一个weieat的新方法,操作起来冗杂反复,如果我们运用多态的知识,其实就会很方便。
小猫和小狗继承了animal
![](https://img-blog.csdnimg.cn/img_convert/46a16fe4e56aee736677328ed173e203.png)
![](https://img-blog.csdnimg.cn/img_convert/f5f2e0b141aae44d21dc16e83ad82888.png)
人也不需要一个一个去喂了,只需要使用调过来的animal类型的变量,再对应去找是哪个动物(猫或狗),并执行相应动作
![](https://img-blog.csdnimg.cn/img_convert/00d2f1f520385cc6d350de461e23a769.png)
main方法中因为猫和狗继承了animal,所以可以将子类对象赋值为animal类型,再通过人去执行动作(第八九行内容)。
![](https://img-blog.csdnimg.cn/img_convert/391ea6449dc8b956fb8407530c6515ae.png)
定义的animal
![](https://img-blog.csdnimg.cn/img_convert/e16c0f94a093f707700b355c38747877.png)
小知识点
把子类的对象赋值给父类的变量--->向上转型
把父类的变量赋值给子类的变量--->向下转型
向下转型有风险 涉及到强制转型
(需要转换的类型)变量
面对对象练习
要求:在lol cs dnf三款游戏中选择并play
分析:需要写三个类分别是三款游戏,然后用到上节多态知识,把他们归类于父类game中,再创建一个用户person的类去调用他们,最后写一个main方法创建所有对象。
game
![](https://img-blog.csdnimg.cn/img_convert/54114069dafd3dfc172d4fd79fd285b8.png)
lol
![](https://img-blog.csdnimg.cn/img_convert/c2dd92d7809a61c7f3a65d197c1f62ca.png)
dnf
![](https://img-blog.csdnimg.cn/img_convert/21a38f42b620c5a2cbffcc96094f9a6d.png)
cs
![](https://img-blog.csdnimg.cn/img_convert/66069d1880377a111b80addc504731c3.png)
用户
![](https://img-blog.csdnimg.cn/img_convert/0daa32bac5568a3d6ab65188b35b93da.png)
客户端
![](https://img-blog.csdnimg.cn/img_convert/4bdf0a19dd03bec3c53368aa77f491da.png)
执行结果可自试