构造方法

什么是构造方法?

1.含义

构造方法是一种特殊的方法,他是一个与类同名且不需要返回值的方法
作用:当创建对象的时候进行调用,初始化成员变量属性
当类进行实例化对象的时候会自动调用构造方法
注意:
1.构造方法也可以重载
2.如果没有构造方法,系统会提供一个默认的无参构造方法
3.如果没有显示的写出无参构造方法,而有一个有参构造,有参构造会把无参构造覆盖

1.1形式

可以有参,也可以无参

修饰符  类名(参数列表){
	代码...
}
		package day02;
	
		public class constructionDemo {
		String name;
		int age;
		public constructionDemo() {
			
		}
		public constructionDemo(String name,int age) {
			this.name=name;
			this.age=age;
		}
		
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
		public static void main(String[] args) {
			constructionDemo cd =new constructionDemo();
			System.out.println(cd.name);
			System.out.println(cd.age);
			
			constructionDemo cd1 =new constructionDemo("张三",18);
			System.out.println(cd1.name);
			System.out.println(cd1.age);
			
			constructionDemo cd2=new constructionDemo();
			cd2.setName("李四");
			cd2.setAge(20);
			System.out.println(cd2.name);
			System.out.println(cd2.age);
			
		}
		
	
	}

this 关键字

2.含义

this代表本类对象的一个引用对象
构造函数中,this()方法要放在第一行

	package day02;
	//this演示
	public class Animal {
	String name;
	
	public static void main(String[] args) {
		Animal a=new Animal();
		a.run("大黄");
		System.out.println(a.name);
	}
//	public void run(String n) {
//		name=n;		
//	}

	public void run(String name) {
		
		name=name;
		
	}

}

作用:当局部变量和成员变量同名时,用来区分
如果附近有同名变量,会遵守就近原则相当于局部变量给局部变量赋值
name=name; 除非使用this关键字

2.1 构造方法之间的调用

package day02;
//this演示2
public class dog {
	public dog() {
		this("旺财");
	}

	public dog(String name) {
		System.out.println(name);
	}
	public static void main(String[] args) {
		dog d=new dog();
		
	}
	
}

3. 继承

继承是面向对象的一大特征(封装,继承,多态)
继承指的是从已有的类中派生出新的类,新的类能吸收已有的类的数据属性和行为
并从之前的基础上扩展出新的能力

3.1 继承的特点

1.使用extends关键字进行继承
2.相当于将父类的功能 复制了一份
3.java中继承存在着单一性,也就是单一继承
4.继承存在着传递性
5.继承不能继承父类的私有属性
6.继承主要是用于功能的扩展

package day02;

public class inheritDemo {
	public static void main(String[] args) {
		zi z=new zi();
		System.out.println(z.name);
		System.out.println(z.addr);
		z.sing();
		//z.age
		fu f=new zi();
		f.eat();
	}

}
class fu{
	private int age=18;
	String name="黄种人";
	String addr="成都";
	public void sing() {
		System.out.println("和我在成都的街头走一走");
	}
	void eat() {
		System.out.println("爸爸吃饭了");
	}
	
}
class zi extends fu{
	public void eat() {
		System.out.println("儿子吃饭了");
	}
}

注意:
父类的所有功能都能继承过来,除了私有的。(每个人都有点小秘密)
父类的私有属性不能被重写

3.2 Super用法

super英文翻译过来是向上,即代表父类的引用对象

package day02;
//Super的演示
public class superDemo {
	public static void main(String[] args) {
		B b=new B();
		
		
	}
}
class A{
	public A() {
		System.out.println("A的无参构造方法");
	}
}
class B extends A{
	public B() {
		super();
		System.out.println("B的无参构造方法");
	}
	
}

3.3 this和super的区别

1.this指代的是本类对象的引用 super指代的是父类对象的引用
2.this是用于区别局部变量和成员变量
3.super是用于区别本类变量和父类变量
4.this和super不能出现在同一个构造函数中,因为他俩都得放在构造函数的第一行,到底先放哪个?

4.static

含义:static是一个java中的关键字
修饰成员(成员变量和成员方法)

特点:
1.可以修饰成员变量和成员方法
2.随着类的加载而加载,优先对象进行加载
3.只加载一次,就会一直存在,不再开辟新的空间
4.全局唯一,全局共享
5.可以直接通过类名调用
6.静态的只能调用静态的,非静态的可以随意调用
7.static不能与this和super一起使用,因为有static时可能还没有对象

package day02;

public class staticDemo {
	static {
		System.out.println(111);
	}
	public static void main(String[] args) {
		//优于对象加载有没有对象都有static
		int i=Student.age;
		System.out.println(i);
		
		Student s=new Student();
		Student s1=new Student();
		
		System.out.println(s.name);
		System.out.println(s.age);
		System.out.println("-----------");
		System.out.println(s1.age);
		s1.age=20;
		System.out.println(s.age);
		
//		s.eat();
//		s.speak();
		
		
	}

}
class Student{
	String name="张三";
	static int age=18;
	public void eat() {
		System.out.println("eat...");
	}
	public static void speak() {
		System.out.println("speak...");
	}
}

在这里插入图片描述

4.1 静态调用关系

静态的只能调用静态的东西(变量或方法)非静态的可以访问所有的不管是不是静态的

package day02;

public class Teacher {
	String name="张三";
	static int age=30;
	public void speak() {
		 System.out.println(age);//非静态能调用静态变量
         System.out.println(name);//非静态能调用非静态变量

	}
	public static void run() {
		System.out.println(age);//静态能调用静态
		System.out.println(name);//静态不能调用非静态变量,只能调用静态变量
//      speak();//静态不能调用非静态方法,只能调用静态方法
	}
	public static void main(String[] args) {
		Teacher t=new Teacher();
		
	}

}

4.2 静态代码块

随着类的加载而加载,并且只被加载一次,一般用于项目的初始化
static{…}

5. final

概念

  1. 是java提供的一个关键字
  2. final是最终的意思
  3. final可以修饰类,方法,成员变量

特点
1、 被final修饰的类,不能被继承
2、 被final修饰的方法,不能被重写
3、 被final修饰的变量是个常量,值不能被更改
4、 常量的定义形式: final 数据类型 常量名 = 值

//final的演示
public class FinalDemo {
	public static void main(String[] args) {
		
	}
}

//演示final修饰类
final class Hoo{}
//class Ioo extends Hoo{} //编译错误,final的类不能被继承
class Joo{}
final class Koo extends Joo{} //正确,不能当老爸,但能当儿子


//演示final修饰方法
class Foo{
	final void show() {}
	void test() {}
}
class Goo extends Foo{
	//void show() {} //编译错误,fianl的方法不能被重写
	void test() {}
}


//演示final修饰变量
class Eoo{
	final int num = 5;
	void show() {
		//num = 8; //编译错误,final的变量不能被改变
	}
}

6.访问控制修饰符:-------------保护数据的安全

1)public:公开的,任何类
2)private:私有的,本类
3)protected:受保护的,本类、派生类、同包类
4)默认的:什么也不写,本类、同包类
说明:
1)类的访问修饰符只能是public或默认的
2)类中成员的访问修饰符如上4种都可以

public class Aoo {
	public int a;     //任何类
	protected int b;  //本类、派生类、同包类
	int c;            //本类、同包类
	private int d;    //本类
	
	void show() {
		a = 1;
		b = 2;
		c = 3;
		d = 4;
	}
}

class Boo{   //演示private
	void show() {
		Aoo o = new Aoo();
		o.a = 1;
		o.b = 2;
		o.c = 3;
		//o.d = 4; //编译错误
	}
}
package oo.day05.vis;
import oo.day05.Aoo;
public class Coo {    //演示同包的
	void show() {
		Aoo o = new Aoo();
		o.a = 1;
		//o.b = 2; //编译错误
		//o.c = 3; //编译错误
		//o.d = 4; //编译错误
	}
}

class Doo extends Aoo{ //跨包继承----演示protected
	void show() {
		a = 1;
		b = 2;
		//c = 3; //编译错误
		//d = 4; //编译错误
	}
}

7.抽象类

概念:
Java中可以定义没有方法体的方法,该方法由其子类来具体的实现。该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类。
抽象类可以理解为是一个只有方法声明没有方法体的特殊类。
举例:水果,东西。。

修饰符 abstract 返回值 方法名(参数列表);
 
class A{
       public void eat(){//声明一样,可以提取
              syso("eat...B")    }
}
class B{
       public void eat(){//声明一样,可以提取
       syso("eat。。。A")   }
}            
abstract class C{
              public abstract void eat();
}

特点:
1、 通过java关键字abstract实现
2、 可以修饰方法或者类
3、 抽象类中可以没有抽象方法(由子类去实现)
4、 如果类中有抽象方法,那该类必须定义为一个抽象类
5、 子类继承了抽象类以后,要么还是一个抽象类,要么就把所有抽象方法都重写
6、 多用于多态中
7、 抽象类不可以被实例化

package day009;
 
public class Test1_Animal {
       public void eat(){
              System.out.println("吃饭饭");
       }
}
/*
 * 每种动物都需要吃,
 * 发现了,方法声明都一样,只是方法体不一样
 *
class Dog extends Test1_Animal{
       public void eat(){
              System.out.println("狗吃肉");
       }
}
 
class Cat extends Test1_Animal{
       public void eat(){
              System.out.println("猫吃鱼");
       }
}*/
 
//上面的eat()声明都一样,就是方法体不一样,那就只抽取方法声明部分。
//The type Animal must be an abstract class to define abstract methods
 abstract class Animal extends Object{
        //This method requires a body instead of a semicolon
       public abstract  void eat();
}
 
 //继承抽象类,并实现抽象方法
//The type Dog must implement the inherited abstract method Animal.eat()
abstract class Dog extends Animal{
     //可以实现抽象方法,也可以子类再变成一个抽象类
}
 
class Cat extends Animal{
       public void eat() {
              System.out.println("猫吃鱼");
       }
      
}

7.1 抽象类的用法

7.1.1 构造函数

抽象类也有构造方法,但是不能本身实例化。
那抽象类的构造函数有啥用?一般用于给子类实例化

package day009;
 
//抽象类的构造方法
public class Test2_Animal2 {
 
}
abstract class Animal2{
       //抽象类可以有构造方法,但是无法实例化
       //用于子类实例化
       public Animal2(){
              System.out.println("fu..Animal2()");
       }
}
class Zi2 extends Animal2{
      
}
 
class TestAnimal2{
       public static void main(String[] args) {
//           Animal2 a2 = new Animal2();//抽象类无法实例化   
//           Zi2 z=new Zi2();//创建子类实例化对象
 
              Animal2 a2 = new Zi2();//抽象类多用于多态    
       }
}
7.1.2 抽象类的成员变量

既可以有变量,也可以有常量。

package day009;
//成员变量
public class Test3_Animal3 {
 
      
}
 
abstract class Animal3{
       //String name;  //1
       //String name="大黄";  //2
       private String name="大黄";  //3
       public final int age=10;
      
       //3.1如果是私有变量想要取值,就提供getXxx()
       public String getName(){
              return name;
       }
}
 
class Zi3 extends Animal3{
      
}
 
class Test3Demo{
       public static void main(String[] args) {
              Animal3 a = new Zi3();//抽象类多用于多态
              //System.out.println(a.name());  //1或者2
              System.out.println(a.getName());  //3
              System.out.println(a.age);
             
       }
}
7.1.3 抽象类的成员方法

抽象类里,既可以有普通方法,有可以有抽象方法。

package day009;
//成员方法
public class Test4_Animal4{
}
 
abstract class Animal4{
       //抽象类中的普通方法
       public void speek(){
              System.out.println("fu...speak()");
       }
       //抽象类里的抽象方法
       public abstract void study();
}
 
class Zi4 extends Animal4{
       //重写抽象方法
       public void study(){
              System.out.println("zi...study()");
       }
}
 
class Zi4Test{
       public static void main(String[] args) {
              Zi4 z= new Zi4();
              z.speek();//fu...speak()
              z.study();//zi...study()
       }
}

8. 接口

8.1概念

Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。
Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。OOP面向对象的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类这些太有用的抽象类型做为java结构层次上的顶层。
interface 接口名{ 代码… }

8.2 特点

1、 接口中都是抽象方法
2、 通过interface关键字创建接口
3、 通过implements让子类来实现
4、 可以理解成,接口是一个特殊的抽象类
5、 接口突破了java的单继承的局限性
6、 接口和类之间可以多实现,接口和接口之间可以多继承
7、 接口是对外暴露的规则,是一套开发规范
8、 接口提高了程序的功能扩展,降低了耦合性

入门案例:

package day9999;
public class T {
       public static void main(String[] args) {
              Zi z = new Zi();
              z.study();
              z.teach();
       }
}
interface Fu{
       public abstract void study();
       public abstract void teach();
}
//实现+重写
class Zi implements Fu{
       public void study(){
              System.out.println("Zi..study()");
       }
       public void teach(){
              System.out.println("Zi..teach()");
       }
}

8.3 接口的用法

8.3.1 构造方法

接口里是没有构造方法的。
在创建实现类的对象时默认的super(),是调用的默认Object的无参构造。

interface Fu{//定义一个接口
       public abstract void show();
       //Interfaces cannot have constructors
       /*public Fu(){
              System.out.println("Fu.Fu()");
       }*/
}
8.3.2 成员变量

接口里没有成员变量,都是常量。所以,你定义一个变量没有写修饰符时,默认会加上:
public static final

package day009;
//构造函数,成员方法,成员变量
public interface Test7_Fu {
 
}
interface Fu2{//定义一个接口
      
       //int num=10;//1,成员变量
       //static int num=10;//2,默认就是静态的
       //final static int num=10;//3,默认就是final的
       public final static int num=10;//4,默认就是public的
 
class Zi7 implements Fu2{
 
}
 
class Test7Demoo{
       public static void main(String[] args) {
              Zi7 z= new Zi7();
              //The final field Fu2.num cannot be assigned
              //z.num=30;//默认是final的,不能修改值
              System.out.println(z.num);
              System.out.println(Fu2.num);
       }
}
8.3.3 接口的成员方法

接口里的方法,默认就都是抽象的,如果你不写明是abstract的,那会自动补齐。
例如:abstract void save

8.3.4 接口和抽象类的区别

1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
7、抽象类里可以没有抽象方法,如果要扩展抽象类的新方法,子类将很容易的就能得到这些新方法。
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值