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)]
- 首先在堆中方法区加载Application类,里里面有main方法和常量
- 执行main方法,在栈里,new Pet()时加载Pet类
- 生成dog对象,引用变量名在栈,对象体在堆中,此时为无参构造(name:null,age:0)
- 给dog对象赋值,(dog.name=“旺财”,dog.age=3)
- cat同上。
- 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注意点
- super用来调用父类的(非私有)方法和属性
- super()调用父类构造器,且在子类构造器第1行
- super必须只能出现在子类的方法或构造方法中
- super和this不能同时调用构造方法
VS this
- 代表对象不同: this本身调用者这个对象。super代表父类对象的应用
- 前 提 : this无继承可使用。super只能在继承条件才可使用
- 构造 方法: 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.前提:需要有继承关系,子类重写父类的方法
- 方法名必须相同
- 参数列表必须相同
- 都是方法重写,与属性无关
- 修饰符:范围可以扩大,public>protected>default>private
- 抛出异常:范围,可以被缩小,但不能被扩大: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和类型转换
- instanceof(类型转换) 引用类型,判断一个对象是什么类型
- 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()方法,只能强转
}