day10-java对象

java对象

1.构造方法

//类
package com.codesing;

public class Person {
    String name;
    int age;
    char sex;

    //构造方法,类里默认有个无参构造方法
    //显示定义构造器
    //1.使用new关键字,本质实在调用构造器
    public Person() {
        this.name = "xiaoming";
        this.age = 23;
        this.sex = 'M';
    }

    //有参构造
    //一旦定义有参构造,无参构造必须显示定义
    public Person(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}
//主方法
package com.codesing;

public class Application {
    public static void main(String[] args) {
        Person xiaoming = new Person();
        System.out.println(xiaoming.name+xiaoming.age+xiaoming.sex);
        Person xiaohong = new Person("xh", 20, 'W');
        System.out.println(xiaohong.name+xiaohong.age+xiaohong.sex);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6fBFVKRX-1615202142047)(C:\Users\23236\AppData\Roaming\Typora\typora-user-images\image-20200914165935895.png)]

构造器:1.同类名相同,2.没有返回值

作用:1.new本质调用构造器。2.初始化对象的值

注意点:定义有参构造后,如果使用无参构造,显示定义无参构造

2.创建对象内存分析

//pet类
public class pet{
    public String name;
    public int age;
    
    public void shout(){
        System.out.prinln("叫");
    }
}
//创建对象
Pet dog = new Pet();
dog.name = "旺财";
dog.age = 3;
dog.shout();

Pet cat = new Pet();
System.out.prinln(dog.name);
System.out.prinln(dog,age);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lpw5WeGS-1615202142049)(C:\Users\23236\AppData\Roaming\Typora\typora-user-images\image-20200917000406634.png)]

  1. 首先在堆中方法区加载Application类,里里面有main方法和常量
  2. 执行main方法,在栈里,new Pet()时加载Pet类
  3. 生成dog对象,引用变量名在栈,对象体在堆中,此时为无参构造(name:null,age:0)
  4. 给dog对象赋值,(dog.name=“旺财”,dog.age=3)
  5. cat同上。
  6. main()方法结束,弹出栈,程序结束。

静态方法static和类一起加载,在类中可直接使用,对象可以直接调用

3.封装

私有属性:get/set

1.提高程序安全性,保护数据

2.隐藏代买实现细节

3.同一接口

4增加可维护性

package com.codesing;
//Car类
public class Car {
    private String name;//属性私有private,new完对象.name或.price获取不到值
    private int price;

    //get 得到这个数据
    //set 给这个数据设置值
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {//这里可以做一些安全处理
        if (price > 5000000 || price <= 0) {
            this.price = 3;
        } else {
            this.price = price;
        }
    }

}
//主方法
Car car = new Car();
car.setName("法拉利");
System.out.println(car.getName());//法拉利
car.setPrice(-1);//3
System.out.println(car.getPrice());

4.继承

4.1 继承理解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PH9NnDJ-1615202142051)(C:\Users\23236\AppData\Roaming\Typora\typora-user-images\image-20200917200641009.png)]

package com.codesing;
//java中所有的类,都默认或间接或直接继承Object
public class Car /*extends Object*/{
    //public方法
    public void say(){
        System.out.println("Car类");
    }
    public int money = 10_0000_0000;

    //object

}
//子类
public class Falali extends Car {

}
//子类
public class Baoshijie extends Car {

    //ctrl+h------->继承树
}
//主方法
Falali fi = new Falali();
Baoshijie baoshijie = new Baoshijie();
//可调用父类方法和属性
fi.say();
System.out.println(fi.money);

baoshijie.say();
System.out.println(baoshijie.money);

//object
Object o = new Object();
System.out.println(o.getClass());//很多方法

4.2 super和this

子类拥有父类所有方法,私有的东西无法被继承。

super注意点

  1. super用来调用父类的(非私有)方法和属性
  2. super()调用父类构造器,且在子类构造器第1行
  3. super必须只能出现在子类的方法或构造方法中
  4. super和this不能同时调用构造方法

VS this

  1. 代表对象不同: this本身调用者这个对象。super代表父类对象的应用
  2. 前 提 : this无继承可使用。super只能在继承条件才可使用
  3. 构造 方法: this()本类的构造。super()父类的构造
package com.codesing;
//java中所有的类,都默认或间接或直接继承Object
public class Car /*extends Object*/{
    //protected
    protected  String name = "车子";
    public void print(){//私有的无法继承
        System.out.println("父类车子");
    }

}
//子类
public class Falali extends Car {
    String name = "法拉利";
    public void print(){
        System.out.println("子类车子");
    }
    public void test(String name){
        System.out.println(name);//保时捷
        System.out.println(this.name);//法拉利
        System.out.println(super.name);//车子
    }
     public void test1(){
        print();//子类车子
        this.print();//子类车子
        super.print();//父类车子
    }
}
package com.codesing;
//java中所有的类,都默认或间接或直接继承Object
public class Car /*extends Object*/{

    public Car(){
        System.out.println("Car无参构造");
    }

}

public class Falali extends Car {
    String name;
    public Falali(){//子类构造器和父类构造器不能同时调用
        //隐藏调用父类构造器 super();
        super();//调用父类构造器必须在子类构造器第一行。
                //调用子类构造器也必须在第一行。
        this("法拉利");//Call to 'this()' must be first statement in constructor body
        System.out.println("Falali无参构造");
    }
    public Falali(String name){
        this.name = name;
    }
}
//主方法
 Falali falali = new Falali();
    //Car无参构造-------》子类构造器隐藏调用super()
    //Falali无参构造

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M26Kx8Vw-1615202142054)(C:\Users\23236\AppData\Roaming\Typora\typora-user-images\image-20200917204436157.png)]

父类有参构造,子类无参写不了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPZUYNOP-1615202142057)(C:\Users\23236\AppData\Roaming\Typora\typora-user-images\image-20200917204735270.png)]

父类有参构造,子类想无参,必调父类有参构造。

5. 重写

1.前提:需要有继承关系,子类重写父类的方法

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 都是方法重写,与属性无关
  4. 修饰符:范围可以扩大,public>protected>default>private
  5. 抛出异常:范围,可以被缩小,但不能被扩大:ClassNotfoundException–>Exception(大)

2.重写:子类的方法和父类必须一致:方法体不同!

3.为什么重写:

​ 父类功能,子类不一定需要,或者不一定满足

​ 快捷键:alt+insert:override

/*
静态方法: 方法调用只和左边,定义的数据类型有关
非静态方法:才叫重写
只能重写父类public() 或protected()方法
*/

package com.codesing;
//父类B
public class B {
    public static void test(){
        System.out.println("B=>test");
    }
}
//子类A
public class A extends B {

    public static void test(){
        System.out.println("A=>test");
    }
}
//
public class Application {
    public static void main(String[] args) {
        //方法调用只和左边,定义的数据类型有关
        A a = new A();
        a.test();  //A=>test
        //父类的引用指向子类
        B b = new A();
        b.test();  //B=>test
    }
}

package com.codesing;
//
public class B {
    public  void test(){
        System.out.println("B=>test");
    }
}
//加上注解@Override
public class A extends B {
    @Override//注解,重写
    public void test() {
        System.out.println("A=>test");
    }
}
//去点static后
public class Application {
    public static void main(String[] args) {
        A a = new A();
        a.test();//A=>test
        
        //父类的引用指向子类
        B b = new A();//子类重写父类方法
        b.test();//A=>test
    }
}

6.多态

1.注意事项

​ .多态是方法的多态,属性没有多态

​ .父类和子类,有联系,类型转换异常ClassCastException

​ .存在条件:继承关系,方法需要重写。父类引用指向子类对象!Father f1 = new Son();

2.不能重写

. static 方法,属于类,不属于实例

. final 常量

. private 方法:

package com.codesing;

//java中所有的类,都默认或间接或直接继承Object
public class Car {

    public void run(){
        System.out.println("Car is run.......");
    }
}
//子类
public class Falali extends Car {
    @Override
    public void run() {
        System.out.println("Falali is run...");
    }
    public void say(){
        System.out.println("Falali is say...");
    }
}

//子类重写父类方法,则调用子类的。
public class Application {
    public static void main(String[] args) {

        //一个对象实际类型确定的
        //new Car()
        //new Falali()

        //可以指向的引用类型不确定,父类引用指向子类
        //Car:父类型,可以指向子类,但不能调用子类独存方法
        Car falali_0 = new Falali();
        //Falali:能调用自己的,和父类falali_0的方法
        Falali falali_1 = new Falali();
        Object falali_2 = new Falali();

        falali_1.run(); //Falali is run..
        falali_0.run(); //子类重写父类方法 Falali is run..

        //对象能执行哪些方法,主要看左边类型,右边没关系
        falali_1.say();//Falali is say...
        //falali_0.say();//报错,只能强转
        ((Falali) falali_0).say();//Falali is say...
    }
}

/*
 *    
 *     多态的成员特点:
 *         成员变量  编译时看的是左边,运行时看的左边
 *         成员方法  编译时看的是左边,运行时看右边
 *         静态方法  编译时看的是左边,运行时看的也是左边
 * 
 * 
 * 编译时看的都是左边,运行时成员方法看的是右边,其他(成员变量和静态的方法)看的都是左边
 * 
 */
public class PoymorphicDemo2 {
    public static void main(String[] args) {
        Dad d = new Kid();
        //System.out.println(d.num);
        
        //d.method();
        d.function();//使用变量去调用静态方法,其实相当于用变量类型的类名去调用
    }
}
 
class Dad {
    int num = 20;
    
    public void method() {
        System.out.println("我是父类方法");
    }
    
    public static void function() {
        System.out.println("我是父类静态方法");
    }
}
 
class Kid extends Dad {
    int num = 10;
    
    public void method() {
        System.out.println("我是子类方法");
    }
    
    public static void function() {
        System.out.println("我是子类静态方法");
    }
}

7.instanceof和类型转换

  1. instanceof(类型转换) 引用类型,判断一个对象是什么类型
  2. instaceof 判断两个类之间是否存在父子关系。有ture,无false
// 公式:System.out.println(x instanceof y) ------>看x指向的实际类型跟y是否存在父子关系

//Object-Person-Teacher
//Object-Person-Student
//Object-String
Object object = new Student();
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person);//true
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof String);//false
System.out.println("=== ====== =========== ====");

Person person = new Student();
System.out.println(person instanceof Student);//true
System.out.println(person instanceof Person);//true
System.out.println(person instanceof Teacher);//false
//System.out.println(person instanceof String);//编译报错
System.out.println("=== ====== =========== ====");


//类型之间的转换:父 <--->子
//子类转换为父类,可能会丢失自己的一些方法
Person person = new Student();//低-->高
((Student) person).eat();//高-->低:强转

Student student = new Student();//低-->高
student.eat();
Person person1 = student;//子类转父类
((Student) person1).eat();//这时丢失了自己eat()方法,只能强转
}

stem.out.println(person instanceof Person);//true
System.out.println(person instanceof Teacher);//false
//System.out.println(person instanceof String);//编译报错
System.out.println("=== ====== =========== ====");


```java
//类型之间的转换:父 <--->子
//子类转换为父类,可能会丢失自己的一些方法
Person person = new Student();//低-->高
((Student) person).eat();//高-->低:强转

Student student = new Student();//低-->高
student.eat();
Person person1 = student;//子类转父类
((Student) person1).eat();//这时丢失了自己eat()方法,只能强转
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值