类里边包含:成员变量/构造方法/方法/代码块/内部类/继承/多态/组合
在创建一个对象之前需要做点事情
- 构造函数
- 静态变量
- 静态方法 必须主动调用才执行
代码块
- 在对象被创建之前就优先会被调用
- 修饰符 {
预先执行的内容
} - 类里面可以有多个代码块
- 执行顺序和出现的先后顺序相同
- 尽量不要在一个类里写多个代码块 先后执行顺序因此可以只用一个代码块
静态代码块
- 格式
在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块:
static {
//age = 30; 静态代码块里面不能调用成员变量和实例方法
System.out.println("静态代码块");
}
- 执行时机
静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行。后面在比较的时候会通过具体实例来证明 - 静态代码块的作用
一般情况下,如果有些代码需要在项目启动的时候就执行,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件等资源,我们就可以都放入静态代码块中。 - 静态代码块不能访问普通变量
这个理解思维同上,普通变量只能通过对象来调用,是不能放在静态代码块中的
public Person(){
System.out.println("默认的无参构造方法 age="+age);
}
public Person(int age){
this.age = age;
System.out.println("有参构造方法");
}
定义类
定义一个类,可以在多个地方定义
- 单独创建一个文件管理一个类
- 直接在文件里面 类A的上面和下面创建
- 直接在某个类A内部创建一个类
一个类A需要依附于另一个类B
内部类
所谓内部类就是在一个类内部进行其他类结构的嵌套操作
内部类的优点
- 内部类与外部类可以方便的访问彼此的私有域(包括私有方法、私有属性)
- 内部类是另外一种封装,对外部的其他类隐藏
- 内部类可以实现java的单继承局限
内部类的缺点
- 结构复杂
封装
面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节
- 使用private把关键的,没必要给其他人看的逻辑和熟悉密封好,装起来,不让其他人看
- 减少其他人看你类的时间,让调用的人看你代码更简单
- 由于属性和某些方法封装起来了,那让你的代码逻辑更安全!
继承
子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为
- 获得父类的方法和属性 并且需要添加自己的属性和方法
- Java里面只能单继承 可以变相的多继承
- 所有的类都是直接或者间接继承于Object类
- 当调用子类的一个方法时 如果没有就会到父类去查找
- 如果在子类需要调用父类的方法或者显示调用父类的属性使用super
- 什么情况下需要在一个方法里面调用super的对应方法
public void walk() {
super.walk();
}
- 如果一个方法需要一个功能 又不能单独完成 必须要父类做相应的工作
1.父类做完之后 子类再操作
2.子类做点事情之后 再调用父类去完成 - 如果父类有自定义构造方法
子类的构造方法里必须显示调用父类的构造方法 - 如果父类有内部类
子类中有同名的内部类
那么父类中的内部类就被屏蔽了
如果非要使用父类中的内部类 只能使用全类名 Person1.内部类名
多态polymorphic
1.同一个方法 多种实现=在不同的子类中有不同的实现
2.如果有继承关系:子类的对象可以使用父类变量接收 类型的自动向上转换
demo知识融合
package demo;
import java.util.ArrayList;
public class Person {
String name;
int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void walk(){
}
public void eat(){
}
}
class civilServant extends Person{
int salay;
int count;
public civilServant(String name,int age,int salay,int count){
super(name,age);
this.salay = salay;
this.count = count;
}
@Override
public void walk() {
System.out.println("慢慢走路");
}
@Override
public void eat() {
System.out.println("慢慢吃饭");
}
public void cShow() {
System.out.println("civilServant{" +
"name='" + name + '\'' +
", age=" + age +
", salay=" + salay +
", count=" + count +
'}');
}
}
class officl extends Person{
int salay;
String tec;
public officl(String name,int age,int salay,String tec){
super(name,age);
this.salay = salay;
this.tec = tec;
}
@Override
public void walk() {
System.out.println("快快地走");
}
@Override
public void eat() {
System.out.println("快快吃饭");
}
public void oShow() {
System.out.println("officl{" +
"name='" + name + '\'' +
", age=" + age +
", salay=" + salay +
", tec='" + tec + '\'' +
'}');
}
}
class Test{
public static void main(String[] args){
ArrayList<Person> peoples = new ArrayList();
Person c1 = new civilServant("张三",25,13000,45);
Person c2 = new civilServant("李四",21,15000,24);
Person c3 = new civilServant("王五",30,14400,30);
Person c4 = new civilServant("FCF",26,10540,42);
peoples.add(c1);
peoples.add(c2);
peoples.add(c3);
peoples.add(c4);
Person o1 = new officl("渣渣辉",19,5000,"自动加血");
Person o2 = new officl("古天乐",28,6800,"开局满蓝");
Person o3 = new officl("林子聪",20,9500,"双倍经验");
peoples.add(o1);
peoples.add(o2);
peoples.add(o3);
for (Person p : peoples){
if (p instanceof civilServant){
civilServant c = (civilServant)p;
c.cShow();
c.walk();
c.eat();
}else {
officl o =(officl)p;
o.oShow();
o.walk();
o.eat();
}
}
}
}
PS.
今天最开始单独做了一个demo,刚开始有一种无从下手的感觉,才发现自己的问题。以前上课听的时候自我感觉良好,殊不知什么都只是学到了皮毛而已。经过讲解之后才找到了一丝熟悉的感觉,希望自己能踏踏实实做个人吧
网友评论