1 面向对象概述
所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的执行者变成了指挥者,面向对象是基于面向过程而言的。
我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)
三大特征
- 封装性:把相关的数据封装成一个“类”组件
- 继承性:是子类自动共享父类属性和方法,这是类之间的一种关系
- 多态:增强软件的灵活性和重用性
1.1 类与对象
Java语言最基本单位就是类,类似于类型,类是一类事务抽象的介绍。
对象是类的实例化。类似于,类是设计模板,对象是根据模板制造的具体东西。
对象的特征:特征、属性、标识。
public static void main(String[] args) {
//创建对象,利用关键词new,调用类里的特征+行为
phone p =new phone();//创建并使用
//对象对类里 属性+方法进行调用
p.call();
System.out.println(p.size);
}
//创建了一个phone 类 ---用来描述特征+行为
class phone{
//定义特征
//类的成员变量/属性,在方法外创建;
String size;
double price;
//创建方法 :修饰词 返回值 (参数列表){方法体}
public void call() {
System.out.println("正在打电话");
}
}
1.2 构造方法
概述:创建对象时自动调用构造方法
作用:
1、创建对象的创建(调用方法)。
2、创建对象时对成员变量的初始化(成员变量赋值)。
形式:
//可以无参也可以有参
修饰符 类名(【参数】){
代码……
}
创建构造方法:
class person{
String name;
int age;
//如果没有设置无参构造,无参构造会被含参构造覆盖,则无法使用
//默认无参的构造方法
public person() {
System.out.println("无参构造");
}
//含参构造
public person(String n) {
name=n;//利用含参构造直接赋值
System.out.println("含参构造"+n);
}
//全参赋值
public person(String n,int m) {
name=n;
age=m;
}
}
通过构造方法创建对象;
通过含参构造方法完成对象初始化;
person p =new person();//每次new时,都会调用构造方法里的内容
person p2 =new person("张三");//2、创建对象,会调用含参构造
person p3=new person("李四",20);//全参赋值
总结:
1,构造方法触发的时间点,,需要new来触发,不会自动执行。
2,构造方法可以重载,为了方便各种new,提高程序的灵活性。
3,构造方法在创建对象时会自动执行。
注意:
如果没提供无参构造,只提供了含参构造,无参构造会被覆盖,所以无参构造需提供;
1.3 重载(overload)
在一个类中,方法名都一样,但是参数列表(参数类型,数量等)不同的情况称为重载。
package cn.tedu.methd;
//是指在一个类里发生的现象
//方法名都一样add,但是,参数列表不同
public class Test4_Overload {
public static void main(String[] args) {
long a = add(1,2);
add(1,2,"jack");
}
public static long add(long a ,int b) {
return a+b; //结束方法
}
//+可以用作加法也可以拼接
public static void add(int a,int b,String c) {
System.out.println(a+b+c);
}
}
2 封装
通过private关键,实现封装;为了提高程序的安全性,不让外界随意获取或者修改。
用private修饰变量和方法:
//创建一个student类,用来存储属性+行为/方法
class student{
//属性--成员变量
int sno;
private String name;//成员变量被private
//设置公共的修改方式---setXxx()
public void setName(String n) {
name = n;
}
//设置公共的查看方式---getXxx()
public String getName() {
return name;
}
//方法--成员方法
//1、被privatex修饰,代表被私有化,只能在本类里使用
private void call(){
System.out.println("正在打电话");
}
public void eat() {
System.out.println("正在吃饭");
}
}
类外调用访问:
被private的变量,可以使用set和get方法初始化和访问。
public static void main(String[] args) {
//用new创建一个对象
student s =new student();
//赋值
//s.name="张三";//2、被private,无法使用
s.setName("李四");//调用setName,进行初始化
s.sno=90;
//System.out.println(s.name);//2、被private,无法使用
System.out.println(s.getName());
System.out.println(s.sno);
//调用功能
//s.call();1、资源被private,无法调用
s.eat();
}
3 继承
概念:
使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类/超类/基类。
作用:
提高代码的复用性,减少代码的编辑,提高开发效率。
特点:
- 使用extends关键字,子类把父类的功能复制了一份。
- Java只支持单继承,可以传递,不能继承多个父类。
- 不能继承父类的私有成员和构造方法。
- 继承多用于功能修改-重写,子类拥有父类的功能的同时,也可以功能拓展。
package text.oop;
//测试继承extends的使用
public class Test6_Extends {
public static void main(String[] args) {
new Dog().eat();
new Dog().sleep();//6,除了能用父类的功能,也可以进行功能拓展
new Cat().sleep();//4,继承传递
}
}
//1,创建父类--提取子类的共性--提高代码的复用性
class Animal{
public Animal(){}
//父类的私有成员不能被继承
private int age;
public void eat() {
System.out.println("啥都吃");
}
}
//2,创建子类,Dog类--子类想拥有父类的功能--需要发生继承关系--强耦合(不提倡)
class Dog extends Animal{
//3,相当于把父类的功能复制了一边
public void sleep() {
int name = 20;
super.eat();
System.out.println("睡觉");
}
}
//4,创建子类,Cat类--继承可以传递
class Cat extends Dog{
}
重写(override)
概念:在继承中,当子类的功能和父类不一致时,子类可进行重写,针对继承的方法进行修改。
要求:发生在继承中,子类的方法声明和父类的必须一致。
方法声明([修饰符1 修饰符2...] 返回值类型 方法名(形参列表)(代码))
注意:
- 父类中的私有方法不能被重写。
- 子类重写父类方法时,修饰符要大于等于父类修饰符的权限。
继承中成员变量的继承:
package test.oop;
//测试继承的使用super--成员变量
public class Test1_extends {
public static void main(String[] args) {
new Dog().call();
}
}
//创建父类
class Animal{
int count =50;
int age = 30;
}
//创建子类
class Dog extends Animal{
int num;
int age =10;//创建成员变量
public void call() {
int age =20;//创建局部变量
System.out.println(age);//20,就近原则
System.out.println(num);//0,使用了默认值
System.out.println(this.age);//10,this调用本类的成员变量
System.out.println(super.count);//50,继承了父类的成员变量
//1,super代表父类对象的引用,可以在子类中调用父类的成员变量
//2,相当于super创建了一个新对象
System.out.println(super.age);//30,用了父类的
// Animal super = new Animal();
// System.out.println(super.age);
}
}
继承中成员方法的继承:
package test.oop;
//测试继承中super的使用---成员方法
//1,子类 继承父类的方法们--可以直接使用
//2,子类 自行扩展--可以拓展
//3,子类 可以修改继承来的方法--方法的重写
//4,需要改时才重写
public class Test2_extends2 {
public static void main(String[] args) {
new Zi2().eat();
new Zi2().study();
new Zi2().sleep();
}
}
//创建父类
class Fu2{
public void eat() {
System.out.println("父类吃");
}
public void study() {
System.out.println("父类学");
}
}
//创建子类,继承Fu2
class Zi2 extends Fu2{
//3,方法的重写
//要求:继承+子类的方法声明和父类的必须一致
//方法声明([修饰符1 修饰符2...] 返回值类型 方法名(形参列表)(代码))
public void eat() {
//3.1,调用父类原来的eat()--重写并不影响父类的原有功能
// super.eat();
System.out.println("子类吃");
}
public void study() {
System.out.println("子类学");
}
public void sleep() {//2,自行拓展
System.out.println("子类睡");
}
}
继承中构造方法的继承:
package test.oop;
//测试继承的构造方法
//总结:
//1,在子类的构造方法中,会隐藏这一行代码super()--调用父类的无参构造
//2,当创建子类对象时,会调用父类的构造方法,先执行父类的,再执行子类的
public class Test3_Extends3 {
public static void main(String[] args) {
new Zi3();//会先去执行父类的无参构造,再执行自己的
}
}
//创建父类
class Fu3{
public Fu3() {
System.out.println("父类的无参构造");
}
public Fu3(int a) {
System.out.println("父类的含参构造"+a);
}
}
//创建子类,继承Fu3
class Zi3 extends Fu3{
public Zi3() {
//1,在子类的构造方法中,会隐藏这一行代码super()--
// super();//会自动执行父类的无参构造--如果父类不提供无参构造会报错
// super(5);//调用父类的含参构造--出现在构造方法里时,位置必须是第一行代码
System.out.println("子类的无参构造");
}
}
4 多态
概述:多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。
好处:
1,做出通用编程,本质上就是不关心具体的子类的类型,屏蔽了子类之间的不同,可以把子类当作父类来看。
2,提高了程序的扩展性和可维护性。
作用:
多态的运用,提供了统一的调用标准--向父类看齐,功能向父类加,通用的功能向上提取,形成父类。
特点:
1,前提:1,发生继承关系,,2,发生重写
2,父类引用指向子类对象,如Animal a = new Dog( ) ;
3,编译(Ctrl +s)看左边,运行(Ctrl +F11)看右边
package test.oop;
//测试 多态的使用
//静态资源不存在重写,谁调用用谁的
public class Test8_DuoTai2 {
public static void main(String[] args) {
//创建多态对象 --- 父类引用 指向 子类对象
Fu4 fu = new Zi4();
//编译看左边,运行看右边
System.out.println(fu.name);//成员变量用谁的?---父类的
//多态中,方法声明用---父类的,,方法体用---子类的(因为重写了)
fu.show();//成员方法用谁的?---子类的(重写了)
fu.test();//成员方法用谁的?---父类的(没重写)
}
}
class Fu4{
String name = "赵的.四";
public void show() {
System.out.println("Fu4....show()");
}
final public void test() {
System.out.println("Fu4......test()");
}
}
class Zi4 extends Fu4{
String name = "巴巴";
public void show() {
System.out.println("Zi4....show()");
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。