黑马程序员

面对对象

如何理解面向对象?
  面向过程:强调的是功能行为。
  面向对象:将功能封装进对象,情调对象说具备的功能。
  面向对象是基于面向过程的。
类和对象的关系
  现实生活中的对象:张三李四
  想要描述:提取对象中共性内容,对具体的抽象。
  描述时:这些对象的共性有:姓名,年龄,性别,学习java功能。
  映射到java中,描述就是class定义的类,具体对象就是堆内存中用new建立的实体。

类:对现实生活中事物的描述。
对象:实实在在存在的类的个体。
匿名对象:
  匿名对象使用方法一:当对对象方法只调用一次时,可以用匿名对象来完成,这样比较简化。
  匿名对象使用方法二:可以将匿名对象作为实际参数进行传递。
面向对象三大特征:封装,继承,多态
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
优点:
  将变化隔离
  便于使用
  提高重用性
  提高安全性
封装原则:
  将不需要对外提供的内容都隐藏起来
  把属性都隐藏,提供公共方法对其访问

继承:
  1.提高代码复用性
  2.让类与类之间产生关系,有了这个关系,才有了多态的特性
  3.打破流封装性。
  注意:不能为了获取其他类的功能,简化代码而继承
    必须是类与类之间有所属关系才可以用继承。
  java中支持单继承,即一个子类只能有一个直接父类。
  java不支持多继承,但支持多层继承。
super关键字:子类与父类成员变量重名时,super.变量名代表父类成员变量。
this关键字:本类成员与局部变量重名时,this.变量名代表本类成员。
父类的数据是存储在子类对象中的。当父类与子类存在重名函数时,子类函数会覆盖父类函数。
注意:此时子类函数的权限必须大于或等于父类函数,而且两者必须均为静态或非静态函数。
  子类构造函数:
子类的构造函数中存在一个隐式语句super();默认先调用父类构造函数进行初始化,在运行子类特有的构造方法。
因为子类继承了父类,获取了父类的属性,所以在使用父类属性前,必须先对父类进行初始化。
如果父类存在多个构造函数,而且没有定义空参数的构造函数,那么子类构造函数在定义时必须明确调用父类的哪个构造函数。
final关键字
1.final是一个修饰符,可以修饰类,方法,变量。
2.final修饰的类不可以被继承。
3.final修饰的方法不可以被覆盖。
4.final修饰的变量是一个常量,只能被赋值一次。

以下代码简单演示一个继承实现方式和特点

class  Fu
{
    int a=66;
    int num = 77;
    Fu ()
    {
        super(); //调用最底层object.
        show();  //因为函数同名,优先调用Zi类的show函数,此时num为默认初始值0.
        return;
    }
    void show()
    {
        System.out.println("fu show");
    }
}
class Zi extends Fu
{
    int num = 8;  //先运行Zi的构造函数Zi()中的super(),再运行此项。
    Zi()          
    {
        super();  //此步骤最先运行,通过super初始化Fu时,num并未显示初始化,此时num为默认初始值0.
        show();   //此时输出zi show ...8.
        return;
    }
    void show()
    {
        System.out.println("zi show ..."+num+";"+"fu shou ..."+super.num);
        System.out.println("a show ..."+a);        //调取父类变量
    }
}
class ExtendsDemo
{
    public static void main(String[] args)
    {
        Zi z = new Zi();
        System.out.println();
        z.show();
    }
}

运行结果

static 关键字:
static 修饰成员变量:
特有的使用方式: 可以直接通过类名来访问.
特点:
  随着类的加载而加载,存储在共享区(方法区)
  静态变量和普通成员变量的区别:
  普通成员变量:随着对象的创建存储于堆内存,随着对象的消失而消失(变垃圾被回收)
  每一个对象在堆内存中都存储的有自己特有的成员变量.
静态变量:随着类的加载而加载,存储于共享区, 内存只有1份. 可以被所有对象所共享
static 修饰成员方法:静态方法
特有的使用方式:可以直接通过类名来调用.
注意:
  静态方法不能访问非静态成员变量.
  静态方法只能访问静态变量

本程序演示 this static 关键字

class  Person
{
    static String country = "CN"; //静态变量 或 类变量 实例变量
    private String name;    //成员变量
    private int age;
    Person(String name)
    {
        this.name=name;
    }
    Person(String name , int age)
    {
        this(name) ; // this代表当前对象(Person)进行初始化,因为只有一个参数,所以自动调用上面的Person构造函数。
        this.age = age;
    }
    public void speak()
    {
        
        System.out.println(country+":"+this.name+":"+this.age);  
    }
    public boolean compare(Person p)  //判断本对象与p对象是否age相同
    {
        return this.age==p.age;
    }
}
//加 this. 输出 001;0    不加输出 null:0
class  ThisDemo
{
    public static void main(String[] args) 
    {
        Person p1 = new Person("001",20);
        Person p2 = new Person("002",25);
        p1.speak();
        p2.speak();
        System.out.println(p1.compare(p2));
        System.out.println(Person.country); //静态数据可以直接用类名调用
    }
}
原文地址:https://www.cnblogs.com/myblog-cl/p/4748757.html